diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..368251f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,35 @@ +# Include any files or directories that you don't want to be copied to your +# container here (e.g., local build artifacts, temporary files, etc.). +# +# For more help, visit the .dockerignore file reference guide at +# https://docs.docker.com/go/build-context-dockerignore/ + +**/.DS_Store +**/__pycache__ +**/.venv +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose.y*ml +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md +**/lib \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..17bddc7 --- /dev/null +++ b/.env.example @@ -0,0 +1,23 @@ +# EOA that holds the gas that should be used for liquidation +LIQUIDATOR_EOA=0x0001 +LIQUIDATOR_PRIVATE_KEY=0x0002 + +# RPC URL +RPC_URL=https://example.rpc.url.com + +# Relevant API keys +API_KEY_1INCH=api_key + +### OPTIONAL ### + +# Slack webhook URL for sending notifications +SLACK_WEBHOOK_URL="https://hooks.slack.com/services/SLACK_KEY" + +# URL for the liquidation UI, if including in the slack notification +RISK_DASHBOARD_URL="http://127.0.0.1:8080" + +# Accounts that are only used for running the test/LiquidationSetupWithVaultCreated.sol test file for setting up vaults +DEPOSITOR_ADDRESS=0x0003 +DEPOSITOR_PRIVATE_KEY=0x0004 +BORROWER_ADDRESS=0x0005 +BORROWER_PRIVATE_KEY=0x0006 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..9282e82 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,34 @@ +name: test + +on: workflow_dispatch + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Run Forge build + run: | + forge --version + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f574fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ +broadcast/ + +# Docs +docs/ + +# Dotenv file +.env +.env_local +.copy_env +.vscode +lcov.info + +# Virtual env +python-venv/ +venv/ + +# Logs and save state +logs/ +state/ + +# Python cache files +__pycache__/ +*.pyc +*.pyo +*.pyd + +/redstone_script/node_modules \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..888d42d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ee4cc52 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,58 @@ +# syntax=docker/dockerfile:1 + +ARG PYTHON_VERSION=3.12.5 +FROM 310118226683.dkr.ecr.eu-west-1.amazonaws.com/python:${PYTHON_VERSION} as base + +# Copy the project files +COPY . . + +# Initialize git repository +RUN git init && \ + git add -A && \ + git commit -m "Initial commit" + +# Manually clone submodules +RUN mkdir -p lib/forge-std && \ + git clone https://github.com/foundry-rs/forge-std.git lib/forge-std + +# Run Forge commands +RUN forge install --no-commit +RUN forge update +RUN forge build + +# Create a non-privileged user +ARG UID=10001 +RUN adduser \ + --disabled-password \ + --gecos "" \ + --home "/nonexistent" \ + --shell "/sbin/nologin" \ + --no-create-home \ + --uid "${UID}" \ + appuser + +RUN mkdir -p /app/logs /app/state + +# Install Python dependencies +RUN --mount=type=cache,target=/root/.cache/pip \ + --mount=type=bind,source=requirements.txt,target=requirements.txt \ + python -m pip install -r requirements.txt + +# Install NPM dependencies +WORKDIR /redstone_script +COPY redstone_script/package.json redstone_script/package-lock.json* ./ +RUN npm ci +WORKDIR / + +# Set correct permissions +RUN chown -R appuser:appuser /app && \ + chmod -R 755 /app && \ + chmod 777 /app/logs /app/state + +USER appuser + +EXPOSE 8080 + +# CMD ["python", "python/liquidation_bot.py"] +# Run the application +CMD ["gunicorn", "--bind", "0.0.0.0:8080", "application:application"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f949135 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Euler + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb7d328 --- /dev/null +++ b/README.md @@ -0,0 +1,150 @@ +# Euler Liquidation Bot + +Bot to perform liquidations on the Euler platform. [Liquidation docs.](https://docs.euler.finance/euler-vault-kit-white-paper/#liquidation) + +## How it works + +1. **Account Monitoring**: + - The primary way of finding new accounts is [scanning](app/liquidation/liquidation_bot.py#L950) for `AccountStatusCheck` events emitted by the EVC contract to check for new & modified positions. + - This event is emitted every time a borrow is created or modified, and contains both the account address and vault address. + - Health scores are calculated using the `accountLiquidity` [function](app/liqiudation/liquidation_bot.py#L101) implemented by the vaults themselves. + - Accounts are added to a priority queue based on their health score with a time of next update, with low health accounts being checked most frequently. + - EVC logs are batched on bot startup to catch up to the current block, then scanned for new events at a regular interval. + +2. **Liquidation Opportunity Detection**: + - When an account's health score falls below 1, the bot simulates a liquidation transaction across each collateral asset. + - The bot gets a quote for how much collateral is needed to swap into the debt repay amount, and simulates a liquidation transaction on the Liquidator.sol contract. + - Gas cost is estimated for the liquidation transaction, then checks if the leftover collateral after repaying debt is greater than the gas cost when converted to ETH terms. + - If this is the case, the liquidation is profitable and the bot will attempt to execute the transaction. + +3. **Liquidation Execution - [Liquidator.sol](contracts/Liquidator.sol)**: + - If profitable, the bot constructs a transaction to call the `liquidateSingleCollateral` [function](contracts/Liquidator.sol#L70) on the Liquidator contract. + - The Liquidator contract then executes a batch of actions via the EVC containing the following steps: + 1. Enables borrow vault as a controller. + 2. Enable collateral vault as a collateral. + 3. Call liquidate() on the violator's position in the borrow vault, which seizes both the collateral and debt position. + 4. Withdraws specified amount of collateral from the collateral vault to the swapper contract. + 5. Calls the swapper contract with a multicall batch to swap the seized collateral, repay the debt, and sweep any remaining dust from the swapper contract. + 6. Transfers remaining collateral to the profit receiver. + 7. Submit batch to EVC. + + + - There is a secondary flow still being developed to use the liquidator contract as an EVC operator, which would allow the bot to operate on behalf of another account and pull the debt position alongside the collateral to the account directly. This flow will be particularly useful for liquidating positions without swapping the collateral to the debt asset, for things such as permissioned RWA liquidations. + +4. **Swap Quotation**: + - The bot currently uses 1inch API to get quotes for swapping seized collateral to repay debt. + - 1inch unfortunatley does not support exact output swaps, so we perform a binary search to find the optimal swap amount resulting in swapping slightly more collateral than needed to repay debt. + - The bot will eventually have a fallback to uniswap swapping if 1inch is unable to provide a quote, which would also allow for more precise exact output swaps. + +5. **Profit Handling**: + - Any profit (excess collateral after repayment) is sent to a designated receiver address. + - Profit is sent in the form of ETokens of the collateral asset, and is not withdrawn from the vault or converted to any other asset. + +6. **Slack Notifications**: + - The bot can send notifications to a slack channel when unhealthy accounts are detected, when liquidations are performed, and when errors occur. + - The bot also sends a report of all low health accounts at regularly scheduled intervals, which can be configured in the config.yaml file. + - In order to receive notifications, a slack channel must be set up and a webhook URL must be provided in the .env file. + +## How the bot works + + +### Installation + +The bot can be run either via building a docker container or manually. In both instances, it runs via a flask app to expose some endpoints for account health dashboards & metrics. + +Before running either, setup a .env file by copying the .env.example file and updating with the relevant contract addresses, an EOA private key, & API keys. Then, check config.yaml to make sure parameters, contracts, and ABI paths have been set up correctly. + +#### Running locally +To run locally, we need to install some dependencies and build the contracts. This will setup a python virtual environment for installing dependencies. The below command assumes we have foundry installed, which can installed from the [Foundry Book](https://book.getfoundry.sh/). + +Setup: +```bash +foundryup +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +cd redstone_script && npm install && cd .. +forge install && forge build +cd lib/evk-periphery && forge build && cd ../.. +mkdir logs state +``` + +**Run**: +```bash +python flask run --port 8080 +``` +Change the Port number to whatever port is desired for exposing the relevant endpoints from the [routes.py](app/liquidation/routes.py) file. + +#### Docker +After creating the .env file, the below command will create a container, install all dependencies, and start the liquidation bot: +`docker compose build --progress=plain && docker compose up` + +This may require some configuration changes on the Docker image to a basic Python enabled container. + +### Configuration + +- The bot uses variables from both the [config.yaml](config.yaml) file and the [.env](.env.example) file to configure settings and private keys. +- The startup code is contained at the end of the [python/liquidation_bot.py](python/liquidation_bot.py#L1311) file, which also has two variable to set for the bot - `notify` & `execute_liquidation`, which determine if the bot will post to slack and if it will execute the liquidations found. + +Make sure to build the contracts in both src and lib to have the correct ABIs loaded from the evk-periphery installation + +Configuration through `.env` file: + +REQUIRED: +- `LIQUIDATOR_EOA, LIQUIDATOR_PRIVATE_KEY` - public/private key of EOA that will be used to liquidate + +- `RPC_URL` - RPC provider endpoint (Infura, Rivet, Alchemy etc.) + +- `API_KEY_1INCH` - API key for 1inch to help with executing swaps + +OPTIONAL: +- `SLACK_WEBHOOK_URL` - Optional URL to post notifications to slack +- `RISK_DASHBOARD_URL` - Optional, can include a link in slack notifications to manually liquidate a position +- `DEPOSITOR_ADDRESS, DEPOSITOR_PRIVATE_KEY, BORROWER_ADDRESS, BORROWER_PRIVATE_KEY` - Optional, for running + + +Configuration in `config.yaml` file: + +- `LOGS_PATH, SAVE_STATE_PATH` - Path directing to save location for Logs & Save State +- `SAVE_INTERVAL` - How often state should be saved + +- `HS_LOWER_BOUND, HS_UPPER_BOUND` - Bounds below and above which an account should be updated at the min/max update interval +- `MIN_UPDATE_INTERVAL, MAX_UPDATE_INTERVAL` - Min/Max time between account updates + +- `LOW_HEALTH_REPORT_INTERVAL` - Interval between low health reports +- `SLACK_REPORT_HEALTH_SCORE` - Threshold to include an account on the low health report + +- `BATCH_SIZE, BATCH_INTERVAL` - Configuration batching logs on bot startup + +- `SCAN_INTERVAL` - How often to scan for new events during regular operation + +- `NUM_RETRIES, RETRY_DELAY` - Config for how often to retry failing API requests + +- `SWAP_DELTA, MAX_SEARCH_ITERATIONS` - Used to define how much overswapping is accetable when searching 1Inch swaps + +- `EVC_DEPLOYMENT_BLOCK` - Block that the contracs were deployed + +- `WETH, EVC, SWAPPER, SWAP_VERIFIER, LIQUIDATOR_CONTRACT, ORACLE_LENS` - Relevant deployed contract addresses. The liquidator contract has been deployed on Mainnet, but feel free to redeploy. + +- `PROFIT_RECEIVER` - Targeted receiver of any profits from liquidations + +- `EVAULT_ABI_PATH, EVC_ABI_PATH, LIQUIDATOR_ABI_PATH, ORACLE_LENS_ABI_PATH` - Paths to compiled contracts + +- `CHAIN_ID` - Chain ID to run the bot on, Mainnet: 1, Arbitrum: 42161 + + +### Deploying + +If you want to deploy your own version of the liquidator contract, you can run the command below: + +```bash +forge script contracts/DeployLiquidator.sol --rpc-url $RPC_URL --broadcast --ffi -vvv --slow +``` + +To run the basic test script & broadcast to the configured RPC, modify the [LiquidationSetupWithVaultCreated.sol test](test/LiquidationSetupWithVaultCreated.sol) with the correct contract addresses and uncomment the various steps of setting up a position, then run the below commmand: + +```bash +forge script test/LiquidationSetupWithVaultCreated.sol --rpc-url $RPC_URL --broadcast --ffi -vvv --slow --evm-version shanghai +``` + +This test is intended to create a position on an existing vault. To test a liquitation, you can either wait for price fluctuations to happen or manually change the LTV of the vault using the create.euler.finance UI if it is a governed vault that you control. \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..8fbddb3 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,23 @@ +""" +Creates and returns main flask app +""" +from flask import Flask, jsonify +from flask_cors import CORS +import threading +from .liquidation.routes import liquidation, start_monitor + +def create_app(): + app = Flask(__name__) + CORS(app) + + @app.route("/health", methods=["GET"]) + def health_check(): + return jsonify({"status": "healthy"}), 200 + + monitor_thread = threading.Thread(target=start_monitor) + monitor_thread.start() + + # Register the rewards blueprint after starting the monitor + app.register_blueprint(liquidation, url_prefix="/liquidation") + + return app diff --git a/app/liquidation/__init__.py b/app/liquidation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/liquidation/liquidation_bot.py b/app/liquidation/liquidation_bot.py new file mode 100644 index 0000000..5bc6b67 --- /dev/null +++ b/app/liquidation/liquidation_bot.py @@ -0,0 +1,1690 @@ +""" +EVault Liquidation Bot +""" +import threading +import random +import time +import queue +import os +import json +import sys +import math +import subprocess + +from concurrent.futures import ThreadPoolExecutor +from typing import Tuple, Dict, Any, Optional + +from dotenv import load_dotenv +from web3 import Web3 +# from eth_abi.abi import encode, decode +# from eth_utils import to_hex, keccak + +from app.liquidation.utils import (setup_logger, + setup_w3, + create_contract_instance, + make_api_request, + global_exception_handler, + post_liquidation_opportunity_on_slack, + load_config, + post_liquidation_result_on_slack, + post_low_health_account_report, + post_unhealthy_account_on_slack, + post_error_notification, + get_eth_usd_quote, + get_btc_usd_quote) + +### ENVIRONMENT & CONFIG SETUP ### +load_dotenv() +API_KEY_1INCH = os.getenv("API_KEY_1INCH") +LIQUIDATOR_EOA = os.getenv("LIQUIDATOR_EOA") +LIQUIDATOR_EOA_PRIVATE_KEY = os.getenv("LIQUIDATOR_PRIVATE_KEY") + +config = load_config() + +logger = setup_logger(config.LOGS_PATH) +w3 = setup_w3() + +sys.excepthook = global_exception_handler + + +### MAIN CODE ### + +class Vault: + """ + Represents a vault in the EVK System. + This class provides methods to interact with a specific vault contract. + This does not need to be serialized as it does not store any state + """ + def __init__(self, address): + self.address = address + + self.instance = create_contract_instance(address, config.EVAULT_ABI_PATH) + + self.underlying_asset_address = self.instance.functions.asset().call() + self.vault_name = self.instance.functions.name().call() + self.vault_symbol = self.instance.functions.symbol().call() + + self.unit_of_account = self.instance.functions.unitOfAccount().call() + self.oracle_address = self.instance.functions.oracle().call() + + self.pyth_feed_ids = [] + self.redstone_feed_ids = [] + + def get_account_liquidity(self, account_address: str) -> Tuple[int, int]: + """ + Get liquidity metrics for a given account. + + Args: + account_address (str): The address of the account to check. + + Returns: + Tuple[int, int]: A tuple containing (collateral_value, liability_value). + """ + try: + balance = self.instance.functions.balanceOf( + Web3.to_checksum_address(account_address)).call() + except Exception as ex: # pylint: disable=broad-except + logger.error("Vault: Failed to get balance for account %s: %s", + account_address, ex, exc_info=True) + return (0, 0, 0) + + try: + # Check if vault contains a Pyth oracle + self.pyth_feed_ids, self.redstone_feed_ids = PullOracleHandler.get_feed_ids(self) + + if len(self.pyth_feed_ids) > 0: + logger.info("Vault: Pyth Oracle found for vault %s, " + "getting account liquidity through simulation", self.address) + collateral_value, liability_value = PullOracleHandler.get_account_values_with_pyth_batch_simulation( + self, account_address, self.pyth_feed_ids) + elif len(self.redstone_feed_ids) > 0: + logger.info("Vault: Pyth Oracle found for vault %s, " + "getting account liquidity through simulation", self.address) + collateral_value, liability_value = PullOracleHandler.get_account_values_with_redstone_batch_simulation( + self, account_address, self.redstone_feed_ids) + else: + (collateral_value, liability_value) = self.instance.functions.accountLiquidity( + Web3.to_checksum_address(account_address), + True + ).call() + except Exception as ex: # pylint: disable=broad-except + logger.error("Vault: Failed to get account liquidity" + " for account %s: Contract error - %s", + account_address, ex) + return (balance, 0, 0) + + return (balance, collateral_value, liability_value) + + def check_liquidation(self, + borower_address: str, + collateral_address: str, + liquidator_address: str + ) -> Tuple[int, int]: + """ + Call checkLiquidation on EVault for an account + + Args: + borower_address (str): The address of the borrower. + collateral_address (str): The address of the collateral asset. + liquidator_address (str): The address of the potential liquidator. + + Returns: + Tuple[int, int]: A tuple containing (max_repay, seized_collateral). + """ + logger.info("Vault: Checking liquidation for account %s, collateral vault %s," + " liquidator address %s, borrowed asset %s", + borower_address, collateral_address, + liquidator_address, self.underlying_asset_address) + + if len(self.pyth_feed_ids) > 0: + (max_repay, seized_collateral) = PullOracleHandler.check_liquidation_with_pyth_batch_simulation( + self, + Web3.to_checksum_address(liquidator_address), + Web3.to_checksum_address(borower_address), + Web3.to_checksum_address(collateral_address), + self.pyth_feed_ids + ) + elif len(self.redstone_feed_ids) > 0: + (max_repay, seized_collateral) = PullOracleHandler.check_liquidation_with_redstone_batch_simulation( + self, + Web3.to_checksum_address(liquidator_address), + Web3.to_checksum_address(borower_address), + Web3.to_checksum_address(collateral_address), + self.redstone_feed_ids + ) + else: + (max_repay, seized_collateral) = self.instance.functions.checkLiquidation( + Web3.to_checksum_address(liquidator_address), + Web3.to_checksum_address(borower_address), + Web3.to_checksum_address(collateral_address) + ).call() + return (max_repay, seized_collateral) + + def convert_to_assets(self, amount: int) -> int: + """ + Convert an amount of vault shares to underlying assets. + + Args: + amount (int): The amount of vault tokens to convert. + + Returns: + int: The amount of underlying assets. + """ + return self.instance.functions.convertToAssets(amount).call() + + def get_ltv_list(self): + """ + Return list of LTVs for this vault + """ + return self.instance.functions.LTVList().call() + +class Account: + """ + Represents an account in the EVK System. + This class provides methods to interact with a specific account and + manages individual account data, including health scores, + liquidation simulations, and scheduling of updates. It also provides + methods for serialization and deserialization of account data. + """ + def __init__(self, address, controller: Vault): + self.address = address + self.owner, self.subaccount_number = EVCListener.get_account_owner_and_subaccount_number(self.address) + self.controller = controller + self.time_of_next_update = time.time() + self.current_health_score = math.inf + self.balance = 0 + self.value_borrowed = 0 + + + def update_liquidity(self) -> float: + """ + Update account's liquidity & next scheduled update and return the current health score. + + Returns: + float: The updated health score of the account. + """ + self.get_health_score() + self.get_time_of_next_update() + + return self.current_health_score + + + def get_health_score(self) -> float: + """ + Calculate and return the current health score of the account. + + Returns: + float: The current health score of the account. + """ + + balance, collateral_value, liability_value = self.controller.get_account_liquidity( + self.address) + self.balance = balance + + self.value_borrowed = liability_value + if self.controller.unit_of_account == config.WETH: + logger.info("Account: Getting a quote for %s WETH, unit of account %s", + liability_value, self.controller.unit_of_account) + self.value_borrowed = get_eth_usd_quote(liability_value) + + logger.info("Account: value borrowed: %s", self.value_borrowed) + elif self.controller.unit_of_account == config.BTC: + logger.info("Account: Getting a quote for %s BTC, unit of account %s", + liability_value, self.controller.unit_of_account) + self.value_borrowed = get_btc_usd_quote(liability_value) + + logger.info("Account: value borrowed: %s", self.value_borrowed) + + # Special case for 0 values on balance or liability + if liability_value == 0: + self.current_health_score = math.inf + return self.current_health_score + + + self.current_health_score = collateral_value / liability_value + + logger.info("Account: %s health score: %s, Collateral Value: %s," + " Liability Value: %s", self.address, self.current_health_score, + collateral_value, liability_value) + return self.current_health_score + + def get_time_of_next_update(self) -> float: + """ + Calculate the time of the next update for this account. + + Returns: + float: The timestamp of the next scheduled update. + """ + + # If balance is 0, we set next update to a special value to remove it from the monitored set + # We know there will need to be a status check prior to the account having a borrow again + if self.current_health_score == math.inf: + self.time_of_next_update = -1 + return self.time_of_next_update + + time_gap = 0 + + + if self.current_health_score >= config.HS_SAFE: + time_gap = config.MAX_UPDATE_INTERVAL + elif config.HS_HIGH_RISK <= self.current_health_score < config.HS_SAFE: + # Linear decrease from MAX_UPDATE_INTERVAL to HIGH_RISK_UPDATE_INTERVAL + slope = (config.MAX_UPDATE_INTERVAL - config.HIGH_RISK_UPDATE_INTERVAL) / (config.HS_SAFE - config.HS_HIGH_RISK) + time_gap = config.HIGH_RISK_UPDATE_INTERVAL + slope * (self.current_health_score - config.HS_HIGH_RISK) + elif config.HS_LIQUIDATION < self.current_health_score < config.HS_HIGH_RISK: + # Exponential decrease from HIGH_RISK_UPDATE_INTERVAL to MIN_UPDATE_INTERVAL + exponent = (config.HS_HIGH_RISK - self.current_health_score) / (config.HS_HIGH_RISK - config.HS_LIQUIDATION) + time_gap = config.MIN_UPDATE_INTERVAL + (config.HIGH_RISK_UPDATE_INTERVAL - config.MIN_UPDATE_INTERVAL) * math.exp(-5 * exponent) + else: + time_gap = config.MIN_UPDATE_INTERVAL + + + # Randomly adjust the time by +/-10% to avoid syncronized checks across accounts/deployments + time_of_next_update = time.time() + time_gap * random.uniform(0.9, 1.1) + + # if next update is already scheduled before calculated time and after now, keep it the same + if not(self.time_of_next_update < time_of_next_update + and self.time_of_next_update > time.time()): + self.time_of_next_update = time_of_next_update + + logger.info("Account: %s next update scheduled for %s", self.address, + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.time_of_next_update))) + return self.time_of_next_update + + + def simulate_liquidation(self) -> Tuple[bool, Optional[Dict[str, Any]]]: + """ + Simulate liquidation of this account to determine if it's profitable. + + Returns: + Tuple[bool, Optional[Dict[str, Any]]]: A tuple containing a boolean indicating + if liquidation is profitable, and a dictionary with liquidation details if profitable. + """ + result = Liquidator.simulate_liquidation(self.controller, self.address, self) + return result + + def to_dict(self) -> Dict[str, Any]: + """ + Convert the account object to a dictionary representation. + + Returns: + Dict[str, Any]: A dictionary representation of the account. + """ + return { + "address": self.address, + "controller_address": self.controller.address, + "time_of_next_update": self.time_of_next_update, + "current_health_score": self.current_health_score + } + + @staticmethod + def from_dict(data: Dict[str, Any], vaults: Dict[str, Vault]) -> "Account": + """ + Create an Account object from a dictionary representation. + + Args: + data (Dict[str, Any]): The dictionary representation of the account. + vaults (Dict[str, Vault]): A dictionary of available vaults. + + Returns: + Account: An Account object created from the provided data. + """ + controller = vaults.get(data["controller_address"]) + if not controller: + controller = Vault(data["controller_address"]) + vaults[data["controller_address"]] = controller + account = Account(address=data["address"], controller=controller) + account.time_of_next_update = data["time_of_next_update"] + account.current_health_score = data["current_health_score"] + return account + +class AccountMonitor: + """ + Primary class for the liquidation bot system. + + This class is responsible for maintaining a list of accounts, scheduling + updates, triggering liquidations, and managing the overall state of the + monitored accounts. It also handles saving and loading the monitor's state. + """ + def __init__(self, notify = False, execute_liquidation = False): + self.accounts = {} + self.vaults = {} + self.update_queue = queue.PriorityQueue() + self.condition = threading.Condition() + self.executor = ThreadPoolExecutor(max_workers=32) + self.running = True + self.latest_block = 0 + self.last_saved_block = 0 + self.notify = notify + self.execute_liquidation = execute_liquidation + + self.recently_posted_low_value = {} + + def start_queue_monitoring(self) -> None: + """ + Start monitoring the account update queue. + This is the main entry point for the account monitor. + """ + save_thread = threading.Thread(target=self.periodic_save) + save_thread.start() + + logger.info("AccountMonitor: Save thread started.") + + if self.notify: + low_health_report_thread = threading.Thread(target= + self.periodic_report_low_health_accounts) + low_health_report_thread.start() + logger.info("AccountMonitor: Low health report thread started.") + + while self.running: + with self.condition: + while self.update_queue.empty(): + logger.info("AccountMonitor: Waiting for queue to be non-empty.") + self.condition.wait() + + next_update_time, address = self.update_queue.get() + + # check for special value that indicates + # account should be skipped & removed from queue + if next_update_time == -1: + logger.info("AccountMonitor: %s has no position," + " skipping and removing from queue", address) + continue + + current_time = time.time() + if next_update_time > current_time: + self.update_queue.put((next_update_time, address)) + self.condition.wait(next_update_time - current_time) + continue + + self.executor.submit(self.update_account_liquidity, address) + + + def update_account_on_status_check_event(self, address: str, vault_address: str) -> None: + """ + Update an account based on a status check event. + + Args: + address (str): The address of the account to update. + vault_address (str): The address of the vault associated with the account. + """ + + # If the vault is not already tracked in the list, create it + if vault_address not in self.vaults: + self.vaults[vault_address] = Vault(vault_address) + logger.info("AccountMonitor: Vault %s added to vault list.", vault_address) + + vault = self.vaults[vault_address] + + # If the account is not in the list or the controller has changed, add it to the list + if (address not in self.accounts or + self.accounts[address].controller.address != vault_address): + account = Account(address, vault) + self.accounts[address] = account + + logger.info("AccountMonitor: Adding %s to account list with controller %s.", + address, + vault.address) + else: + logger.info("AccountMonitor: %s already in list with controller %s.", + address, + vault.address) + + self.update_account_liquidity(address) + + def update_account_liquidity(self, address: str) -> None: + """ + Update the liquidity of a specific account. + + Args: + address (str): The address of the account to update. + """ + try: + account = self.accounts.get(address) + + if not account: + logger.error("AccountMonitor: %s not found in account list.", + address, exc_info=True) + return + + logger.info("AccountMonitor: Updating %s liquidity.", address) + prev_scheduled_time = account.time_of_next_update + + health_score = account.update_liquidity() + + if health_score < 1: + try: + if self.notify: + if account.address in self.recently_posted_low_value: + if (time.time() - self.recently_posted_low_value[account.address] + < config.LOW_HEALTH_REPORT_INTERVAL + and account.value_borrowed < config.SMALL_POSITION_THRESHOLD): + logger.info("Skipping posting notification " + "for account %s, recently posted", address) + else: + try: + post_unhealthy_account_on_slack(address, account.controller.address, + health_score, + account.value_borrowed) + logger.info("Valut borrowed: %s", account.value_borrowed) + if account.value_borrowed < config.SMALL_POSITION_THRESHOLD: + self.recently_posted_low_value[account.address] = time.time() + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: " + "Failed to post low health notification " + "for account %s to slack: %s", + address, ex, exc_info=True) + + logger.info("AccountMonitor: %s is unhealthy, " + "checking liquidation profitability.", + address) + (result, liquidation_data, params) = account.simulate_liquidation() + + if result: + if self.notify: + try: + logger.info("AccountMonitor: Posting liquidation notification " + "to slack for account %s.", address) + post_liquidation_opportunity_on_slack(address, + account.controller.address, + liquidation_data, params) + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: " + "Failed to post liquidation notification " + " for account %s to slack: %s", + address, ex, exc_info=True) + if self.execute_liquidation: + try: + tx_hash, tx_receipt = Liquidator.execute_liquidation( + liquidation_data["tx"]) + if tx_hash and tx_receipt: + logger.info("AccountMonitor: %s liquidated " + "on collateral %s.", + address, + liquidation_data["collateral_address"]) + if self.notify: + try: + logger.info("AccountMonitor: Posting liquidation result" + " to slack for account %s.", address) + post_liquidation_result_on_slack(address, + account.controller.address, + liquidation_data, + tx_hash) + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: " + "Failed to post liquidation result " + " for account %s to slack: %s", + address, ex, exc_info=True) + + # Update account health score after liquidation + # Need to know how healthy the account is after liquidation + # and if we need to liquidate again + account.update_liquidity() + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: " + "Failed to execute liquidation for account %s: %s", + address, ex, exc_info=True) + else: + logger.info("AccountMonitor: " + "Account %s is unhealthy but not profitable to liquidate.", + address) + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: " + "Exception simulating liquidation for account %s: %s", + address, ex, exc_info=True) + + next_update_time = account.time_of_next_update + + # if next update hasn't changed, means we already have a check scheduled + if next_update_time == prev_scheduled_time: + logger.info("AccountMonitor: %s next update already scheduled for %s", + address, time.strftime("%Y-%m-%d %H:%M:%S", + time.localtime(next_update_time))) + return + + with self.condition: + self.update_queue.put((next_update_time, address)) + self.condition.notify() + + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: Exception updating account %s: %s", + address, ex, exc_info=True) + + def save_state(self, local_save: bool = True) -> None: + """ + Save the current state of the account monitor. + + Args: + local_save (bool, optional): Whether to save the state locally. Defaults to True. + """ + try: + state = { + "accounts": {address: account.to_dict() + for address, account in self.accounts.items()}, + "vaults": {address: vault.address for address, vault in self.vaults.items()}, + "queue": list(self.update_queue.queue), + "last_saved_block": self.latest_block, + } + + if local_save: + with open(config.SAVE_STATE_PATH, "w", encoding="utf-8") as f: + json.dump(state, f) + else: + # Save to remote location + pass + + self.last_saved_block = self.latest_block + + logger.info("AccountMonitor: State saved at time %s up to block %s", + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), + self.latest_block) + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: Failed to save state: %s", ex, exc_info=True) + + def load_state(self, save_path: str, local_save: bool = True) -> None: + """ + Load the state of the account monitor from a file. + + Args: + save_path (str): The path to the saved state file. + local_save (bool, optional): Whether the state is saved locally. Defaults to True. + """ + try: + if local_save and os.path.exists(save_path): + with open(save_path, "r", encoding="utf-8") as f: + state = json.load(f) + + self.vaults = {address: Vault(address) for address in state["vaults"]} + logger.info("Loaded %s vaults: %s", len(self.vaults), list(self.vaults.keys())) + + self.accounts = {address: Account.from_dict(data, self.vaults) + for address, data in state["accounts"].items()} + logger.info("Loaded %s accounts:", len(self.accounts)) + + for address, account in self.accounts.items(): + logger.info(" Account %s: Controller: %s, " + "Health Score: %s, " + "Next Update: %s", + address, + account.controller.address, + account.current_health_score, + time.strftime("%Y-%m-%d %H:%M:%S", + time.localtime(account.time_of_next_update))) + + self.rebuild_queue() + + self.last_saved_block = state["last_saved_block"] + self.latest_block = self.last_saved_block + logger.info("AccountMonitor: State loaded from save" + " file %s from block %s to block %s", + save_path, + config.EVC_DEPLOYMENT_BLOCK, + self.latest_block) + elif not local_save: + # Load from remote location + pass + else: + logger.info("AccountMonitor: No saved state found.") + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: Failed to load state: %s", ex, exc_info=True) + + def rebuild_queue(self): + """ + Rebuild queue based on current account health + """ + logger.info("Rebuilding queue based on current account health") + + self.update_queue = queue.PriorityQueue() + for address, account in self.accounts.items(): + try: + health_score = account.update_liquidity() + + if account.current_health_score == math.inf: + logger.info("AccountMonitor: %s has no borrow, skipping", address) + continue + + next_update_time = account.time_of_next_update + self.update_queue.put((next_update_time, address)) + logger.info("AccountMonitor: %s added to queue" + " with health score %s, next update at %s", + address, health_score, time.strftime("%Y-%m-%d %H:%M:%S", + time.localtime(next_update_time))) + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: Failed to put account %s into rebuilt queue: %s", + address, ex, exc_info=True) + + logger.info("AccountMonitor: Queue rebuilt with %s acccounts", self.update_queue.qsize()) + + def get_accounts_by_health_score(self): + """ + Get a list of accounts sorted by health score. + + Returns: + List[Account]: A list of accounts sorted by health score. + """ + sorted_accounts = sorted( + self.accounts.values(), + key = lambda account: account.current_health_score + ) + + return [(account.address, account.owner, account.subaccount_number, + account.current_health_score, account.value_borrowed, + account.controller.vault_name, account.controller.vault_symbol) + for account in sorted_accounts] + + def periodic_report_low_health_accounts(self): + """ + Periodically report accounts with low health scores. + """ + while self.running: + try: + sorted_accounts = self.get_accounts_by_health_score() + post_low_health_account_report(sorted_accounts) + time.sleep(config.LOW_HEALTH_REPORT_INTERVAL) + except Exception as ex: # pylint: disable=broad-except + logger.error("AccountMonitor: Failed to post low health account report: %s", ex, + exc_info=True) + + @staticmethod + def create_from_save_state(save_path: str, local_save: bool = True) -> "AccountMonitor": + """ + Create an AccountMonitor instance from a saved state. + + Args: + save_path (str): The path to the saved state file. + local_save (bool, optional): Whether the state is saved locally. Defaults to True. + + Returns: + AccountMonitor: An AccountMonitor instance initialized from the saved state. + """ + monitor = AccountMonitor() + monitor.load_state(save_path, local_save) + return monitor + + def periodic_save(self) -> None: + """ + Periodically save the state of the account monitor. + Should be run in a standalone thread. + """ + while self.running: + time.sleep(config.SAVE_INTERVAL) + self.save_state() + + def stop(self) -> None: + """ + Stop the account monitor and save its current state. + """ + self.running = False + with self.condition: + self.condition.notify_all() + self.executor.shutdown(wait=True) + self.save_state() + +class PullOracleHandler: + """ + Class to handle checking and updating Pull oracles. + """ + def __init__(self): + pass + + @staticmethod + def get_account_values_with_pyth_batch_simulation(vault, account_address, feed_ids): + update_data = PullOracleHandler.get_pyth_update_data(feed_ids) + update_fee = PullOracleHandler.get_pyth_update_fee(update_data) + + liquidator = create_contract_instance(config.LIQUIDATOR_CONTRACT, + config.LIQUIDATOR_ABI_PATH) + + result = liquidator.functions.simulatePythUpdateAndGetAccountStatus( + [update_data], update_fee, vault.address, account_address + ).call({ + "value": update_fee + }) + return result[0], result[1] + + @staticmethod + def check_liquidation_with_pyth_batch_simulation(vault, liquidator_address, borrower_address, + collateral_address, feed_ids): + update_data = PullOracleHandler.get_pyth_update_data(feed_ids) + update_fee = PullOracleHandler.get_pyth_update_fee(update_data) + + liquidator = create_contract_instance(config.LIQUIDATOR_CONTRACT, + config.LIQUIDATOR_ABI_PATH) + + result = liquidator.functions.simulatePythUpdateAndCheckLiquidation( + [update_data], update_fee, vault.address, + liquidator_address, borrower_address, collateral_address + ).call({ + "value": update_fee + }) + return result[0], result[1] + + @staticmethod + def get_account_values_with_redstone_batch_simulation(vault, account_address, feed_ids): + addresses, update_data = PullOracleHandler.get_redstone_update_payloads(feed_ids) + + liquidator = create_contract_instance(config.LIQUIDATOR_CONTRACT, + config.LIQUIDATOR_ABI_PATH) + + result = liquidator.functions.simulateRedstoneUpdateAndGetAccountStatus( + update_data, addresses, vault.address, account_address + ).call() + return result[0], result[1] + + @staticmethod + def check_liquidation_with_redstone_batch_simulation(vault, + liquidator_address, + borrower_address, + collateral_address, + feed_ids): + addresses, update_data = PullOracleHandler.get_redstone_update_payloads(feed_ids) + + liquidator = create_contract_instance(config.LIQUIDATOR_CONTRACT, + config.LIQUIDATOR_ABI_PATH) + + result = liquidator.functions.simulateRedstoneUpdateAndCheckLiquidation( + update_data, addresses, vault.address, + liquidator_address, borrower_address, collateral_address + ).call() + return result[0], result[1] + + @staticmethod + def get_feed_ids(vault): + try: + oracle_address = vault.oracle_address + oracle = create_contract_instance(oracle_address, config.ORACLE_ABI_PATH) + + unit_of_account = vault.unit_of_account + + collateral_vault_list = vault.get_ltv_list() + asset_list = [Vault(collateral_vault).underlying_asset_address + for collateral_vault in collateral_vault_list] + asset_list.append(vault.underlying_asset_address) + + pyth_feed_ids = [] + redstone_feed_ids = [] + + for asset in asset_list: + configured_oracle_address = oracle.functions.getConfiguredOracle(asset, + unit_of_account + ).call() + configured_oracle = create_contract_instance(configured_oracle_address, + config.ORACLE_ABI_PATH) + + try: + configured_oracle_name = configured_oracle.functions.name().call() + except Exception as ex: # pylint: disable=broad-except + logger.info("PullOracleHandler: Error calling contract for oracle" + " at %s, asset %s: %s", configured_oracle_address, asset, ex) + continue + if configured_oracle_name == "PythOracle": + logger.info("PullOracleHandler: Pyth oracle found for vault %s: " + "Address - %s", vault.address, configured_oracle_address) + pyth_feed_ids.append(configured_oracle.functions.feedId().call().hex()) + elif configured_oracle_name == "RedstoneCoreOracle": + logger.info("PullOracleHandler: Redstone oracle found for" + " vault %s: Address - %s", + vault.address, configured_oracle_address) + redstone_feed_ids.append((configured_oracle_address, + configured_oracle.functions.feedId().call().hex())) + elif configured_oracle_name == "CrossOracle": + pyth_ids, redstone_ids = PullOracleHandler.resolve_cross_oracle( + configured_oracle) + pyth_feed_ids.append(pyth_ids) + redstone_feed_ids.append(redstone_ids) + + return pyth_feed_ids, redstone_feed_ids + + except Exception as ex: # pylint: disable=broad-except + logger.error("PullOracleHandler: Error calling contract: %s", ex, exc_info=True) + + @staticmethod + def resolve_cross_oracle(cross_oracle): + pyth_feed_ids = [] + redstone_feed_ids = [] + + oracle_base_address = cross_oracle.functions.oracleBaseCross().call() + oracle_base = create_contract_instance(oracle_base_address, config.ORACLE_ABI_PATH) + oracle_base_name = oracle_base.functions.name().call() + + if oracle_base_name == "PythOracle": + pyth_feed_ids.append(oracle_base.functions.feedId().call().hex()) + elif oracle_base_name == "RedstoneCoreOracle": + redstone_feed_ids.append((oracle_base_address, + oracle_base.functions.feedId().call().hex())) + elif oracle_base_name == "CrossOracle": + pyth_ids, redstone_ids = PullOracleHandler.resolve_cross_oracle(oracle_base) + pyth_feed_ids.append(pyth_ids) + redstone_feed_ids.append(redstone_ids) + + oracle_quote_address = cross_oracle.functions.oracleCrossQuote().call() + oracle_quote = create_contract_instance(oracle_quote_address, config.ORACLE_ABI_PATH) + oracle_quote_name = oracle_quote.functions.name().call() + + if oracle_quote_name == "PythOracle": + pyth_feed_ids.append(oracle_quote.functions.feedId().call()) + elif oracle_quote_name == "RedstoneCoreOracle": + redstone_feed_ids.append((oracle_quote_address, + oracle_quote.functions.feedId().call().hex())) + elif oracle_quote_name == "CrossOracle": + pyth_ids, redstone_ids = PullOracleHandler.resolve_cross_oracle(oracle_quote) + pyth_feed_ids.append(pyth_ids) + redstone_feed_ids.append(redstone_ids) + + return pyth_feed_ids, redstone_feed_ids + + @staticmethod + def get_pyth_update_data(feed_ids): + logger.info("PullOracleHandler: Getting update data for feeds: %s", feed_ids) + pyth_url = "https://hermes.pyth.network/v2/updates/price/latest?" + for feed_id in feed_ids: + pyth_url += "ids[]=" + feed_id + "&" + pyth_url = pyth_url[:-1] + + api_return_data = make_api_request(pyth_url, {}, {}) + return "0x" + api_return_data["binary"]["data"][0] + + @staticmethod + def get_pyth_update_fee(update_data): + logger.info("PullOracleHandler: Getting update fee for data: %s", update_data) + pyth = create_contract_instance(config.PYTH, config.PYTH_ABI_PATH) + return pyth.functions.getUpdateFee([update_data]).call() + + @staticmethod + def get_redstone_update_payloads(redstone_oracle_data): + addresses = [] + feed_ids = [] + + for data in redstone_oracle_data: + addresses.append(data[0]) + feed_ids.append(data[1]) + + feed_ids_json = json.dumps(feed_ids) + + result = subprocess.run( + ["node", "redstone_script/getRedstonePayload.js", feed_ids_json], + capture_output=True, + text=True, + check=True + ) + + if result.returncode != 0: + logger.error("PullOracleHandler: Error getting update payload") + logger.error("stderr: %s", result.stderr) + logger.error("stdout: %s", result.stdout) + return None + + result = json.loads(result.stdout) + + output_data = [] + + for i in range(len(result)): + + output_data.append(result[i]["data"]) + + return addresses, output_data + + +class EVCListener: + """ + Listener class for monitoring EVC events. + Primarily intended to listen for AccountStatusCheck events. + Contains handling for processing historical blocks in a batch system on startup. + """ + def __init__(self, account_monitor: AccountMonitor): + self.account_monitor = account_monitor + + self.evc_instance = create_contract_instance(config.EVC, config.EVC_ABI_PATH) + + self.scanned_blocks = set() + + def start_event_monitoring(self) -> None: + """ + Start monitoring for EVC events. + Scans from last scanned block stored by account monitor + up to the current block number (minus 1 to try to account for reorgs). + """ + while True: + try: + current_block = w3.eth.block_number - 1 + + if self.account_monitor.latest_block < current_block: + self.scan_block_range_for_account_status_check( + self.account_monitor.latest_block, + current_block) + except Exception as ex: # pylint: disable=broad-except + logger.error("EVCListener: Unexpected exception in event monitoring: %s", + ex, exc_info=True) + + time.sleep(config.SCAN_INTERVAL) + + #pylint: disable=W0102 + def scan_block_range_for_account_status_check(self, + start_block: int, + end_block: int, + max_retries: int = config.NUM_RETRIES, + seen_accounts: set = set()) -> None: + """ + Scan a range of blocks for AccountStatusCheck events. + + Args: + start_block (int): The starting block number. + end_block (int): The ending block number. + max_retries (int, optional): Maximum number of retry attempts. + Defaults to config.NUM_RETRIES. + + """ + for attempt in range(max_retries): + try: + logger.info("EVCListener: Scanning blocks %s to %s for AccountStatusCheck events.", + start_block, end_block) + + logs = self.evc_instance.events.AccountStatusCheck().get_logs( + fromBlock=start_block, + toBlock=end_block) + + for log in logs: + vault_address = log["args"]["controller"] + account_address = log["args"]["account"] + + #if we've seen the account already and the status + # check is not due to changing controller + if account_address in seen_accounts: + same_controller = self.account_monitor.accounts.get( + account_address).controller.address == Web3.to_checksum_address( + vault_address) + + if same_controller: + logger.info("EVCListener: Account %s already seen with " + "controller %s, skipping", account_address, vault_address) + continue + else: + seen_accounts.add(account_address) + + logger.info("EVCListener: AccountStatusCheck event found for account %s " + "with controller %s, triggering monitor update.", + account_address, vault_address) + + try: + self.account_monitor.update_account_on_status_check_event( + account_address, + vault_address) + except Exception as ex: # pylint: disable=broad-except + logger.error("EVCListener: Exception updating account %s " + "on AccountStatusCheck event: %s", + account_address, ex, exc_info=True) + + logger.info("EVCListener: Finished scanning blocks %s to %s " + "for AccountStatusCheck events.", start_block, end_block) + + self.account_monitor.latest_block = end_block + return + except Exception as ex: # pylint: disable=broad-except + logger.error("EVCListener: Exception scanning block range %s to %s " + "(attempt %s/%s): %s", + start_block, end_block, attempt + 1, max_retries, ex, exc_info=True) + if attempt == max_retries - 1: + logger.error("EVCListener: " + "Failed to scan block range %s to %s after %s attempts", + start_block, end_block, max_retries, exc_info=True) + else: + time.sleep(config.RETRY_DELAY) # cooldown between retries + + + def batch_account_logs_on_startup(self) -> None: + """ + Batch process account logs on startup. + Goes in reverse order to build smallest queue possible with most up to date info + """ + try: + # If the account monitor has a saved state, + # assume it has been loaded from that and start from the last saved block + start_block = max(int(config.EVC_DEPLOYMENT_BLOCK), + self.account_monitor.last_saved_block) + + current_block = w3.eth.block_number + + batch_block_size = config.BATCH_SIZE + + logger.info("EVCListener: " + "Starting batch scan of AccountStatusCheck events from block %s to %s.", + start_block, current_block) + + seen_accounts = set() + + while start_block < current_block: + end_block = min(start_block + batch_block_size, current_block) + + self.scan_block_range_for_account_status_check(start_block, end_block, + seen_accounts=seen_accounts) + self.account_monitor.save_state() + + start_block = end_block + 1 + + time.sleep(config.BATCH_INTERVAL) # Sleep in between batches to avoid rate limiting + + logger.info("EVCListener: " + "Finished batch scan of AccountStatusCheck events from block %s to %s.", + start_block, current_block) + + except Exception as ex: # pylint: disable=broad-except + logger.error("EVCListener: " + "Unexpected exception in batch scanning account logs on startup: %s", + ex, exc_info=True) + + @staticmethod + def get_account_owner_and_subaccount_number(account): + evc = create_contract_instance(config.EVC, config.EVC_ABI_PATH) + owner = evc.functions.getAccountOwner(account).call() + if owner == "0x0000000000000000000000000000000000000000": + owner = account + + subaccount_number = int(int(account, 16) ^ int(owner, 16)) + return owner, subaccount_number + +# Future feature, smart monitor to trigger manual update of an account +# based on a large price change (or some other trigger) +class SmartUpdateListener: + """ + Boiler plate listener class. + Intended to be implemented with some other trigger condition to update accounts. + """ + def __init__(self, account_monitor: AccountMonitor): + self.account_monitor = account_monitor + + def trigger_manual_update(self, account: Account) -> None: + """ + Boilerplate to trigger a manual update for a specific account. + + Args: + account (Account): The account to update. + """ + self.account_monitor.update_account_liquidity(account) + +liquidation_error_slack_cooldown = {} + +class Liquidator: + """ + Class to handle liquidation logic for accounts + This class provides static methods for simulating liquidations, calculating + liquidation profits, and executing liquidation transactions. + """ + def __init__(self): + pass + + @staticmethod + def simulate_liquidation(vault: Vault, + violator_address: str, + violator_account: Account) -> Tuple[bool, Optional[Dict[str, Any]]]: + """ + Simulate the liquidation of an account. + Chooses the maximum profitable liquidation from the available collaterals, if one exists. + + Args: + vault (Vault): The vault associated with the account. + violator_address (str): The address of the account to potentially liquidate. + + Returns: + Tuple[bool, Optional[Dict[str, Any]]]: A tuple containing a boolean indicating + if liquidation is profitable, and a dictionary with liquidation details + & transaction object if profitable. + """ + + evc_instance = create_contract_instance(config.EVC, config.EVC_ABI_PATH) + collateral_list = evc_instance.functions.getCollaterals(violator_address).call() + borrowed_asset = vault.underlying_asset_address + liquidator_contract = create_contract_instance(config.LIQUIDATOR_CONTRACT, + config.LIQUIDATOR_ABI_PATH) + + max_profit_data = { + "tx": None, + "profit": 0, + "collateral_address": None, + "collateral_asset": None, + "leftover_collateral": 0, + "leftover_collateral_in_eth": 0 + } + max_profit_params = None + + collateral_vaults = {collateral: Vault(collateral) for collateral in collateral_list} + + for collateral, collateral_vault in collateral_vaults.items(): + try: + logger.info("Liquidator: Checking liquidation for " + "account %s, borrowed asset %s, collateral asset %s", + violator_address, borrowed_asset, collateral) + + liquidation_results = Liquidator.calculate_liquidation_profit(vault, + violator_address, + borrowed_asset, + collateral_vault, + liquidator_contract) + profit_data, params = liquidation_results + + if profit_data["profit"] > max_profit_data["profit"]: + max_profit_data = profit_data + max_profit_params = params + except Exception as ex: # pylint: disable=broad-except + message = ("Exception simulating liquidation " + f"for account {violator_address} with collateral {collateral}: {ex}") + + logger.error("Liquidator: %s", message, exc_info=True) + + time_of_last_post = liquidation_error_slack_cooldown.get(violator_address, 0) + value_borrowed = violator_account.value_borrowed + + now = time.time() + time_elapsed = now - time_of_last_post + if ((value_borrowed > config.SMALL_POSITION_THRESHOLD and + time_elapsed > config.ERROR_COOLDOWN) + or (value_borrowed <= config.SMALL_POSITION_THRESHOLD and + time_elapsed > config.SMALL_POSITION_REPORT_INTERVAL)): + post_error_notification(message) + time_of_last_post = now + liquidation_error_slack_cooldown[violator_address] = time_of_last_post + continue + + + if max_profit_data["tx"]: + logger.info("Liquidator: Profitable liquidation found for account %s. " + "Collateral: %s, Underlying Collateral Asset: %s, " + "Remaining collateral after swap and repay: %s, " + "Estimated profit in ETH: %s", + violator_address, max_profit_data["collateral_address"], + max_profit_data["collateral_asset"], max_profit_data["leftover_collateral"], + max_profit_data["leftover_collateral_in_eth"]) + return (True, max_profit_data, max_profit_params) + return (False, None, None) + + @staticmethod + def calculate_liquidation_profit(vault: Vault, + violator_address: str, + borrowed_asset: str, + collateral_vault: Vault, + liquidator_contract: Any) -> Tuple[Dict[str, Any], Any]: + """ + Calculate the potential profit from liquidating an account using a specific collateral. + + Args: + vault (Vault): The vault that violator has borrowed from. + violator_address (str): The address of the account to potentially liquidate. + borrowed_asset (str): The address of the borrowed asset. + collateral_vault (Vault): The collatearl vault to seize. + liquidator_contract (Any): The liquidator contract instance. + + Returns: + Dict[str, Any]: A dictionary containing transaction and liquidation profit details. + """ + collateral_vault_address = collateral_vault.address + collateral_asset = collateral_vault.underlying_asset_address + + (max_repay, seized_collateral_shares) = vault.check_liquidation(violator_address, + collateral_vault_address, + LIQUIDATOR_EOA) + + seized_collateral_assets = vault.convert_to_assets(seized_collateral_shares) + + if max_repay == 0 or seized_collateral_shares == 0: + logger.info("Liquidator: Max Repay %s, Seized Collateral %s, liquidation not possible", + max_repay, seized_collateral_shares) + return ({"profit": 0}, None) + + swap_type = 1 + (swap_amount, _) = Quoter.get_quote(collateral_asset, + borrowed_asset, + seized_collateral_assets, + max_repay, swap_type) + # If something fails with 1inch, try uniswap + if swap_amount == -1: + swap_type = 2 + (swap_amount, _) = Quoter.get_quote(collateral_asset, + borrowed_asset, + seized_collateral_assets, + max_repay, swap_type) + + logger.info("Liquidator: Final swap amount %s", swap_amount) + + estimated_slippage_needed = .1 # TODO: actual slippage calculation + + time.sleep(config.API_REQUEST_DELAY) + + swap_data = Quoter.get_swap_data(collateral_asset, + borrowed_asset, + swap_amount, + config.SWAPPER, + LIQUIDATOR_EOA, + # config.LIQUIDATOR_CONTRACT, + config.SWAPPER, + swap_type, + estimated_slippage_needed) + + leftover_collateral = seized_collateral_assets - swap_amount + + time.sleep(config.API_REQUEST_DELAY) + + # Convert leftover asset to WETH + if collateral_asset != config.WETH: + (_, leftover_collateral_in_eth) = Quoter.get_quote(collateral_asset, + config.WETH, + leftover_collateral, + 0, swap_type) + else: + leftover_collateral_in_eth = leftover_collateral + + logger.info("Liquidator: Seized collatearl assets: %s, swap amount: %s, " + "leftover_collatearl: %s", seized_collateral_assets, swap_amount, + leftover_collateral_in_eth) + + if leftover_collateral_in_eth < 0: + logger.warning("Liquidator: Negative leftover collateral value, aborting liquidation") + return None + + + time.sleep(config.API_REQUEST_DELAY) + + params = ( + violator_address, + vault.address, + borrowed_asset, + collateral_vault.address, + collateral_asset, + max_repay, + seized_collateral_shares, + swap_amount, + leftover_collateral, + swap_type, + swap_data, + config.PROFIT_RECEIVER + ) + + logger.info("Liquidator: Liquidation details: %s", params) + + pyth_feed_ids = vault.pyth_feed_ids + redstone_feed_ids = vault.redstone_feed_ids + + # #TODO: smarter way to do this + # suggested_gas_price = int(w3.eth.gas_price * 1.2) + + # if len(feed_ids)> 0: + # logger.info("Liquidator: executing with pyth") + # update_data = PullOracleHandler.get_pyth_update_data(feed_ids) + # update_fee = PullOracleHandler.get_pyth_update_fee(update_data) + # liquidation_tx = liquidator_contract.functions.liquidateSingleCollateralWithPythOracle( + # params, update_data + # ).build_transaction({ + # "chainId": config.CHAIN_ID, + # "gasPrice": suggested_gas_price, + # "from": LIQUIDATOR_EOA, + # "nonce": w3.eth.get_transaction_count(LIQUIDATOR_EOA), + # "value": update_fee + # }) + # else: + # logger.info("Liquidator: executing normally") + # liquidation_tx = liquidator_contract.functions.liquidateSingleCollateral( + # params + # ).build_transaction({ + # "chainId": config.CHAIN_ID, + # "gasPrice": suggested_gas_price, + # "from": LIQUIDATOR_EOA, + # "nonce": w3.eth.get_transaction_count(LIQUIDATOR_EOA) + # }) + + #From flashbots example code + + latest = w3.eth.get_block("latest") + base_fee = latest["baseFeePerGas"] + + max_priority_fee = Web3.to_wei(2, "gwei") + + max_fee = base_fee + max_priority_fee + + suggested_gas_price = int(w3.eth.gas_price * 1.2) + + if len(pyth_feed_ids)> 0: + logger.info("Liquidator: executing with pyth") + update_data = PullOracleHandler.get_pyth_update_data(pyth_feed_ids) + update_fee = PullOracleHandler.get_pyth_update_fee(update_data) + liquidation_tx = liquidator_contract.functions.liquidateSingleCollateralWithPythOracle( + params, update_data + ).build_transaction({ + "chainId": config.CHAIN_ID, + "from": LIQUIDATOR_EOA, + "nonce": w3.eth.get_transaction_count(LIQUIDATOR_EOA), + "value": update_fee, + "gasPrice": suggested_gas_price + }) + elif len(redstone_feed_ids) > 0: + logger.info("Liquidator: executing with Redstone") + addresses, update_data = PullOracleHandler.get_redstone_update_payloads(redstone_feed_ids) + liquidation_tx = liquidator_contract.functions.liquidateSingleCollateralWithRedstoneOracle( + params, update_data, addresses + ).build_transaction({ + "chainId": config.CHAIN_ID, + "gasPrice": suggested_gas_price, + "from": LIQUIDATOR_EOA, + "nonce": w3.eth.get_transaction_count(LIQUIDATOR_EOA) + }) + else: + logger.info("Liquidator: executing normally") + # liquidation_tx = liquidator_contract.functions.liquidateSingleCollateral( + # params + # ).build_transaction({ + # "chainId": config.CHAIN_ID, + # "from": LIQUIDATOR_EOA, + # "nonce": w3.eth.get_transaction_count(LIQUIDATOR_EOA), + # "gas": 21000, + # "maxFeePerGas": max_fee, + # "maxPriorityFeePerGas": max_priority_fee + # }) + + liquidation_tx = liquidator_contract.functions.liquidateSingleCollateral( + params + ).build_transaction({ + "chainId": config.CHAIN_ID, + "gasPrice": suggested_gas_price, + "from": LIQUIDATOR_EOA, + "nonce": w3.eth.get_transaction_count(LIQUIDATOR_EOA) + }) + + net_profit = leftover_collateral_in_eth - (w3.eth.estimate_gas(liquidation_tx) * suggested_gas_price) + logger.info("Net profit: %s", net_profit) + + return ({ + "tx": liquidation_tx, + "profit": net_profit, + "collateral_address": collateral_vault.address, + "collateral_asset": collateral_asset, + "leftover_collateral": leftover_collateral, + "leftover_collateral_in_eth": leftover_collateral_in_eth + }, params) + + @staticmethod + def execute_liquidation(liquidation_transaction: Dict[str, Any]) -> None: + """ + Execute a liquidation transaction. + + Args: + liquidation_transaction (Dict[str, Any]): The liquidation transaction details. + """ + try: + logger.info("Liquidator: Executing liquidation transaction %s...", + liquidation_transaction) + # flashbots_provider = "https://rpc.flashbots.net" + # flashbots_relay = "https://relay.flashbots.net" + # flashbots_w3 = Web3(Web3.HTTPProvider(flashbots_provider)) + + # signed_tx = flashbots_w3.eth.account.sign_transaction(liquidation_transaction, + # LIQUIDATOR_EOA_PRIVATE_KEY) + # tx_hash = flashbots_w3.eth.send_raw_transaction(signed_tx.rawTransaction) + # tx_receipt = flashbots_w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120) + + signed_tx = w3.eth.account.sign_transaction(liquidation_transaction, + LIQUIDATOR_EOA_PRIVATE_KEY) + tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) + tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120) + + liquidator_contract = create_contract_instance(config.LIQUIDATOR_CONTRACT, + config.LIQUIDATOR_ABI_PATH) + + result = liquidator_contract.events.Liquidation().process_receipt(tx_receipt) + + logger.info("Liquidator: Liquidation details: ") + for event in result: + logger.info("Liquidator: %s", event["args"]) + + logger.info("Liquidator: Liquidation transaction executed successfully.") + return tx_hash.hex(), tx_receipt + except Exception as ex: # pylint: disable=broad-except + message = f"Unexpected error in executing liquidation: {ex}" + logger.error(message, exc_info=True) + post_error_notification(message) + return None, None + +class Quoter: + """ + Provides access to 1inch quotes and swap data generation functions + """ + def __init__(self): + pass + + @staticmethod + def get_quote(asset_in: str, asset_out: str, + amount_asset_in: int, target_amount_out: int, + swap_type: int = 1): + if swap_type == 1: #1inch swap + return Quoter.get_1inch_quote(asset_in, asset_out, amount_asset_in, target_amount_out) + elif swap_type == 2: #Uniswap + return Quoter.get_uniswap_quote(asset_in, asset_out, amount_asset_in, target_amount_out) + + @staticmethod + def get_swap_data(asset_in: str, + asset_out: str, + amount_in: int, + swap_from: str, + tx_origin: str, + swap_receiver: str, + swap_type: int, + slippage: int = 2) -> Optional[str]: + if swap_type == 1: + return Quoter.get_1inch_swap_data(asset_in, asset_out, amount_in, + swap_from, tx_origin, swap_receiver, slippage) + elif swap_type == 2: + return Quoter.get_uniswap_swap_data(asset_in, asset_out, amount_in, + swap_from, tx_origin, swap_receiver, slippage) + + @staticmethod + def get_1inch_quote(asset_in: str, + asset_out: str, + amount_asset_in: int, + target_amount_out: int) -> Tuple[int, int]: + """ + Get a quote from 1inch for swapping assets. + If target_amount_out == 0, it is treated as an exact in swap. + Otherwise, runs a binary search to find minimum amount in + that results in receiving target_amount_out. + Returned actual amount out should always be >= target_amount_out. + + Args: + asset_in (str): The address of the input asset. + asset_out (str): The address of the output asset. + amount_asset_in (int): The amount of input asset. + target_amount_out (int): The target amount of output asset. + + Returns: + Tuple[int, int]: A tuple containing (actual_amount_in, actual_amount_out). + """ + def get_api_quote(params): + """ + Simple wrapper to get a quote from 1inch. + """ + api_url = f"https://api.1inch.dev/swap/v6.0/{config.CHAIN_ID}/quote" + headers = { "Authorization": f"Bearer {API_KEY_1INCH}" } + response = make_api_request(api_url, headers, params) + return int(response["dstAmount"]) if response else None + + params = { + "src": asset_in, + "dst": asset_out, + "amount": amount_asset_in + } + + try: + # Special case exact in swap, don't need to do binary search + if target_amount_out == 0: + amount_out = get_api_quote(params) + if amount_out is None: + return (-1, -1) + return (amount_asset_in, amount_out) + + # Binary search to find the amount in that will result in the target amount out + # Overswaps slightly to make sure we can always repay max_repay + min_amount_in, max_amount_in = 0, amount_asset_in + + # Allow for overswap of SWAP_DELTA percent of target amount + delta = config.SWAP_DELTA * target_amount_out + + iteration_count = 0 + + last_valid_amount_in, last_valid_amount_out = 0, 0 + + logger.info("Quoter: Initial request for src %s to dst %s and amount %s", + params["dst"], params["src"], target_amount_out) + swap_amount = get_api_quote({"src": params["dst"], "dst": params["src"], + "amount": target_amount_out}) + + logger.info("Quoter: Initial guess for 1inch quote to get %s %s out from %s in: %s", + target_amount_out, asset_out, asset_in, swap_amount) + time.sleep(config.API_REQUEST_DELAY) + + min_amount_in = swap_amount * .95 + max_amount_in = swap_amount * 1.05 + + amount_out = 0 + while iteration_count < config.MAX_SEARCH_ITERATIONS: + swap_amount = int((min_amount_in + max_amount_in) / 2) + params["amount"] = swap_amount + amount_out = get_api_quote(params) + + if amount_out is None: + if last_valid_amount_out > target_amount_out: + logger.warning("Quoter: 1inch quote failed, using last valid " + "quote: %s %s to %s %s", + last_valid_amount_in, asset_in, + last_valid_amount_out, asset_out) + return (last_valid_amount_in, last_valid_amount_out) + logger.warning("Quoter: Failed to get valid 1inch quote " + "for %s %s to %s", swap_amount, asset_in, asset_out) + return (-1, -1) + + logger.info("Quoter: 1inch quote for %s %s to %s: %s", + swap_amount, asset_in, asset_out, amount_out) + + if amount_out > target_amount_out: + last_valid_amount_in = swap_amount + last_valid_amount_out = amount_out + + if abs(amount_out - target_amount_out) < delta and amount_out > target_amount_out: + break + elif amount_out < target_amount_out: + min_amount_in = swap_amount + + # TODO: could probably be smarter, check this when we figure out smarter bounds + if max_amount_in - swap_amount < max_amount_in * 0.01: + max_amount_in = min(max_amount_in * 1.5, amount_asset_in) + logger.info("Quoter: Increasing max_amount_in to %s", max_amount_in) + elif amount_out > target_amount_out: + max_amount_in = swap_amount + + iteration_count +=1 + + # need to rate limit until getting enterprise account key + time.sleep(config.API_REQUEST_DELAY) + + if iteration_count == config.MAX_SEARCH_ITERATIONS: + logger.warning("Quoter: 1inch quote search for %s to %s " + "did not converge after %s iterations.", + asset_in, asset_out, config.MAX_SEARCH_ITERATIONS) + if last_valid_amount_out > target_amount_out: + logger.info("Quoter: Using last valid quote: %s %s to %s %s", + last_valid_amount_in, asset_in, last_valid_amount_out, asset_out) + return (last_valid_amount_in, last_valid_amount_out) + return (-1, -1) + + return (params["amount"], amount_out) + except Exception as ex: # pylint: disable=broad-except + logger.error("Quoter: Unexpected error in get_1inch_quote %s", ex, exc_info=True) + return (-1, -1) + + @staticmethod + def get_1inch_swap_data(asset_in: str, + asset_out: str, + amount_in: int, + swap_from: str, + tx_origin: str, + swap_receiver: str, + slippage: int = 2) -> Optional[str]: + """ + Get swap data from 1inch for executing a swap. + + Args: + asset_in (str): The address of the input asset. + asset_out (str): The address of the output asset. + amount_in (int): The amount of input asset. + swap_from (str): The address to swap from. + tx_origin (str): The origin of the transaction. + slippage (int, optional): The allowed slippage percentage. Defaults to 2. + + Returns: + Optional[str]: The swap data if successful, None otherwise. + """ + + params = { + "src": asset_in, + "dst": asset_out, + "amount": amount_in, + "from": swap_from, + "origin": tx_origin, + "slippage": slippage, + "receiver": swap_receiver, + "disableEstimate": "true" + } + + logger.info("Getting 1inch swap data for %s %s %s %s %s %s %s", + amount_in, asset_in, asset_out, swap_from, tx_origin, + swap_receiver, slippage) + logger.info("Params: %s", params) + + api_url = f"https://api.1inch.dev/swap/v6.0/{config.CHAIN_ID}/swap" + headers = { "Authorization": f"Bearer {API_KEY_1INCH}" } + response = make_api_request(api_url, headers, params) + + return response["tx"]["data"] if response else None + + @staticmethod + def get_uniswap_quote(asset_in: str, asset_out: str, + amount_asset_in: int, target_amount_out: int): + logger.info("Quoter: Requesting Uniswap quote for %s %s to %s (target out: %s)", + amount_asset_in, asset_in, asset_out, target_amount_out) + return (0, 0) + + @staticmethod + def get_uniswap_swap_data(asset_in: str, + asset_out: str, + amount_in: int, + swap_from: str, + tx_origin: str, + swap_receiver: str, + slippage: int = 2) -> Optional[str]: + logger.info("Quoter: Requesting Uniswap swap data for" + " %s %s to %s, from %s, origin %s, receiver %s, slippage %s%%", + amount_in, asset_in, asset_out, swap_from, tx_origin, swap_receiver, slippage) + return None + +def get_account_monitor_and_evc_listener(): + acct_monitor = AccountMonitor(True, True) + acct_monitor.load_state(config.SAVE_STATE_PATH) + + evc_listener = EVCListener(acct_monitor) + + return (acct_monitor, evc_listener) + +if __name__ == "__main__": + try: + # acct_monitor = AccountMonitor(True, True) + # acct_monitor.load_state(config.SAVE_STATE_PATH) + + # evc_listener = EVCListener(acct_monitor) + + # evc_listener.batch_account_logs_on_startup() + + # threading.Thread(target=acct_monitor.start_queue_monitoring).start() + # threading.Thread(target=evc_listener.start_event_monitoring).start() + + # while True: + # time.sleep(1) + pass + + except Exception as e: # pylint: disable=broad-except + logger.critical("Uncaught exception: %s", e, exc_info=True) + error_message = f"Uncaught global exception: {e}" + post_error_notification(error_message) diff --git a/app/liquidation/routes.py b/app/liquidation/routes.py new file mode 100644 index 0000000..7cfc18c --- /dev/null +++ b/app/liquidation/routes.py @@ -0,0 +1,48 @@ +"""Module for handling API routes""" +import threading +from flask import Blueprint, make_response, jsonify +import math + +from .liquidation_bot import logger, get_account_monitor_and_evc_listener + +liquidation = Blueprint("liquidation", __name__) + +monitor = None +evc_listener = None + +def start_monitor(): + global monitor, evc_listener + monitor, evc_listener = get_account_monitor_and_evc_listener() + + evc_listener.batch_account_logs_on_startup() + + threading.Thread(target=monitor.start_queue_monitoring).start() + threading.Thread(target=evc_listener.start_event_monitoring).start() + + return monitor, evc_listener + +@liquidation.route("/allPositions", methods=["GET"]) +def get_all_positions(): + if not monitor: + return jsonify({"error": "Monitor not initialized"}), 500 + + logger.info("API: Getting all positions") + sorted_accounts = monitor.get_accounts_by_health_score() + + response = [] + for (address, owner, sub_account, health_score, value_borrowed, vault_name, vault_symbol) in sorted_accounts: + if math.isinf(health_score): + continue + response.append({"address": owner, "account_address": address, "sub_account": sub_account, + "health_score": health_score, "value_borrowed": value_borrowed, + "vault_name": vault_name, "vault_symbol": vault_symbol}) + + return make_response(jsonify(response)) + +def get_subaccount_number(account): + owner = evc_listener.evc_instance.functions.getAccountOwner(account).call() + if owner == "0x0000000000000000000000000000000000000000": + owner = account + + subaccount_number = int(int(account, 16) ^ int(owner, 16)) + return owner, subaccount_number \ No newline at end of file diff --git a/app/liquidation/utils.py b/app/liquidation/utils.py new file mode 100644 index 0000000..f07481b --- /dev/null +++ b/app/liquidation/utils.py @@ -0,0 +1,469 @@ +""" +Utility functions for the liquidation bot. +""" +import logging +import os +import json +import functools +import time +import traceback + +from types import SimpleNamespace +from typing import Any, Callable, Dict, Optional + +import requests +import yaml + + +from web3 import Web3 +from web3.contract import Contract +from dotenv import load_dotenv +from urllib.parse import urlencode + +network_variables = { + 1: { + "name": "Ethereum", + "explorer_url": "https://etherscan.io" + }, + 42161: { + "name": "Arbitrum", + "explorer_url": "https://arbiscan.io" + }, +} + +def load_config() -> SimpleNamespace: + """ + Load configuration from a YAML file and return it as a SimpleNamespace object. + + Returns: + SimpleNamespace: Configuration object with relevant settings + """ + with open("config.yaml", encoding="utf-8") as config_file: + config_dict = yaml.safe_load(config_file) + + config = SimpleNamespace(**config_dict) + + return config + +def setup_logger(logs_path: str) -> logging.Logger: + """ + Set up and configure a logger for the liquidation bot. + + Args: + logs_path (str): Path to the log output file. + + Returns: + logging.Logger: Configured logger instance. + """ + logger = logging.getLogger("liquidation_bot") + logger.setLevel(logging.DEBUG) + + console_handler = logging.StreamHandler() + file_handler = logging.FileHandler(logs_path, mode="a") + + detailed_formatter = logging.Formatter( + "%(asctime)s - %(levelname)s - %(message)s\n%(exc_info)s") + + # Create a standard formatter for other log levels + standard_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") + + class DetailedExceptionFormatter(logging.Formatter): + def format(self, record): + if record.levelno >= logging.ERROR: + record.exc_text = "".join( + traceback.format_exception(*record.exc_info)) if record.exc_info else "" + return detailed_formatter.format(record) + else: + return standard_formatter.format(record) + + console_handler.setFormatter(DetailedExceptionFormatter()) + file_handler.setFormatter(DetailedExceptionFormatter()) + + logger.addHandler(console_handler) + logger.addHandler(file_handler) + + + return logger + +class Web3Singleton: + """ + Singleton class to manage w3 object creation + """ + _instance = None + + @staticmethod + def get_instance(): + """ + Set up a Web3 instance using the RPC URL from environment variables. + """ + if Web3Singleton._instance is None: + load_dotenv(override=True) + rpc_url = os.getenv("RPC_URL") + logger = logging.getLogger("liquidation_bot") + logger.info("Trying to connect to RPC URL: %s", rpc_url) + + Web3Singleton._instance = Web3(Web3.HTTPProvider(rpc_url)) + return Web3Singleton._instance + +def setup_w3() -> Web3: + """ + Get the Web3 instance from the singleton class + + Returns: + Web3: Web3 instance. + """ + return Web3Singleton.get_instance() + +def create_contract_instance(address: str, abi_path: str) -> Contract: + """ + Create and return a contract instance. + + Args: + address (str): The address of the contract. + abi_path (str): Path to the ABI JSON file. + + Returns: + Contract: Web3 contract instance. + """ + with open(abi_path, "r", encoding="utf-8") as file: + interface = json.load(file) + abi = interface["abi"] + + w3 = setup_w3() + + return w3.eth.contract(address=address, abi=abi) + + +loaded_config = load_config() +def retry_request(logger: logging.Logger, + max_retries: int = loaded_config.NUM_RETRIES, + delay: int = loaded_config.RETRY_DELAY) -> Callable: + """ + Decorator to retry a function in case of RequestException. + + Args: + logger (logging.Logger): Logger instance to log retry attempts. + max_retries (int, optional): Maximum number of retry attempts. + Defaults to config.NUM_RETRIES. + delay (int, optional): Delay between retry attempts in seconds. + Defaults to config.RETRY_DELAY. + + Returns: + Callable: Decorated function. + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + for attempt in range(1, max_retries + 1): + try: + return func(*args, **kwargs) + except requests.RequestException as e: + logger.error(f"Error in API request, waiting {delay} seconds before retrying. " + f"Attempt {attempt}/{max_retries}") + logger.error(f"Error: {e}") + + if attempt == max_retries: + logger.error(f"Failed after {max_retries} attempts.") + return None + + time.sleep(delay) + return wrapper + return decorator + +def get_spy_link(account): + """ + Get account owner from EVC + """ + evc = create_contract_instance(loaded_config.EVC, loaded_config.EVC_ABI_PATH) + owner = evc.functions.getAccountOwner(account).call() + if owner == "0x0000000000000000000000000000000000000000": + owner = account + + subaccount_number = int(int(account, 16) ^ int(owner, 16)) + + spy_link = f"https://app.euler.finance/account/{subaccount_number}?spy={owner}" + + return spy_link + +@retry_request(logging.getLogger("liquidation_bot")) +def make_api_request(url: str, + headers: Dict[str, str], + params: Dict[str, Any]) -> Optional[Dict[str, Any]]: + """ + Make an API request with retry functionality. + + Args: + url (str): The URL for the API request. + headers (Dict[str, str]): Headers for the request. + params (Dict[str, Any]): Parameters for the request. + + Returns: + Optional[Dict[str, Any]]: JSON response if successful, None otherwise. + """ + response = requests.get(url, headers=headers, params=params, timeout=10) + response.raise_for_status() + return response.json() + +def get_eth_usd_quote(amount: int = 10**18): + config = load_config() + oracle = create_contract_instance(config.ETH_ADAPTER, config.ROUTER_ABI_PATH) + return oracle.functions.getQuote(amount, config.WETH, config.USD).call() + +def get_btc_usd_quote(amount: int = 10**18): + config = load_config() + oracle = create_contract_instance(config.BTC_ADAPTER, config.ROUTER_ABI_PATH) + return oracle.functions.getQuote(amount, config.BTC, config.USD).call() + + +def global_exception_handler(exctype: type, value: BaseException, tb: Any) -> None: + """ + Global exception handler to log uncaught exceptions. + + Args: + exctype (type): The type of the exception. + value (BaseException): The exception instance. + tb (Any): A traceback object encapsulating the call stack + at the point where the exception occurred. + """ + logger = logging.getLogger("liquidation_bot") + + # Get the full traceback as a string + trace_str = "".join(traceback.format_exception(exctype, value, tb)) + + # Log the full exception information + logger.critical("Uncaught exception:\n %s", trace_str) + +def post_unhealthy_account_on_slack(account_address: str, vault_address: str, + health_score: float, value_borrowed: int) -> None: + """ + Post a message on Slack about an unhealthy account. + """ + load_dotenv() + slack_url = os.getenv("SLACK_WEBHOOK_URL") + + spy_link = get_spy_link(account_address) + + message = ( + ":warning: *Unhealthy Account Detected* :warning:\n\n" + f"*Account*: `{account_address}`, <{spy_link}|Spy Mode>\n" + f"*Vault*: `{vault_address}`\n" + f"*Health Score*: `{health_score:.4f}`\n" + f"*Value Borrowed*: `${value_borrowed / 10 ** 18:.2f}`\n" + f"Time of detection: {time.strftime("%Y-%m-%d %H:%M:%S")}\n" + f"Network: `{network_variables[loaded_config.CHAIN_ID]["name"]}`\n\n" + ) + + slack_payload = { + "text": message, + "username": "Liquidation Bot", + "icon_emoji": ":robot_face:" + } + requests.post(slack_url, json=slack_payload, timeout=10) + + +def post_liquidation_opportunity_on_slack(account_address: str, vault_address: str, + liquidation_data: Optional[Dict[str, Any]] = None, + params: Optional[Dict[str, Any]] = None) -> None: + """ + Post a message on Slack. + + Args: + message (str): The main message to post. + liquidation_data (Optional[Dict[str, Any]]): Additional liquidation data to format. + """ + load_dotenv() + slack_url = os.getenv("SLACK_WEBHOOK_URL") + RISK_DASHBOARD_URL = os.getenv("RISK_DASHBOARD_URL") + + if liquidation_data and params: + + # Unpack params + violator_address, vault, borrowed_asset, collateral_vault, collateral_asset, \ + max_repay, seized_collateral_shares, swap_amount, \ + leftover_collateral, _, swap_data_1inch, receiver = params + + spy_link = get_spy_link(account_address) + + # Build URL parameters + url_params = urlencode({ + "violator": violator_address, + "vault": vault, + "borrowed_asset": borrowed_asset, + "collateral_vault": collateral_vault, + "collateral_asset": collateral_asset, + "max_repay": max_repay, + "seized_collateral_shares": seized_collateral_shares, + "swap_amount": swap_amount, + "leftover_collateral": leftover_collateral, + "swap_data_1inch": swap_data_1inch, + "receiver": receiver + }) + + # Construct the full URL + execution_url = f"{RISK_DASHBOARD_URL}/liquidation/execute?{url_params}" + + + message = ( + ":rotating_light: *Profitable Liquidation Opportunity Detected* :rotating_light:\n\n" + f"*Account*: `{account_address}`, <{spy_link}|Spy Mode>\n" + f"*Vault*: `{vault_address}`" + ) + + config = load_config() + + formatted_data = ( + f"*Liquidation Opportunity Details:*\n" + f"• Profit: {Web3.from_wei(liquidation_data["profit"], "ether")} ETH\n" + f"• Collateral Vault Address: `{liquidation_data["collateral_address"]}`\n" + f"• Collateral Asset: `{liquidation_data["collateral_asset"]}`\n" + f"• Leftover Collateral: {Web3.from_wei(liquidation_data["leftover_collateral"], + "ether")}\n" + f"• Leftover Collateral in ETH terms (excluding gas): {Web3.from_wei( + liquidation_data["leftover_collateral_in_eth"], "ether")} ETH\n\n" + f"<{execution_url}|Click here to execute this liquidation manually>\n\n" + f"Time of detection: {time.strftime("%Y-%m-%d %H:%M:%S")}\n\n" + f"Network: `{network_variables[config.CHAIN_ID]["name"]}`" + ) + message += f"\n\n{formatted_data}" + + slack_payload = { + "text": message, + "username": "Liquidation Bot", + "icon_emoji": ":robot_face:" + } + requests.post(slack_url, json=slack_payload, timeout=10) + + +def post_liquidation_result_on_slack(account_address: str, vault_address: str, + liquidation_data: Optional[Dict[str, Any]] = None, + tx_hash: Optional[str] = None) -> None: + """ + Post a message on Slack. + + Args: + message (str): The main message to post. + liquidation_data (Optional[Dict[str, Any]]): Additional liquidation data to format. + """ + load_dotenv() + slack_url = os.getenv("SLACK_WEBHOOK_URL") + + spy_link = get_spy_link(account_address) + + message = ( + ":moneybag: *Liquidation Completed* :moneybag:\n\n" + f"*Liquidated Account*: `{account_address}`, <{spy_link}|Spy Mode>\n" + f"*Vault*: `{vault_address}`" + ) + + config = load_config() + + tx_url = f"{network_variables[config.CHAIN_ID]["explorer_url"]}/tx/{tx_hash}" + + formatted_data = ( + f"*Liquidation Details:*\n" + f"• Profit: {Web3.from_wei(liquidation_data["profit"], "ether")} ETH\n" + f"• Collateral Vault Address: `{liquidation_data["collateral_address"]}`\n" + f"• Collateral Asset: `{liquidation_data["collateral_asset"]}`\n" + f"• Leftover Collateral: {Web3.from_wei(liquidation_data["leftover_collateral"], "ether")} {liquidation_data["collateral_asset"]}\n" + f"• Leftover Collateral in ETH terms: {Web3.from_wei(liquidation_data["leftover_collateral_in_eth"], "ether")} ETH\n\n" + f"• Transaction: <{tx_url}|View Transaction on Explorer>\n\n" + f"Time of liquidation: {time.strftime("%Y-%m-%d %H:%M:%S")}\n\n" + f"Network: `{network_variables[config.CHAIN_ID]["name"]}`" + ) + message += f"\n\n{formatted_data}" + + slack_payload = { + "text": message, + "username": "Liquidation Bot", + "icon_emoji": ":robot_face:" + } + requests.post(slack_url, json=slack_payload, timeout=10) + +def post_low_health_account_report(sorted_accounts) -> None: + """ + Post a report of accounts with low health scores to Slack. + + Args: + sorted_accounts (List[Tuple[str, float]]): A list of tuples + containing account addresses and their health scores, + sorted by health score in ascending order. + """ + load_dotenv() + config = load_config() + slack_url = os.getenv("SLACK_WEBHOOK_URL") + + # Filter accounts below the threshold + low_health_accounts = [ + (address, owner, subaccount, score, value, _, _) for address, owner, subaccount, score, value, _, _ in sorted_accounts + if score < config.SLACK_REPORT_HEALTH_SCORE + ] + + message = ":warning: *Account Health Report* :warning:\n\n" + + total_value = 0 + + if not low_health_accounts: + message += f"No accounts with health score below `{config.SLACK_REPORT_HEALTH_SCORE}` detected.\n" + else: + for i, (address, owner, subaccount_number, score, value, _, _) in enumerate(low_health_accounts, start=1): + + # Format score to 4 decimal places + formatted_score = f"{score:.4f}" + formatted_value = value / 10 ** 18 + + total_value += formatted_value + + formatted_value = f"{formatted_value:,.2f}" + + spy_link = spy_link = f"https://app.euler.finance/account/{subaccount_number}?spy={owner}" + + message += f"{i}. `{address}` Health Score: `{formatted_score}`, Value Borrowed: `${formatted_value}`, <{spy_link}|Spy Mode>\n" + + message += f"\nTotal accounts with health score below `{config.SLACK_REPORT_HEALTH_SCORE}`: `{len(low_health_accounts)}`" + message += f"\nTotal borrow amount in USD: `${total_value:,.2f}`" + RISK_DASHBOARD_URL = os.getenv("RISK_DASHBOARD_URL") + message += f"\n<{RISK_DASHBOARD_URL}|Risk Dashboard>" + message += f"\nTime of report: `{time.strftime("%Y-%m-%d %H:%M:%S")}`" + message += f"\nNetwork: `{network_variables[config.CHAIN_ID]["name"]}`" + + slack_payload = { + "text": message, + "username": "Liquidation Bot", + "icon_emoji": ":robot_face:" + } + + try: + response = requests.post(slack_url, json=slack_payload, timeout=10) + response.raise_for_status() + print("Low health account report posted to Slack successfully.") + except requests.RequestException as e: + print(f"Failed to post low health account report to Slack: {e}") + +def post_error_notification(message) -> None: + """ + Post an error notification to Slack. + + Args: + message (str): The error message to be posted. + """ + + load_dotenv() + config = load_config() + slack_url = os.getenv("SLACK_WEBHOOK_URL") + + error_message = f":rotating_light: *Error Notification* :rotating_light:\n\n{message}\n\n" + error_message += f"Time: {time.strftime("%Y-%m-%d %H:%M:%S")}\n" + error_message += f"Network: `{network_variables[config.CHAIN_ID]["name"]}`" + + slack_payload = { + "text": error_message, + "username": "Liquidation Bot", + "icon_emoji": ":warning:" + } + + try: + response = requests.post(slack_url, json=slack_payload, timeout=10) + response.raise_for_status() + print("Error notification posted to Slack successfully.") + except requests.RequestException as e: + print("Failed to post error notification to Slack: %s", e) diff --git a/application.py b/application.py new file mode 100644 index 0000000..239880a --- /dev/null +++ b/application.py @@ -0,0 +1,9 @@ +""" +Start point for running flask app +""" +from app import create_app + +application = create_app() + +if __name__ == "__main__": + application.run(host="0.0.0.0", port=8080, debug=True) diff --git a/broadcast/DeployLiquidator.sol/41337/run-1721912164.json b/broadcast/DeployLiquidator.sol/41337/run-1721912164.json new file mode 100644 index 0000000..4bf7a0c --- /dev/null +++ b/broadcast/DeployLiquidator.sol/41337/run-1721912164.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0xcfc8a88739639ecd3677b42253ba18952d700f3b85a504147116e3430ce82556", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0xf165a31dcbb4d2f00cb31532d1d0a27bb80aa49d", + "function": null, + "arguments": [ + "0xfA898de6CcE1715a14F579c316C6cfd7F869655B", + "0x4c0bF4C73f2Cf53259C84694b2F26Adc4916921e", + "0xB8d6D6b01bFe81784BE46e5771eF017Fa3c906d8" + ], + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x103006", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051610e13380380610e1383398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e051610cf1610122600039600061010a01526000818161017a015261073901526000818160cb015281816105fe015261068c015260006101310152610cf16000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80639e3f7432116100665780639e3f743214610153578063a55f08d314610162578063b0643a2f14610175578063b2e45fdc1461019c578063c4d88adf146101bf57600080fd5b806335b96ca41461009857806335c1d701146100c6578063512dd8ba146101055780638da5cb5b1461012c575b600080fd5b6100b3702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bd565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100b36406292dcc6d60db1b81565b6100b3682ab734b9bbb0b82b1960b91b81565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6101af6101aa3660046109aa565b6101d2565b60405190151581526020016100bd565b6100b368556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816101ec5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b0316815260200184608001602081019061024791906109ed565b6001600160a01b0316815260200161026560608601604087016109ed565b6001600160a01b03168152600060208201819052604082018190526060820152608001610296610120860186610a16565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102dc9190602401610aaa565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061031957610319610b5e565b60209081029190910101526040805160078082526101008201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161033d575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103b19189019089016109ed565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061040d5761040d610b5e565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b03168152602001600081526020013086606001602081019061047291906109ed565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104d0576104d0610b5e565b602002602001018190525060405180608001604052808560200160208101906104f991906109ed565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185600001602081019061053091906109ed565b61054060808801606089016109ed565b60a0880135610554600160c08b0135610b74565b6040516024016105679493929190610b9b565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b17905290528151829060029081106105a8576105a8610b5e565b602002602001018190525060405180608001604052808560600160208101906105d191906109ed565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061067457610674610b5e565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106e09190610bc4565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061072157610721610b5e565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b031681526020016000815260200185602001602081019061078f91906109ed565b3060016000196040516024016107a89493929190610b9b565b60408051601f198184030181529190526020810180516001600160e01b031663146ad81760e21b17905290528151829060059081106107e9576107e9610b5e565b6020026020010181905250604051806080016040528085602001602081019061081291906109ed565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a001353060405160240161085f9291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b17905290528151829060069081106108a0576108a0610b5e565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906108db908490600401610c29565b600060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b5061091e9250505060408501602086016109ed565b6001600160a01b031661093460208601866109ed565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d61096e60608801604089016109ed565b61097e60a0890160808a016109ed565b8860a001358960c001356040516109989493929190610b9b565b60405180910390a35060019392505050565b6000602082840312156109bc57600080fd5b813567ffffffffffffffff8111156109d357600080fd5b820161014081850312156109e657600080fd5b9392505050565b6000602082840312156109ff57600080fd5b81356001600160a01b03811681146109e657600080fd5b6000808335601e19843603018112610a2d57600080fd5b83018035915067ffffffffffffffff821115610a4857600080fd5b602001915036819003821315610a5d57600080fd5b9250929050565b6000815180845260005b81811015610a8a57602081850181015186830182015201610a6e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610adb60608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610b56610140840182610a64565b949350505050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b9557634e487b7160e01b600052601160045260246000fd5b92915050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610c1d57603f19878603018452610c08858351610a64565b94506020938401939190910190600101610bec565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610c1d57868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290610ca590870182610a64565b9550506020938401939190910190600101610c5156fea2646970667358221220f92a70823ca79eac09fcc38850177722504ff9a199fa82abaeae742d4f57c80e64736f6c634300081a0033000000000000000000000000fa898de6cce1715a14f579c316c6cfd7f869655b0000000000000000000000004c0bf4c73f2cf53259c84694b2f26adc4916921e000000000000000000000000b8d6d6b01bfe81784be46e5771ef017fa3c906d8", + "nonce": "0x456", + "chainId": "0xa179" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xc749e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xcfc8a88739639ecd3677b42253ba18952d700f3b85a504147116e3430ce82556", + "transactionIndex": "0x0", + "blockHash": "0xdbed06be6e656189c8c4a7c12f905d49b0a936e304aba5e9440e255145a68062", + "blockNumber": "0x136f0b1", + "gasUsed": "0xc749e", + "effectiveGasPrice": "0x3b9aca01", + "blobGasPrice": "0x1", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0xf165a31dcbb4d2f00cb31532d1d0a27bb80aa49d", + "root": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721912164, + "chain": 41337, + "commit": "bda79d3" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/41337/run-latest.json b/broadcast/DeployLiquidator.sol/41337/run-latest.json new file mode 100644 index 0000000..4bf7a0c --- /dev/null +++ b/broadcast/DeployLiquidator.sol/41337/run-latest.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0xcfc8a88739639ecd3677b42253ba18952d700f3b85a504147116e3430ce82556", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0xf165a31dcbb4d2f00cb31532d1d0a27bb80aa49d", + "function": null, + "arguments": [ + "0xfA898de6CcE1715a14F579c316C6cfd7F869655B", + "0x4c0bF4C73f2Cf53259C84694b2F26Adc4916921e", + "0xB8d6D6b01bFe81784BE46e5771eF017Fa3c906d8" + ], + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x103006", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051610e13380380610e1383398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e051610cf1610122600039600061010a01526000818161017a015261073901526000818160cb015281816105fe015261068c015260006101310152610cf16000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80639e3f7432116100665780639e3f743214610153578063a55f08d314610162578063b0643a2f14610175578063b2e45fdc1461019c578063c4d88adf146101bf57600080fd5b806335b96ca41461009857806335c1d701146100c6578063512dd8ba146101055780638da5cb5b1461012c575b600080fd5b6100b3702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bd565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100b36406292dcc6d60db1b81565b6100b3682ab734b9bbb0b82b1960b91b81565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6101af6101aa3660046109aa565b6101d2565b60405190151581526020016100bd565b6100b368556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816101ec5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b0316815260200184608001602081019061024791906109ed565b6001600160a01b0316815260200161026560608601604087016109ed565b6001600160a01b03168152600060208201819052604082018190526060820152608001610296610120860186610a16565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102dc9190602401610aaa565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061031957610319610b5e565b60209081029190910101526040805160078082526101008201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161033d575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103b19189019089016109ed565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061040d5761040d610b5e565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b03168152602001600081526020013086606001602081019061047291906109ed565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104d0576104d0610b5e565b602002602001018190525060405180608001604052808560200160208101906104f991906109ed565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185600001602081019061053091906109ed565b61054060808801606089016109ed565b60a0880135610554600160c08b0135610b74565b6040516024016105679493929190610b9b565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b17905290528151829060029081106105a8576105a8610b5e565b602002602001018190525060405180608001604052808560600160208101906105d191906109ed565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061067457610674610b5e565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106e09190610bc4565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061072157610721610b5e565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b031681526020016000815260200185602001602081019061078f91906109ed565b3060016000196040516024016107a89493929190610b9b565b60408051601f198184030181529190526020810180516001600160e01b031663146ad81760e21b17905290528151829060059081106107e9576107e9610b5e565b6020026020010181905250604051806080016040528085602001602081019061081291906109ed565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a001353060405160240161085f9291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b17905290528151829060069081106108a0576108a0610b5e565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906108db908490600401610c29565b600060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b5061091e9250505060408501602086016109ed565b6001600160a01b031661093460208601866109ed565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d61096e60608801604089016109ed565b61097e60a0890160808a016109ed565b8860a001358960c001356040516109989493929190610b9b565b60405180910390a35060019392505050565b6000602082840312156109bc57600080fd5b813567ffffffffffffffff8111156109d357600080fd5b820161014081850312156109e657600080fd5b9392505050565b6000602082840312156109ff57600080fd5b81356001600160a01b03811681146109e657600080fd5b6000808335601e19843603018112610a2d57600080fd5b83018035915067ffffffffffffffff821115610a4857600080fd5b602001915036819003821315610a5d57600080fd5b9250929050565b6000815180845260005b81811015610a8a57602081850181015186830182015201610a6e565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610adb60608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610b56610140840182610a64565b949350505050565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b9557634e487b7160e01b600052601160045260246000fd5b92915050565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610c1d57603f19878603018452610c08858351610a64565b94506020938401939190910190600101610bec565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610c1d57868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290610ca590870182610a64565b9550506020938401939190910190600101610c5156fea2646970667358221220f92a70823ca79eac09fcc38850177722504ff9a199fa82abaeae742d4f57c80e64736f6c634300081a0033000000000000000000000000fa898de6cce1715a14f579c316c6cfd7f869655b0000000000000000000000004c0bf4c73f2cf53259c84694b2f26adc4916921e000000000000000000000000b8d6d6b01bfe81784be46e5771ef017fa3c906d8", + "nonce": "0x456", + "chainId": "0xa179" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xc749e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xcfc8a88739639ecd3677b42253ba18952d700f3b85a504147116e3430ce82556", + "transactionIndex": "0x0", + "blockHash": "0xdbed06be6e656189c8c4a7c12f905d49b0a936e304aba5e9440e255145a68062", + "blockNumber": "0x136f0b1", + "gasUsed": "0xc749e", + "effectiveGasPrice": "0x3b9aca01", + "blobGasPrice": "0x1", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0xf165a31dcbb4d2f00cb31532d1d0a27bb80aa49d", + "root": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721912164, + "chain": 41337, + "commit": "bda79d3" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/42161/run-1722278799.json b/broadcast/DeployLiquidator.sol/42161/run-1722278799.json new file mode 100644 index 0000000..621f750 --- /dev/null +++ b/broadcast/DeployLiquidator.sol/42161/run-1722278799.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0xd37ba96a568ae371909404ddfe7a9922c09428a18252e59773f63c0527dc7885", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0x22c317403d468585bc6262b9d80b45de1edde5e0", + "function": null, + "arguments": [ + "0xf2FE32e706c849E7b049AC7B75F82E98225969d7", + "0x3f2d64E717A74B564664B2e7B237f3AD42D76D5A", + "0xc860d644A514d0626c8B87ACFA63fE12644Ce3cd" + ], + "transaction": { + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "gas": "0x16ae4c", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051610de2380380610de283398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e051610cc0610122600039600061010a01526000818161017a015261072f01526000818160cb015281816105f40152610682015260006101310152610cc06000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80639e3f7432116100665780639e3f743214610153578063a55f08d314610162578063b0643a2f14610175578063b2e45fdc1461019c578063c4d88adf146101bf57600080fd5b806335b96ca41461009857806335c1d701146100c6578063512dd8ba146101055780638da5cb5b1461012c575b600080fd5b6100b3702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bd565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100b36406292dcc6d60db1b81565b6100b3682ab734b9bbb0b82b1960b91b81565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6101af6101aa3660046109a0565b6101d2565b60405190151581526020016100bd565b6100b368556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816101ec5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b0316815260200184608001602081019061024791906109e3565b6001600160a01b0316815260200161026560608601604087016109e3565b6001600160a01b03168152600060208201819052604082018190526060820152608001610296610120860186610a0c565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102dc9190602401610aa0565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061031957610319610b54565b60209081029190910101526040805160078082526101008201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161033d575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103b19189019089016109e3565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061040d5761040d610b54565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b03168152602001600081526020013086606001602081019061047291906109e3565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104d0576104d0610b54565b602002602001018190525060405180608001604052808560200160208101906104f991906109e3565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185600001602081019061053091906109e3565b61054060808801606089016109e3565b8760a001358860c0013560405160240161055d9493929190610b6a565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b179052905281518290600290811061059e5761059e610b54565b602002602001018190525060405180608001604052808560600160208101906105c791906109e3565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061066a5761066a610b54565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106d69190610b93565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061071757610717610b54565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b031681526020016000815260200185602001602081019061078591906109e3565b30600160001960405160240161079e9493929190610b6a565b60408051601f198184030181529190526020810180516001600160e01b031663146ad81760e21b17905290528151829060059081106107df576107df610b54565b6020026020010181905250604051806080016040528085602001602081019061080891906109e3565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a00135306040516024016108559291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b179052905281518290600690811061089657610896610b54565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906108d1908490600401610bf8565b600060405180830381600087803b1580156108eb57600080fd5b505af11580156108ff573d6000803e3d6000fd5b506109149250505060408501602086016109e3565b6001600160a01b031661092a60208601866109e3565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d61096460608801604089016109e3565b61097460a0890160808a016109e3565b8860a001358960c0013560405161098e9493929190610b6a565b60405180910390a35060019392505050565b6000602082840312156109b257600080fd5b813567ffffffffffffffff8111156109c957600080fd5b820161014081850312156109dc57600080fd5b9392505050565b6000602082840312156109f557600080fd5b81356001600160a01b03811681146109dc57600080fd5b6000808335601e19843603018112610a2357600080fd5b83018035915067ffffffffffffffff821115610a3e57600080fd5b602001915036819003821315610a5357600080fd5b9250929050565b6000815180845260005b81811015610a8057602081850181015186830182015201610a64565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610ad160608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610b4c610140840182610a5a565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610bec57603f19878603018452610bd7858351610a5a565b94506020938401939190910190600101610bbb565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610bec57868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290610c7490870182610a5a565b9550506020938401939190910190600101610c2056fea2646970667358221220a8d5f2af696debe6f1f2e5efd38d0323317e783879c02e8f17aa598ac7ad3a4564736f6c634300081a0033000000000000000000000000f2fe32e706c849e7b049ac7b75f82e98225969d70000000000000000000000003f2d64e717a74b564664b2e7b237f3ad42d76d5a000000000000000000000000c860d644a514d0626c8b87acfa63fe12644ce3cd", + "nonce": "0x0", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x10bf48", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xd37ba96a568ae371909404ddfe7a9922c09428a18252e59773f63c0527dc7885", + "transactionIndex": "0x1", + "blockHash": "0x789c307df96780db0f93951bf5fe8034442e0725c5de7604e0dec4e1e064a7a2", + "blockNumber": "0xe25f689", + "gasUsed": "0x10bf48", + "effectiveGasPrice": "0x989680", + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "to": null, + "contractAddress": "0x22c317403d468585bc6262b9d80b45de1edde5e0", + "gasUsedForL1": "0x473f9", + "l1BlockNumber": "0x1377e9a" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722278799, + "chain": 42161, + "commit": "d5548cb" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/42161/run-1722849403.json b/broadcast/DeployLiquidator.sol/42161/run-1722849403.json new file mode 100644 index 0000000..2357034 --- /dev/null +++ b/broadcast/DeployLiquidator.sol/42161/run-1722849403.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0x3a740148665f38f48c2894dbb7e45100e9142b7a654a0c0a968159db9ceb0dda", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0x956810cc3e5098e48cdb9409f48819c1eafaaa69", + "function": null, + "arguments": [ + "0xf11A61f808526B45ba797777Ab7B1DB5CC65DE0F", + "0x8aAA2CaEca30AB50d48EB0EA71b83c49A2f49791", + "0xE45Ee4046bD755330D555dFe4aDA7839a3eEb926" + ], + "transaction": { + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "gas": "0x11a6e8", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051610de2380380610de283398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e051610cc0610122600039600061010a01526000818161017a015261072f01526000818160cb015281816105f40152610682015260006101310152610cc06000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80639e3f7432116100665780639e3f743214610153578063a55f08d314610162578063b0643a2f14610175578063b2e45fdc1461019c578063c4d88adf146101bf57600080fd5b806335b96ca41461009857806335c1d701146100c6578063512dd8ba146101055780638da5cb5b1461012c575b600080fd5b6100b3702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bd565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100b36406292dcc6d60db1b81565b6100b3682ab734b9bbb0b82b1960b91b81565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6101af6101aa3660046109a0565b6101d2565b60405190151581526020016100bd565b6100b368556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816101ec5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b0316815260200184608001602081019061024791906109e3565b6001600160a01b0316815260200161026560608601604087016109e3565b6001600160a01b03168152600060208201819052604082018190526060820152608001610296610120860186610a0c565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102dc9190602401610aa0565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061031957610319610b54565b60209081029190910101526040805160078082526101008201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161033d575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103b19189019089016109e3565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061040d5761040d610b54565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b03168152602001600081526020013086606001602081019061047291906109e3565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104d0576104d0610b54565b602002602001018190525060405180608001604052808560200160208101906104f991906109e3565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185600001602081019061053091906109e3565b61054060808801606089016109e3565b8760a001358860c0013560405160240161055d9493929190610b6a565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b179052905281518290600290811061059e5761059e610b54565b602002602001018190525060405180608001604052808560600160208101906105c791906109e3565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061066a5761066a610b54565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106d69190610b93565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061071757610717610b54565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b031681526020016000815260200185602001602081019061078591906109e3565b30600160001960405160240161079e9493929190610b6a565b60408051601f198184030181529190526020810180516001600160e01b031663146ad81760e21b17905290528151829060059081106107df576107df610b54565b6020026020010181905250604051806080016040528085602001602081019061080891906109e3565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a00135306040516024016108559291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b179052905281518290600690811061089657610896610b54565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906108d1908490600401610bf8565b600060405180830381600087803b1580156108eb57600080fd5b505af11580156108ff573d6000803e3d6000fd5b506109149250505060408501602086016109e3565b6001600160a01b031661092a60208601866109e3565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d61096460608801604089016109e3565b61097460a0890160808a016109e3565b8860a001358960c0013560405161098e9493929190610b6a565b60405180910390a35060019392505050565b6000602082840312156109b257600080fd5b813567ffffffffffffffff8111156109c957600080fd5b820161014081850312156109dc57600080fd5b9392505050565b6000602082840312156109f557600080fd5b81356001600160a01b03811681146109dc57600080fd5b6000808335601e19843603018112610a2357600080fd5b83018035915067ffffffffffffffff821115610a3e57600080fd5b602001915036819003821315610a5357600080fd5b9250929050565b6000815180845260005b81811015610a8057602081850181015186830182015201610a64565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610ad160608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610b4c610140840182610a5a565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610bec57603f19878603018452610bd7858351610a5a565b94506020938401939190910190600101610bbb565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610bec57868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290610c7490870182610a5a565b9550506020938401939190910190600101610c2056fea2646970667358221220a8d5f2af696debe6f1f2e5efd38d0323317e783879c02e8f17aa598ac7ad3a4564736f6c634300081a0033000000000000000000000000f11a61f808526b45ba797777ab7b1db5cc65de0f0000000000000000000000008aaa2caeca30ab50d48eb0ea71b83c49a2f49791000000000000000000000000e45ee4046bd755330d555dfe4ada7839a3eeb926", + "nonce": "0x1", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x15eeed", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x3a740148665f38f48c2894dbb7e45100e9142b7a654a0c0a968159db9ceb0dda", + "transactionIndex": "0x6", + "blockHash": "0xbfe0a3bf3215a0702c42df82c642378cdbe852f306358f6e8951d2ed6571758c", + "blockNumber": "0xe48a4b3", + "gasUsed": "0xd324f", + "effectiveGasPrice": "0x8a04850", + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "to": null, + "contractAddress": "0x956810cc3e5098e48cdb9409f48819c1eafaaa69", + "gasUsedForL1": "0xe700", + "l1BlockNumber": "0x1383763" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722849403, + "chain": 42161, + "commit": "8b6128a" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/42161/run-1722943201.json b/broadcast/DeployLiquidator.sol/42161/run-1722943201.json new file mode 100644 index 0000000..e190571 --- /dev/null +++ b/broadcast/DeployLiquidator.sol/42161/run-1722943201.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0x0b0543b22b834f632d0f4678a932fd1f4ead2345b800916c42282ee858648cd5", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0xfcab30d2559e9984b341d290f2aeb60d74abcf40", + "function": null, + "arguments": [ + "0xf11A61f808526B45ba797777Ab7B1DB5CC65DE0F", + "0x8aAA2CaEca30AB50d48EB0EA71b83c49A2f49791", + "0xE45Ee4046bD755330D555dFe4aDA7839a3eEb926" + ], + "transaction": { + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "gas": "0x140cdf", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051610ea3380380610ea383398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e051610d81610122600039600061010a01526000818161017a015261072f01526000818160cb015281816105f40152610682015260006101310152610d816000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80639e3f7432116100665780639e3f743214610153578063a55f08d314610162578063b0643a2f14610175578063b2e45fdc1461019c578063c4d88adf146101bf57600080fd5b806335b96ca41461009857806335c1d701146100c6578063512dd8ba146101055780638da5cb5b1461012c575b600080fd5b6100b3702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bd565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100b36406292dcc6d60db1b81565b6100b3682ab734b9bbb0b82b1960b91b81565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6101af6101aa366004610a61565b6101d2565b60405190151581526020016100bd565b6100b368556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816101ec5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b031681526020018460800160208101906102479190610aa4565b6001600160a01b031681526020016102656060860160408701610aa4565b6001600160a01b03168152600060208201819052604082018190526060820152608001610296610120860186610acd565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102dc9190602401610b61565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061031957610319610c15565b60209081029190910101526040805160088082526101208201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161033d575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103b1918901908901610aa4565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061040d5761040d610c15565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b0316815260200160008152602001308660600160208101906104729190610aa4565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104d0576104d0610c15565b602002602001018190525060405180608001604052808560200160208101906104f99190610aa4565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560000160208101906105309190610aa4565b6105406080880160608901610aa4565b8760a001358860c0013560405160240161055d9493929190610c2b565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b179052905281518290600290811061059e5761059e610c15565b602002602001018190525060405180608001604052808560600160208101906105c79190610aa4565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061066a5761066a610c15565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106d69190610c54565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061071757610717610c15565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b03168152602001600081526020018560200160208101906107859190610aa4565b30600160001960405160240161079e9493929190610c2b565b60408051601f198184030181529190526020810180516001600160e01b031663146ad81760e21b17905290528151829060059081106107df576107df610c15565b602002602001018190525060405180608001604052808560400160208101906108089190610aa4565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185602001602081019061083f9190610aa4565b6040516001600160a01b03909116602482015260a0870135604482015260640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905290528151829060069081106108a0576108a0610c15565b602002602001018190525060405180608001604052808560200160208101906108c99190610aa4565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a00135306040516024016109169291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b179052905281518290600790811061095757610957610c15565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a490610992908490600401610cb9565b600060405180830381600087803b1580156109ac57600080fd5b505af11580156109c0573d6000803e3d6000fd5b506109d5925050506040850160208601610aa4565b6001600160a01b03166109eb6020860186610aa4565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d610a256060880160408901610aa4565b610a3560a0890160808a01610aa4565b8860a001358960c00135604051610a4f9493929190610c2b565b60405180910390a35060019392505050565b600060208284031215610a7357600080fd5b813567ffffffffffffffff811115610a8a57600080fd5b82016101408185031215610a9d57600080fd5b9392505050565b600060208284031215610ab657600080fd5b81356001600160a01b0381168114610a9d57600080fd5b6000808335601e19843603018112610ae457600080fd5b83018035915067ffffffffffffffff821115610aff57600080fd5b602001915036819003821315610b1457600080fd5b9250929050565b6000815180845260005b81811015610b4157602081850181015186830182015201610b25565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610b9260608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610c0d610140840182610b1b565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610cad57603f19878603018452610c98858351610b1b565b94506020938401939190910190600101610c7c565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610cad57868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290610d3590870182610b1b565b9550506020938401939190910190600101610ce156fea2646970667358221220394202cf126c90a20f2d95ee7fefa13e2869991d696a5cc196255be7c0eab0f264736f6c634300081a0033000000000000000000000000f11a61f808526b45ba797777ab7b1db5cc65de0f0000000000000000000000008aaa2caeca30ab50d48eb0ea71b83c49a2f49791000000000000000000000000e45ee4046bd755330d555dfe4ada7839a3eeb926", + "nonce": "0x2", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xf0171", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x0b0543b22b834f632d0f4678a932fd1f4ead2345b800916c42282ee858648cd5", + "transactionIndex": "0x1", + "blockHash": "0x9612578858fb02a3178ce4c6be7a49c338d315ca9d6da5055852e04dd4978988", + "blockNumber": "0xe4e534d", + "gasUsed": "0xf0171", + "effectiveGasPrice": "0x989680", + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "to": null, + "contractAddress": "0xfcab30d2559e9984b341d290f2aeb60d74abcf40", + "gasUsedForL1": "0x21311", + "l1BlockNumber": "0x13855c4" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722943201, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/42161/run-1722944027.json b/broadcast/DeployLiquidator.sol/42161/run-1722944027.json new file mode 100644 index 0000000..4ca0cd1 --- /dev/null +++ b/broadcast/DeployLiquidator.sol/42161/run-1722944027.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0xf3b6e4de42a61d4c2adeddb9424afbb34005c720ed35ece2c589bd5c6110763b", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0xd20c2892e9cf9248c2561581f9f037b80d79a69d", + "function": null, + "arguments": [ + "0xf11A61f808526B45ba797777Ab7B1DB5CC65DE0F", + "0x8aAA2CaEca30AB50d48EB0EA71b83c49A2f49791", + "0xE45Ee4046bD755330D555dFe4aDA7839a3eEb926" + ], + "transaction": { + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "gas": "0x1382f3", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051610dd5380380610dd583398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e051610cba61011b600039600061010a0152600061017a01526000818160cb015281816106080152610696015260006101310152610cba6000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80639e3f7432116100665780639e3f743214610153578063a55f08d314610162578063b0643a2f14610175578063b2e45fdc1461019c578063c4d88adf146101bf57600080fd5b806335b96ca41461009857806335c1d701146100c6578063512dd8ba146101055780638da5cb5b1461012c575b600080fd5b6100b3702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bd565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100b36406292dcc6d60db1b81565b6100b3682ab734b9bbb0b82b1960b91b81565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6101af6101aa3660046109c3565b6101d2565b60405190151581526020016100bd565b6100b368556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b60608152602001906001900390816101ec5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b031681526020018460800160208101906102479190610a06565b6001600160a01b031681526020016102656060860160408701610a06565b6001600160a01b03168152600060208201819052604082018190526060820152608001610296610120860186610a2f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102dc9190602401610ac3565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061031957610319610b77565b60209081029190910101526040805160078082526101008201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161033d575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103b1918901908901610a06565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061040d5761040d610b77565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b0316815260200160008152602001308660600160208101906104729190610a06565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104d0576104d0610b77565b602002602001018190525060405180608001604052808560200160208101906104f99190610a06565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560000160208101906105309190610a06565b6105406080880160608901610a06565b6040516001600160a01b0392831660248201529116604482015260a0870135606482015260c0870135608482015260a40160408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b17905290528151829060029081106105b2576105b2610b77565b602002602001018190525060405180608001604052808560600160208101906105db9190610a06565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061067e5761067e610b77565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106ea9190610b8d565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061072b5761072b610b77565b602002602001018190525060405180608001604052808560400160208101906107549190610a06565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185602001602081019061078b9190610a06565b6040516001600160a01b03909116602482015260a0870135604482015260640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905290528151829060059081106107ec576107ec610b77565b602002602001018190525060405180608001604052808560200160208101906108159190610a06565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a00135306040516024016108629291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b17905290528151829060069081106108a3576108a3610b77565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906108de908490600401610bf2565b600060405180830381600087803b1580156108f857600080fd5b505af115801561090c573d6000803e3d6000fd5b50610921925050506040850160208601610a06565b6001600160a01b03166109376020860186610a06565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d6109716060880160408901610a06565b61098160a0890160808a01610a06565b604080516001600160a01b03938416815292909116602083015260a08901359082015260c0880135606082015260800160405180910390a35060019392505050565b6000602082840312156109d557600080fd5b813567ffffffffffffffff8111156109ec57600080fd5b820161014081850312156109ff57600080fd5b9392505050565b600060208284031215610a1857600080fd5b81356001600160a01b03811681146109ff57600080fd5b6000808335601e19843603018112610a4657600080fd5b83018035915067ffffffffffffffff821115610a6157600080fd5b602001915036819003821315610a7657600080fd5b9250929050565b6000815180845260005b81811015610aa357602081850181015186830182015201610a87565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610af460608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610b6f610140840182610a7d565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610be657603f19878603018452610bd1858351610a7d565b94506020938401939190910190600101610bb5565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610be657868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290610c6e90870182610a7d565b9550506020938401939190910190600101610c1a56fea26469706673582212209eb11d55443fbb06b6d5eeb30fba0313de62b9e62ca73f6a7606755c7c61a62464736f6c634300081a0033000000000000000000000000f11a61f808526b45ba797777ab7b1db5cc65de0f0000000000000000000000008aaa2caeca30ab50d48eb0ea71b83c49a2f49791000000000000000000000000e45ee4046bd755330d555dfe4ada7839a3eeb926", + "nonce": "0x3", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x107891", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf3b6e4de42a61d4c2adeddb9424afbb34005c720ed35ece2c589bd5c6110763b", + "transactionIndex": "0x4", + "blockHash": "0xe0d6e3efb9fae1acb87d2c9bb050a89744a09ddc62ae40e59c3a7ee2142f0d4a", + "blockNumber": "0xe4e6037", + "gasUsed": "0xe94ca", + "effectiveGasPrice": "0x989680", + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "to": null, + "contractAddress": "0xd20c2892e9cf9248c2561581f9f037b80d79a69d", + "gasUsedForL1": "0x24d80", + "l1BlockNumber": "0x1385609" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722944027, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/42161/run-1722945806.json b/broadcast/DeployLiquidator.sol/42161/run-1722945806.json new file mode 100644 index 0000000..663c9b5 --- /dev/null +++ b/broadcast/DeployLiquidator.sol/42161/run-1722945806.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0xf5c3f126ea29d92560403ca5786befce51a9faf6c630fe2a58a90b4fd5340fec", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0xe95e012038d78c3582adfba4691beba3e62a4c65", + "function": null, + "arguments": [ + "0xf11A61f808526B45ba797777Ab7B1DB5CC65DE0F", + "0x8aAA2CaEca30AB50d48EB0EA71b83c49A2f49791", + "0xE45Ee4046bD755330D555dFe4aDA7839a3eEb926" + ], + "transaction": { + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "gas": "0x183f4d", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b5060405161117738038061117783398101604081905261003091610092565b336080526001600160a01b0392831660a081905291831660c05290911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100d5565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b91506100cc60408501610076565b90509250925092565b60805160a05160c05160e05161105c61011b60003960006101150152600061018501526000818160d60152818161061201526106a00152600061013c015261105c6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a55f08d311610066578063a55f08d31461016d578063b0643a2f14610180578063b2e45fdc146101a7578063c37be663146101ca578063c4d88adf146101dd57600080fd5b806335b96ca4146100a357806335c1d701146100d1578063512dd8ba146101105780638da5cb5b146101375780639e3f74321461015e575b600080fd5b6100be702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020015b60405180910390f35b6100f87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c8565b6100f87f000000000000000000000000000000000000000000000000000000000000000081565b6100f87f000000000000000000000000000000000000000000000000000000000000000081565b6100be6406292dcc6d60db1b81565b6100be682ab734b9bbb0b82b1960b91b81565b6100f87f000000000000000000000000000000000000000000000000000000000000000081565b6101ba6101b5366004610d3c565b6101f0565b60405190151581526020016100c8565b6101ba6101d8366004610d3c565b6109b7565b6100be68556e6973776170563360b81b81565b604080516001808252818301909252600091829190816020015b606081526020019060019003908161020a5790505090506040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b031681526020018460800160208101906102659190610d7f565b6001600160a01b031681526020016102836060860160408701610d7f565b6001600160a01b031681526000602082018190526040820181905260608201526080016102b4610120860186610da8565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516102fa9190602401610e3c565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061033757610337610ef0565b60209081029190910101526040805160078082526101008201909252600091816020015b604080516080810182526000808252602080830182905292820152606080820152825260001990920191018161035b575050604080516080810182526001546001600160a01b03168152600060208083018290528284019190915292935091606083019130916103cf918901908901610d7f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061042b5761042b610ef0565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b0316815260200160008152602001308660600160208101906104909190610d7f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b17905290528151829060019081106104ee576104ee610ef0565b602002602001018190525060405180608001604052808560200160208101906105179190610d7f565b6001600160a01b03168152602001306001600160a01b031681526020016000815260200185600001602081019061054e9190610d7f565b61055e6080880160608901610d7f565b8760a001358860c0013560405160240161057b9493929190610f06565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b17905290528151829060029081106105bc576105bc610ef0565b602002602001018190525060405180608001604052808560600160208101906105e59190610d7f565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b179052905281518290600390811061068857610688610ef0565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b0316815260200160008152602001836040516024016106f49190610f2f565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b179052905281518290600490811061073557610735610ef0565b6020026020010181905250604051806080016040528085604001602081019061075e9190610d7f565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560200160208101906107959190610d7f565b6040516001600160a01b03909116602482015260a0870135604482015260640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b17905290528151829060059081106107f6576107f6610ef0565b6020026020010181905250604051806080016040528085602001602081019061081f9190610d7f565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560a001353060405160240161086c9291909182526001600160a01b0316602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663acb7081560e01b17905290528151829060069081106108ad576108ad610ef0565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906108e8908490600401610f94565b600060405180830381600087803b15801561090257600080fd5b505af1158015610916573d6000803e3d6000fd5b5061092b925050506040850160208601610d7f565b6001600160a01b03166109416020860186610d7f565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d61097b6060880160408901610d7f565b61098b60a0890160808a01610d7f565b8860a001358960c001356040516109a59493929190610f06565b60405180910390a35060019392505050565b60408051600380825260808201909252600091829190816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816109d2575050604080516080810182526001546001600160a01b0316815260006020808301829052828401919091529293509160608301913091610a46918801908801610d7f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b179052905281518290600090610aa257610aa2610ef0565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b031681526020016000815260200130856060016020810190610b079190610d7f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b1790529052815182906001908110610b6557610b65610ef0565b60200260200101819052506040518060800160405280846020016020810190610b8e9190610d7f565b6001600160a01b03168152602001306001600160a01b0316815260200160008152602001846000016020810190610bc59190610d7f565b610bd56080870160608801610d7f565b8660a001358760c00135604051602401610bf29493929190610f06565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b1790529052815182906002908110610c3357610c33610ef0565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a490610c6e908490600401610f94565b600060405180830381600087803b158015610c8857600080fd5b505af1158015610c9c573d6000803e3d6000fd5b50610cb1925050506040840160208501610d7f565b6001600160a01b0316610cc76020850185610d7f565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d610d016060870160408801610d7f565b610d1160a0880160808901610d7f565b8760a001358860c00135604051610d2b9493929190610f06565b60405180910390a350600192915050565b600060208284031215610d4e57600080fd5b813567ffffffffffffffff811115610d6557600080fd5b82016101408185031215610d7857600080fd5b9392505050565b600060208284031215610d9157600080fd5b81356001600160a01b0381168114610d7857600080fd5b6000808335601e19843603018112610dbf57600080fd5b83018035915067ffffffffffffffff821115610dda57600080fd5b602001915036819003821315610def57600080fd5b9250929050565b6000815180845260005b81811015610e1c57602081850181015186830182015201610e00565b506000602082860101526020601f19601f83011685010191505092915050565b60208152815160208201526020820151604082015260006040830151610e6d60608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e083015161010083015261010083015161012080840152610ee8610140840182610df6565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610f8857603f19878603018452610f73858351610df6565b94506020938401939190910190600101610f57565b50929695505050505050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015610f8857868503603f19018452815180516001600160a01b039081168752602080830151909116908701526040808201519087015260609081015160809187018290529061101090870182610df6565b9550506020938401939190910190600101610fbc56fea264697066735822122070fed032132792f705487ac7e1c74ffccbc92045bc31d0fa36475678e4e8197e64736f6c634300081a0033000000000000000000000000f11a61f808526b45ba797777ab7b1db5cc65de0f0000000000000000000000008aaa2caeca30ab50d48eb0ea71b83c49a2f49791000000000000000000000000e45ee4046bd755330d555dfe4ada7839a3eeb926", + "nonce": "0x4", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x144d71", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf5c3f126ea29d92560403ca5786befce51a9faf6c630fe2a58a90b4fd5340fec", + "transactionIndex": "0x2", + "blockHash": "0x4078b6a8202e7fc66e5a3daafa32a49212f345d0fc72d7c1c0bfeaf847bd6f01", + "blockNumber": "0xe4e7bd5", + "gasUsed": "0x11c618", + "effectiveGasPrice": "0xb8f790", + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "to": null, + "contractAddress": "0xe95e012038d78c3582adfba4691beba3e62a4c65", + "gasUsedForL1": "0x26df5", + "l1BlockNumber": "0x138569d" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722945806, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/DeployLiquidator.sol/42161/run-latest.json b/broadcast/DeployLiquidator.sol/42161/run-latest.json new file mode 100644 index 0000000..fdc9731 --- /dev/null +++ b/broadcast/DeployLiquidator.sol/42161/run-latest.json @@ -0,0 +1,53 @@ +{ + "transactions": [ + { + "hash": "0x6b6608837d5b060e381476c89a8526f9665da6e658ec8bdfad458203701a1698", + "transactionType": "CREATE", + "contractName": "Liquidator", + "contractAddress": "0xceba76639f653e1c2adeebd79e67506961bee6f1", + "function": null, + "arguments": [ + "0xeC5DF17559e6E4172b82FcD8Df84D425748f6dd2", + "0xD36C60B1ae52E78601C85542e40e81B27df4ED1C", + "0x8aAA2CaEca30AB50d48EB0EA71b83c49A2f49791", + "0xE45Ee4046bD755330D555dFe4aDA7839a3eEb926" + ], + "transaction": { + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "gas": "0x474ff2", + "value": "0x0", + "input": "0x61010060405234801561001157600080fd5b50604051612d90380380612d9083398101604081905261003091610093565b6001600160a01b0393841660805291831660a081905290831660c052911660e0819052600080546001600160a01b03199081169093179055600180549092161790556100e7565b80516001600160a01b038116811461008e57600080fd5b919050565b600080600080608085870312156100a957600080fd5b6100b285610077565b93506100c060208601610077565b92506100ce60408601610077565b91506100dc60608601610077565b905092959194509250565b60805160a05160c05160e051612c3861015860003960006101ce0152600061029a01526000818161012c015281816106a70152818161073201528181610c8801528181610d16015281816115110152818161159c01528181611a620152611af00152600061022a0152612c386000f3fe6080604052600436106100ab5760003560e01c8063512dd8ba11610064578063512dd8ba146101bc57806367e406d5146101f05780638da5cb5b146102185780639e3f74321461024c578063a357d5eb14610268578063b0643a2f1461028857600080fd5b80631538c107146100b757806335b96ca4146100e457806335c1d7011461011a578063497f3df4146101665780634db0ca4514610189578063505341bb1461019c57600080fd5b366100b257005b600080fd5b6100ca6100c53660046122d8565b6102bc565b604080519283526020830191909152015b60405180910390f35b3480156100f057600080fd5b5061010c702ab734b9bbb0b820baba37a937baba32b960791b81565b6040519081526020016100db565b34801561012657600080fd5b5061014e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100db565b610179610174366004612364565b610513565b60405190151581526020016100db565b6100ca6101973660046123d0565b61111b565b3480156101a857600080fd5b506101796101b7366004612468565b61137d565b3480156101c857600080fd5b5061014e7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101fc57600080fd5b5061014e73ff1a0f4744e8582df1ae09d5611b887b6a12925c81565b34801561022457600080fd5b5061014e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561025857600080fd5b5061010c6406292dcc6d60db1b81565b34801561027457600080fd5b50610179610283366004612468565b611ef0565b34801561029457600080fd5b5061014e7f000000000000000000000000000000000000000000000000000000000000000081565b6040805160028082526060820190925260009182918291816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816102d8579050509050604051806080016040528073ff1a0f4744e8582df1ae09d5611b887b6a12925c6001600160a01b03168152602001306001600160a01b0316815260200187815260200189896040516024016103639291906124e3565b60408051601f198184030181529190526020810180516001600160e01b0316631df3cbc560e31b1790529052815182906000906103a2576103a2612585565b60200260200101819052506040518060800160405280866001600160a01b03168152602001306001600160a01b03168152602001600081526020018560016040516024016104079291906001600160a01b039290921682521515602082015260400190565b60408051601f198184030181529190526020810180516001600160e01b031663a824bf6760e01b179052905281518290600190811061044857610448612585565b6020908102919091010152600154604051637f17c37760e01b81526000916001600160a01b031690637f17c3779089906104869086906004016125eb565b60006040518083038185885af11580156104a4573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526104cd919081019061288d565b50509050806001815181106104e4576104e4612585565b60200260200101516020015180602001905181019061050391906129eb565b909a909950975050505050505050565b60408051600380825260808201909252600091829190816020015b606081526020019060019003908161052e579050509050846101200135600103610678576040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b031681526020018660800160208101906105969190612a0f565b6001600160a01b031681526020016105b46060880160408901612a0f565b6001600160a01b031681526000602082018190526040820181905260608201526080016105e5610140880188612a33565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505091525060405161062b9190602401612a79565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061066857610668612585565b6020026020010181905250610801565b604051806101200160405280702ab734b9bbb0b820baba37a937baba32b960791b8152602001600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018660800160208101906106e79190612a0f565b6001600160a01b031681526020016107056060880160408901612a0f565b6001600160a01b031681526020016107236080880160608901612a0f565b6001600160a01b0390811682527f000000000000000000000000000000000000000000000000000000000000000016602082015260a08701356040820152606001610772610140880188612a33565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516107b89190602401612a79565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b179052815182906000906107f5576107f5612585565b60200260200101819052505b6108116060860160408701612a0f565b6108216040870160208801612a0f565b6040516001600160a01b0392831660248201529116604482015260a0860135606482015230608482015260a40160408051601f198184030181529190526020810180516001600160e01b03166314b685e960e21b17905281518290600190811061088d5761088d612585565b60209081029190910101526108a86060860160408701612a0f565b60006108bc61018088016101608901612a0f565b6040516001600160a01b0393841660248201526044810192909252909116606482015260840160408051601f198184030181529190526020810180516001600160e01b031663dc2c256f60e01b17905281518290600290811061092157610921612585565b60209081029190910101526040805160078082526101008201909252600091816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816109455750506040805160808101825273ff1a0f4744e8582df1ae09d5611b887b6a12925c8152306020820152348183015290519192509060608201906109be90889088906024016124e3565b60408051601f198184030181529190526020810180516001600160e01b0316631df3cbc560e31b1790529052815182906000906109fd576109fd612585565b602090810291909101810191909152604080516080810182526001546001600160a01b031681526000818401819052818301529160608301913091610a46918b01908b01612a0f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b1790529052815182906001908110610aa457610aa4612585565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b031681526020016000815260200130886060016020810190610b099190612a0f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b1790529052815182906002908110610b6757610b67612585565b60200260200101819052506040518060800160405280876020016020810190610b909190612a0f565b6001600160a01b03168152602001306001600160a01b0316815260200160008152602001876000016020810190610bc79190612a0f565b610bd760808a0160608b01612a0f565b8960a001356000604051602401610bf19493929190612b25565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b1790529052815182906003908110610c3257610c32612585565b60200260200101819052506040518060800160405280876060016020810190610c5b9190612a0f565b6001600160a01b039081168252306020830181905260006040808501919091525160e08b013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b1790529052815182906004908110610cfe57610cfe612585565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b031681526020016000815260200183604051602401610d6a9190612b4e565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b1790529052815182906005908110610dab57610dab612585565b60200260200101819052506040518060800160405280876060016020810190610dd49190612a0f565b6001600160a01b0316815230602082015260006040820152606001610e0161018089016101608a01612a0f565b610e1360e08a013560c08b0135612ba7565b6040516001600160a01b039092166024830152604482015260640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b1790529052815182906006908110610e6f57610e6f612585565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4903490610eac9085906004016125eb565b6000604051808303818588803b158015610ec557600080fd5b505af1158015610ed9573d6000803e3d6000fd5b50610ef09350506040890191505060208801612a0f565b6001600160a01b0316610f066020880188612a0f565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d610f4060608a0160408b01612a0f565b610f5060a08b0160808c01612a0f565b8a60a001358b60c00135604051610f6a9493929190612b25565b60405180910390a36000610f846080880160608901612a0f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee9190612bce565b111561110f576110046080870160608801612a0f565b6001600160a01b031663a9059cbb61102461018089016101608a01612a0f565b61103460808a0160608b01612a0f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561107a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109e9190612bce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d9190612be7565b505b50600195945050505050565b6040805160028082526060820190925260009182918291816020015b6040805160808101825260008082526020808301829052928201526060808201528252600019909201910181611137579050509050604051806080016040528073ff1a0f4744e8582df1ae09d5611b887b6a12925c6001600160a01b03168152602001306001600160a01b031681526020018981526020018b8b6040516024016111c29291906124e3565b60408051601f198184030181529190526020810180516001600160e01b0316631df3cbc560e31b17905290528151829060009061120157611201612585565b60200260200101819052506040518060800160405280886001600160a01b03168152602001306001600160a01b031681526020016000815260200187878760405160240161126f939291906001600160a01b0393841681529183166020830152909116604082015260600190565b60408051601f198184030181529190526020810180516001600160e01b0316634455378960e11b17905290528151829060019081106112b0576112b0612585565b6020908102919091010152600154604051637f17c37760e01b81526000916001600160a01b031690637f17c377908b906112ee9086906004016125eb565b60006040518083038185885af115801561130c573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052611335919081019061288d565b505090508060018151811061134c5761134c612585565b60200260200101516020015180602001905181019061136b91906129eb565b909c909b509950505050505050505050565b60408051600380825260808201909252600091829190816020015b60608152602001906001900390816113985790505090508261012001356001036114e2576040518061012001604052806406292dcc6d60db1b81526020016000815260200160006001600160a01b031681526020018460800160208101906114009190612a0f565b6001600160a01b0316815260200161141e6060860160408701612a0f565b6001600160a01b0316815260006020820181905260408201819052606082015260800161144f610140860186612a33565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516114959190602401612a79565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b179052815182906000906114d2576114d2612585565b602002602001018190525061166b565b604051806101200160405280702ab734b9bbb0b820baba37a937baba32b960791b8152602001600181526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018460800160208101906115519190612a0f565b6001600160a01b0316815260200161156f6060860160408701612a0f565b6001600160a01b0316815260200161158d6080860160608701612a0f565b6001600160a01b0390811682527f000000000000000000000000000000000000000000000000000000000000000016602082015260a085013560408201526060016115dc610140860186612a33565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516116229190602401612a79565b60408051601f198184030181529190526020810180516001600160e01b03166351915cd760e01b1790528151829060009061165f5761165f612585565b60200260200101819052505b61167b6060840160408501612a0f565b61168b6040850160208601612a0f565b6040516001600160a01b0392831660248201529116604482015260a0840135606482015230608482015260a40160408051601f198184030181529190526020810180516001600160e01b03166314b685e960e21b1790528151829060019081106116f7576116f7612585565b60209081029190910101526117126060840160408501612a0f565b600061172661018086016101608701612a0f565b6040516001600160a01b0393841660248201526044810192909252909116606482015260840160408051601f198184030181529190526020810180516001600160e01b031663dc2c256f60e01b17905281518290600290811061178b5761178b612585565b602090810291909101015260408051600680825260e08201909252600091816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816117ae575050604080516080810182526001546001600160a01b0316815260006020808301829052828401919091529293509160608301913091611822918901908901612a0f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b17905290528151829060009061187e5761187e612585565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b0316815260200160008152602001308660600160208101906118e39190612a0f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b179052905281518290600190811061194157611941612585565b6020026020010181905250604051806080016040528085602001602081019061196a9190612a0f565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018560000160208101906119a19190612a0f565b6119b16080880160608901612a0f565b8760a0013560006040516024016119cb9493929190612b25565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b1790529052815182906002908110611a0c57611a0c612585565b60200260200101819052506040518060800160405280856060016020810190611a359190612a0f565b6001600160a01b039081168252306020830181905260006040808501919091525160e089013560248201527f00000000000000000000000000000000000000000000000000000000000000009092166044830152606482015260609091019060840160408051601f198184030181529190526020810180516001600160e01b0316632d182be560e21b1790529052815182906003908110611ad857611ad8612585565b602002602001018190525060405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001306001600160a01b031681526020016000815260200183604051602401611b449190612b4e565b60408051601f198184030181529190526020810180516001600160e01b0316631592ca1b60e31b1790529052815182906004908110611b8557611b85612585565b60200260200101819052506040518060800160405280856060016020810190611bae9190612a0f565b6001600160a01b0316815230602082015260006040820152606001611bdb61018087016101608801612a0f565b611bed60e088013560c0890135612ba7565b6040516001600160a01b039092166024830152604482015260640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b1790529052815182906005908110611c4957611c49612585565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a490611c849084906004016125eb565b600060405180830381600087803b158015611c9e57600080fd5b505af1158015611cb2573d6000803e3d6000fd5b50611cc7925050506040850160208601612a0f565b6001600160a01b0316611cdd6020860186612a0f565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d611d176060880160408901612a0f565b611d2760a0890160808a01612a0f565b8860a001358960c00135604051611d419493929190612b25565b60405180910390a36000611d5b6080860160608701612a0f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190612bce565b1115611ee657611ddb6080850160608601612a0f565b6001600160a01b031663a9059cbb611dfb61018087016101608801612a0f565b611e0b6080880160608901612a0f565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190612bce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190612be7565b505b5060019392505050565b60408051600380825260808201909252600091829190816020015b6040805160808101825260008082526020808301829052928201526060808201528252600019909201910181611f0b575050604080516080810182526001546001600160a01b0316815260006020808301829052828401919091529293509160608301913091611f7f918801908801612a0f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b03166330da145b60e21b179052905281518290600090611fdb57611fdb612585565b60200260200101819052506040518060800160405280600160009054906101000a90046001600160a01b03166001600160a01b0316815260200160006001600160a01b0316815260200160008152602001308560600160208101906120409190612a0f565b6040516001600160a01b0392831660248201529116604482015260640160408051601f198184030181529190526020810180516001600160e01b0316636a27f72d60e11b179052905281518290600190811061209e5761209e612585565b602002602001018190525060405180608001604052808460200160208101906120c79190612a0f565b6001600160a01b03168152602001306001600160a01b03168152602001600081526020018460000160208101906120fe9190612a0f565b61210e6080870160608801612a0f565b8660a001358760c0013560405160240161212b9493929190612b25565b60408051601f198184030181529190526020810180516001600160e01b031663304d095d60e21b179052905281518290600290811061216c5761216c612585565b602090810291909101015260015460405163305ab9e960e21b81526001600160a01b039091169063c16ae7a4906121a79084906004016125eb565b600060405180830381600087803b1580156121c157600080fd5b505af11580156121d5573d6000803e3d6000fd5b506121ea925050506040840160208501612a0f565b6001600160a01b03166122006020850185612a0f565b6001600160a01b03167f64f7c2c46814e079964a1934953e50adc025dc52cdbeb7d8e478e9fb9bfd2c2d61223a6060870160408801612a0f565b61224a60a0880160808901612a0f565b8760a001358860c001356040516122649493929190612b25565b60405180910390a350600192915050565b60008083601f84011261228757600080fd5b5081356001600160401b0381111561229e57600080fd5b6020830191508360208260051b85010111156122b957600080fd5b9250929050565b6001600160a01b03811681146122d557600080fd5b50565b6000806000806000608086880312156122f057600080fd5b85356001600160401b0381111561230657600080fd5b61231288828901612275565b90965094505060208601359250604086013561232d816122c0565b9150606086013561233d816122c0565b809150509295509295909350565b6000610180828403121561235e57600080fd5b50919050565b60008060006040848603121561237957600080fd5b83356001600160401b0381111561238f57600080fd5b61239b8682870161234b565b93505060208401356001600160401b038111156123b757600080fd5b6123c386828701612275565b9497909650939450505050565b600080600080600080600060c0888a0312156123eb57600080fd5b87356001600160401b0381111561240157600080fd5b61240d8a828b01612275565b909850965050602088013594506040880135612428816122c0565b93506060880135612438816122c0565b92506080880135612448816122c0565b915060a0880135612458816122c0565b8091505092959891949750929550565b60006020828403121561247a57600080fd5b81356001600160401b0381111561249057600080fd5b61249c8482850161234b565b949350505050565b634e487b7160e01b600052604160045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020808252810182905260006040600584901b830181019083018583601e1936839003015b8782101561257857868503603f19018452823581811261252757600080fd5b89016020810190356001600160401b0381111561254357600080fd5b80360382131561255257600080fd5b61255d8782846124ba565b96505050602083019250602084019350600182019150612508565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60005b838110156125b657818101518382015260200161259e565b50506000910152565b600081518084526125d781602086016020860161259b565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561267d57868503603f19018452815180516001600160a01b0390811687526020808301519091169087015260408082015190870152606090810151608091870182905290612667908701826125bf565b9550506020938401939190910190600101612613565b50929695505050505050565b604051606081016001600160401b03811182821017156126ab576126ab6124a4565b60405290565b604080519081016001600160401b03811182821017156126ab576126ab6124a4565b604051601f8201601f191681016001600160401b03811182821017156126fb576126fb6124a4565b604052919050565b60006001600160401b0382111561271c5761271c6124a4565b5060051b60200190565b8051801515811461273657600080fd5b919050565b600082601f83011261274c57600080fd5b81516001600160401b03811115612765576127656124a4565b612778601f8201601f19166020016126d3565b81815284602083860101111561278d57600080fd5b61249c82602083016020870161259b565b600082601f8301126127af57600080fd5b81516127c26127bd82612703565b6126d3565b8082825260208201915060208360051b8601019250858311156127e457600080fd5b602085015b838110156128835780516001600160401b0381111561280757600080fd5b86016060818903601f1901121561281d57600080fd5b612825612689565b6020820151612833816122c0565b815261284160408301612726565b602082015260608201516001600160401b0381111561285f57600080fd5b61286e8a60208386010161273b565b604083015250845250602092830192016127e9565b5095945050505050565b6000806000606084860312156128a257600080fd5b83516001600160401b038111156128b857600080fd5b8401601f810186136128c957600080fd5b80516128d76127bd82612703565b8082825260208201915060208360051b8501019250888311156128f957600080fd5b602084015b8381101561298c5780516001600160401b0381111561291c57600080fd5b85016040818c03601f1901121561293257600080fd5b61293a6126b1565b61294660208301612726565b815260408201516001600160401b0381111561296157600080fd5b6129708d60208386010161273b565b60208301525080855250506020830192506020810190506128fe565b508096505050505060208401516001600160401b038111156129ad57600080fd5b6129b98682870161279e565b92505060408401516001600160401b038111156129d557600080fd5b6129e18682870161279e565b9150509250925092565b600080604083850312156129fe57600080fd5b505080516020909101519092909150565b600060208284031215612a2157600080fd5b8135612a2c816122c0565b9392505050565b6000808335601e19843603018112612a4a57600080fd5b8301803591506001600160401b03821115612a6457600080fd5b6020019150368190038213156122b957600080fd5b60208152815160208201526020820151604082015260006040830151612aaa60608401826001600160a01b03169052565b5060608301516001600160a01b03811660808401525060808301516001600160a01b03811660a08401525060a08301516001600160a01b03811660c08401525060c08301516001600160a01b03811660e08401525060e08301516101008301526101008301516101208084015261249c6101408401826125bf565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b8281101561267d57603f19878603018452612b928583516125bf565b94506020938401939190910190600101612b76565b81810381811115612bc857634e487b7160e01b600052601160045260246000fd5b92915050565b600060208284031215612be057600080fd5b5051919050565b600060208284031215612bf957600080fd5b612a2c8261272656fea26469706673582212208ca3399d23fef52a84701016cf379a77a905fbb4dc0b6201c389eaa0996cf53964736f6c634300081a0033000000000000000000000000ec5df17559e6e4172b82fcd8df84d425748f6dd2000000000000000000000000d36c60b1ae52e78601c85542e40e81b27df4ed1c0000000000000000000000008aaa2caeca30ab50d48eb0ea71b83c49a2f49791000000000000000000000000e45ee4046bd755330d555dfe4ada7839a3eeb926", + "nonce": "0x45", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x44d270", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x6b6608837d5b060e381476c89a8526f9665da6e658ec8bdfad458203701a1698", + "transactionIndex": "0x6", + "blockHash": "0xb0569d8f28f0b7f72fff03d72c1d26524563c0f1ad91d1105881ca108ce7e93c", + "blockNumber": "0xee6f5e8", + "gasUsed": "0x34bf07", + "effectiveGasPrice": "0x989680", + "from": "0xec5df17559e6e4172b82fcd8df84d425748f6dd2", + "to": null, + "contractAddress": "0xceba76639f653e1c2adeebd79e67506961bee6f1", + "gasUsedForL1": "0xde6c0", + "l1BlockNumber": "0x13b840e" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1725458069, + "chain": 42161, + "commit": "ba8927a" +} \ No newline at end of file diff --git a/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942017.json b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942017.json new file mode 100644 index 0000000..60aa962 --- /dev/null +++ b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942017.json @@ -0,0 +1,382 @@ +{ + "transactions": [ + { + "hash": "0xb37aa9bc2151e5b85e712d003c6ebaed113af9df163b437f68d9d52d4400d235", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "function": "approve(address,uint256)", + "arguments": [ + "0x577e289F663A4E29c231135c09d6a0713ce7AAff", + "115792089237316195423570985008687907853269984665640564039457584007913129639935" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "gas": "0x18967", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "nonce": "0x67", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xe937b71e65ed3d813008dad8311d5bc59476b61e584ed98c04627200092a98e8", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "function": "approve(address,uint256)", + "arguments": [ + "0xF67F9B1042A7f419c2C0259C983FB1f75f981fD4", + "115792089237316195423570985008687907853269984665640564039457584007913129639935" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "gas": "0x1598f", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "nonce": "0x68", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "function": "deposit(uint256,address)", + "arguments": [ + "1000000", + "0xE32bfe0922D38007b47e08c8b89b1ada8e4d03Fb" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "gas": "0x41b5c", + "value": "0x0", + "input": "0x6e553f6500000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "nonce": "0x69", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "function": "deposit(uint256,address)", + "arguments": [ + "1000000000000000000", + "0xE32bfe0922D38007b47e08c8b89b1ada8e4d03Fb" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "gas": "0x39bb3", + "value": "0x0", + "input": "0x6e553f650000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "nonce": "0x6a", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x479554", + "logs": [ + { + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xdf83761264d56d41542d9c08e01e3f5a630c344383d3c2d24d6f8f0ba22e2051", + "blockNumber": "0xe4e40a6", + "transactionHash": "0xb37aa9bc2151e5b85e712d003c6ebaed113af9df163b437f68d9d52d4400d235", + "transactionIndex": "0x1c", + "logIndex": "0x49", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000080000000000000000000000800000000400000000000000000000000000000001000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000020000000000000000000000000010000000000000000002000000000000000000002000000000000000000000000000000000000000000000000000000000000010000000000000000000000000200000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xb37aa9bc2151e5b85e712d003c6ebaed113af9df163b437f68d9d52d4400d235", + "transactionIndex": "0x1c", + "blockHash": "0xdf83761264d56d41542d9c08e01e3f5a630c344383d3c2d24d6f8f0ba22e2051", + "blockNumber": "0xe4e40a6", + "gasUsed": "0x118a7", + "effectiveGasPrice": "0x989680", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "contractAddress": null, + "gasUsedForL1": "0x3ebe", + "l1BlockNumber": "0x1385560" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x7bc7f", + "logs": [ + { + "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xbb40d7cb6f8c140687d021291a322e8b2a6bc37ce54fc4e30f285248714b0c98", + "blockNumber": "0xe4e40a9", + "transactionHash": "0xe937b71e65ed3d813008dad8311d5bc59476b61e584ed98c04627200092a98e8", + "transactionIndex": "0x3", + "logIndex": "0xa", + "removed": false + } + ], + "logsBloom": "0x00000000000000000008000000000000000000040000000800000000000000800000000400000000000000000000000000000000000000000000000000200000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000010000020000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe937b71e65ed3d813008dad8311d5bc59476b61e584ed98c04627200092a98e8", + "transactionIndex": "0x3", + "blockHash": "0xbb40d7cb6f8c140687d021291a322e8b2a6bc37ce54fc4e30f285248714b0c98", + "blockNumber": "0xe4e40a9", + "gasUsed": "0xf3ff", + "effectiveGasPrice": "0x989680", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "contractAddress": null, + "gasUsedForL1": "0x3ebe", + "l1BlockNumber": "0x1385560" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x838e36", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0xe32bfe0922d38007b47e08c8b89b1ada8e4d0300000000000000000000000000", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb6e553f6500000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "logIndex": "0x46", + "removed": false + }, + { + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "logIndex": "0x47", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "logIndex": "0x48", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "logIndex": "0x49", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066b20238", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "logIndex": "0x4a", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "logIndex": "0x4b", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000080000000000000000000220800000000400000000000000000000000000000001000000000000000000000000000000400000000000000008000000000000000000000000004000000000000000000000020000000000000000000800280000000004000000000010000000000000000000000000000000001000000000000000000400000000000000000000000000000000000000000000000011000000000000020002000008000000800000002002000004000000000010000000000000000008000000001000000020020000200000000000000000000000200000000000000000000000000002020000", + "type": "0x2", + "transactionHash": "0x7682c60ffd47995e5fe56642084ac7799bbf374ccd51d3d9fc0e1e380804da27", + "transactionIndex": "0x9", + "blockHash": "0x7a144569e92b1f26da5ea0db53140f38ba37517fa8c51441291ae23a8552bf43", + "blockNumber": "0xe4e40c6", + "gasUsed": "0x30d36", + "effectiveGasPrice": "0x989680", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "contractAddress": null, + "gasUsedForL1": "0x3ebe", + "l1BlockNumber": "0x1385561" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2dbe6", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "0xe32bfe0922d38007b47e08c8b89b1ada8e4d0300000000000000000000000000", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb6e553f6500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066b2023a", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "logIndex": "0x5", + "removed": false + } + ], + "logsBloom": "0x00000000000000000008000000000000000000040000000800000000000020800000000400000000000000000000000000000000000000000000000000000000000000400000000001000008000000400000000000000000004000000000000000000000020000000000000000000800280000000004000000000010000000000000000000000000000000001000000000000008000400000000000000000000000000000000000000000000000001000000000000020000000008000000800000000002000004000000000010000000200000000008000000001000000020020000000020000004000000000000000000000000000000000000000000020000", + "type": "0x2", + "transactionHash": "0x4fed4e9d9c5e004b82fb0c862738ac8959bc2583d341661ef489bece7e4a2cb6", + "transactionIndex": "0x1", + "blockHash": "0xe07bafa4e9deaa5e26a9d720c3d5832892d402b7c42cb8083935577012d0b61b", + "blockNumber": "0xe4e40cc", + "gasUsed": "0x2dbe6", + "effectiveGasPrice": "0x989680", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "contractAddress": null, + "gasUsedForL1": "0x3ebe", + "l1BlockNumber": "0x1385561" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722942017, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942330.json b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942330.json new file mode 100644 index 0000000..2794b60 --- /dev/null +++ b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942330.json @@ -0,0 +1,339 @@ +{ + "transactions": [ + { + "hash": "0x7dcf24fd45f9f80670fc4b10b140db8606b0906ea122c345960c839d31d9a28c", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "function": "approve(address,uint256)", + "arguments": [ + "0xF67F9B1042A7f419c2C0259C983FB1f75f981fD4", + "115792089237316195423570985008687907853269984665640564039457584007913129639935" + ], + "transaction": { + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "gas": "0x13014", + "value": "0x0", + "input": "0x095ea7b3000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "nonce": "0x0", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "function": "deposit(uint256,address)", + "arguments": [ + "1000000000000000000", + "0x37B5559c63821820EaAC5FF770e5C421d6A2676B" + ], + "transaction": { + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "gas": "0x2dbb7", + "value": "0x0", + "input": "0x6e553f650000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "nonce": "0x1", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xf835806f08f79b85bc1ebe58d1d2909fe181192557a536a0bc58a666bde2522b", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "function": "enableCollateral(address,address)", + "arguments": [ + "0x37B5559c63821820EaAC5FF770e5C421d6A2676B", + "0xF67F9B1042A7f419c2C0259C983FB1f75f981fD4" + ], + "transaction": { + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "gas": "0x1deb0", + "value": "0x0", + "input": "0xd44fee5a00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "nonce": "0x2", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd8b138838929f1d9cf2f1e1e787779b459f1d35962b3fd936f165f018d37915f", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "function": "enableController(address,address)", + "arguments": [ + "0x37B5559c63821820EaAC5FF770e5C421d6A2676B", + "0x577e289F663A4E29c231135c09d6a0713ce7AAff" + ], + "transaction": { + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "gas": "0x26810", + "value": "0x0", + "input": "0xc368516c00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "nonce": "0x3", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xb5c7d", + "logs": [ + { + "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "blockHash": "0xa4ab81e62b2088296860797ddea298bb28bfdef25ab722559b2a9d57579885f5", + "blockNumber": "0xe4e458d", + "transactionHash": "0x7dcf24fd45f9f80670fc4b10b140db8606b0906ea122c345960c839d31d9a28c", + "transactionIndex": "0x5", + "logIndex": "0xa", + "removed": false + } + ], + "logsBloom": "0x00000000000000000008000000000000000000040000000800000000000000000000000000000000000000000000000000000000000000000000000000200000000000010000000001000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000200000000000000000000000000000000010000020000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7dcf24fd45f9f80670fc4b10b140db8606b0906ea122c345960c839d31d9a28c", + "transactionIndex": "0x5", + "blockHash": "0xa4ab81e62b2088296860797ddea298bb28bfdef25ab722559b2a9d57579885f5", + "blockNumber": "0xe4e458d", + "gasUsed": "0xd829", + "effectiveGasPrice": "0xa6fa18", + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "contractAddress": null, + "gasUsedForL1": "0x22e8", + "l1BlockNumber": "0x138557a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x43cd4", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "0x37b5559c63821820eaac5ff770e5c421d6a26700000000000000000000000000", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b6e553f6500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "logIndex": "0x5", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "logIndex": "0x6", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x0000000000000000000000000000000000000000000000001bc16d674ec80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066b20371", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "logIndex": "0x7", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "logIndex": "0x8", + "removed": false + } + ], + "logsBloom": "0x00000000000000000008000000000000000000040000000800000000000020000000000000000000000000000000000000000000000000000000000000000000000000410000000001000018000000400000000000000000004000000000000000000000020000000000000000000800080000000004008000000010000000000000000000000000000000001000000000000008000000000000000000000000000000000000000000000000000001000000000000020020000008000000800000008002000004000000000010000000200000000008000000001000000020000000000020000004800000000000000000000000000000000000000000020000", + "type": "0x2", + "transactionHash": "0x57cfe3160199f9aaf6f3207a4b4b25ad4420cc59a7f647cf6ec705786e3f62a4", + "transactionIndex": "0x2", + "blockHash": "0xaa2c14c08cd456fb074319b7d72ee975cf7d1b09e99e15a3865deeea99e04e77", + "blockNumber": "0xe4e45ab", + "gasUsed": "0x23549", + "effectiveGasPrice": "0xa43328", + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "contractAddress": null, + "gasUsedForL1": "0x237f", + "l1BlockNumber": "0x138557a" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x20061b", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x67cb2734834e775d6db886bf16ac03d7273b290223ee5363354b385ec5b643b0", + "0x37b5559c63821820eaac5ff770e5c421d6a26700000000000000000000000000", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x", + "blockHash": "0x16fbf880c54d6e25c2841fe312a6e93d3be7448cfd07100e4840bb88a5b6fd38", + "blockNumber": "0xe4e45b0", + "transactionHash": "0xf835806f08f79b85bc1ebe58d1d2909fe181192557a536a0bc58a666bde2522b", + "transactionIndex": "0xb", + "logIndex": "0x1d", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xf022705c827017c972043d1984cfddc7958c9f4685b4d9ce8bd68696f4381cd2", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x16fbf880c54d6e25c2841fe312a6e93d3be7448cfd07100e4840bb88a5b6fd38", + "blockNumber": "0xe4e45b0", + "transactionHash": "0xf835806f08f79b85bc1ebe58d1d2909fe181192557a536a0bc58a666bde2522b", + "transactionIndex": "0xb", + "logIndex": "0x1e", + "removed": false + } + ], + "logsBloom": "0x00000000000000000008000000000000000000040000000800000000000000000000000000020000000000040000000000000000000000000000000000000000000000010000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000004000008000000000000000000000000000002000000000001000000000000000000000000000000000000000000000000000000000020000000000000000000000000020000000000000000000008000000000000000000010000000000000000000000000001000000000000000000000000000800000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xf835806f08f79b85bc1ebe58d1d2909fe181192557a536a0bc58a666bde2522b", + "transactionIndex": "0xb", + "blockHash": "0x16fbf880c54d6e25c2841fe312a6e93d3be7448cfd07100e4840bb88a5b6fd38", + "blockNumber": "0xe4e45b0", + "gasUsed": "0x14e03", + "effectiveGasPrice": "0xa3e508", + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "contractAddress": null, + "gasUsedForL1": "0x2390", + "l1BlockNumber": "0x138557b" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x2a5036", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x9919d437ee612d4ec7bba88a7d9bc4fc36a0a23608ad6259252711a46b708af9", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockHash": "0x8cd3f328d5fe6f3e58ef36701a044d2db92cb909dc339c87251f773647bd1e28", + "blockNumber": "0xe4e45ce", + "transactionHash": "0xd8b138838929f1d9cf2f1e1e787779b459f1d35962b3fd936f165f018d37915f", + "transactionIndex": "0x14", + "logIndex": "0x2a", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x889a4d4628b31342e420737e2aeb45387087570710d26239aa8a5f13d3e829d4", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x8cd3f328d5fe6f3e58ef36701a044d2db92cb909dc339c87251f773647bd1e28", + "blockNumber": "0xe4e45ce", + "transactionHash": "0xd8b138838929f1d9cf2f1e1e787779b459f1d35962b3fd936f165f018d37915f", + "transactionIndex": "0x14", + "logIndex": "0x2b", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000020000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000010000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000010000000000000000002000000000000000000008000000000000000000010000000000000000000000000001000000000000000000000000000000000400000000000000004000000000020400000000000", + "type": "0x2", + "transactionHash": "0xd8b138838929f1d9cf2f1e1e787779b459f1d35962b3fd936f165f018d37915f", + "transactionIndex": "0x14", + "blockHash": "0x8cd3f328d5fe6f3e58ef36701a044d2db92cb909dc339c87251f773647bd1e28", + "blockNumber": "0xe4e45ce", + "gasUsed": "0x1654b", + "effectiveGasPrice": "0xa06a68", + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "contractAddress": null, + "gasUsedForL1": "0x2455", + "l1BlockNumber": "0x138557b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722942330, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942413.json b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942413.json new file mode 100644 index 0000000..4f6d3f7 --- /dev/null +++ b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722942413.json @@ -0,0 +1,155 @@ +{ + "transactions": [ + { + "hash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "function": "borrow(uint256,address)", + "arguments": [ + "500000", + "0x37B5559c63821820EaAC5FF770e5C421d6A2676B" + ], + "transaction": { + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "gas": "0x60a31", + "value": "0x0", + "input": "0x4b3fd148000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "nonce": "0x4", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xb2a5f", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0x37b5559c63821820eaac5ff770e5c421d6a26700000000000000000000000000", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b4b3fd14800000000000000000000000000000000000000000000000000000000", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0x6", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000007a120", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0x7", + "removed": false + }, + { + "address": "0xe486a6141116e47a8b6a85c2bd191225af941b6a", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000007a120", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0x8", + "removed": false + }, + { + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000007a120", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0x9", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x889a4d4628b31342e420737e2aeb45387087570710d26239aa8a5f13d3e829d4", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0xa", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000007a1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a1200000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000029ea18b4ac2bce960000000000000000000000000000000000000000000000000000000066b203cd", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0xb", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "logIndex": "0xc", + "removed": false + } + ], + "logsBloom": "0x0000000000000000000000000000000084000008000000000000000000022000000000000000000000000000000000000000000100000000000000000000000000000001000000000000001800000000000002000000000000400000000000000000000002000000000000000000080008000000000000800000001000000000000000000000000000000000100000000000000000000000084000000000000000000000000000000000004000001100000000000002002200000800000080000000a002000004000000000010000100000000000000000000001000000020000000200000000000800000400000200000000000000000000020000002020000", + "type": "0x2", + "transactionHash": "0x73080f956c454648ea885d9ab0999c87f868a5a6bb352d78228a405b1584b667", + "transactionIndex": "0x4", + "blockHash": "0x552cb7362ae83f99d5a67b81fae4b9013a61da6bd0ddaafb9885c1f8532921a0", + "blockNumber": "0xe4e4719", + "gasUsed": "0x44611", + "effectiveGasPrice": "0xb628d0", + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "contractAddress": null, + "gasUsedForL1": "0x1fff", + "l1BlockNumber": "0x1385583" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722942413, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722945742.json b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722945742.json new file mode 100644 index 0000000..d8f559b --- /dev/null +++ b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722945742.json @@ -0,0 +1,141 @@ +{ + "transactions": [ + { + "hash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "function": "deposit(uint256,address)", + "arguments": [ + "1000000", + "0xd20C2892e9cf9248c2561581F9f037b80d79a69d" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "gas": "0x3c87c", + "value": "0x0", + "input": "0x6e553f6500000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000d20c2892e9cf9248c2561581f9f037b80d79a69d", + "nonce": "0x6e", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x354cea", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0xe32bfe0922d38007b47e08c8b89b1ada8e4d0300000000000000000000000000", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb6e553f6500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "logIndex": "0x3c", + "removed": false + }, + { + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "logIndex": "0x3d", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000d20c2892e9cf9248c2561581f9f037b80d79a69d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f423d", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "logIndex": "0x3e", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000d20c2892e9cf9248c2561581f9f037b80d79a69d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f423d", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "logIndex": "0x3f", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000001e847d000000000000000000000000000000000000000000000000000000000007a1260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016e3600000000000000000000000000000000000000000033b305c5e5da8cdd9e0d84b00000000000000000000000000000000000000000000000014f518b6b67530160000000000000000000000000000000000000000000000000000000066b210c6", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "logIndex": "0x40", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "logIndex": "0x41", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000080000000000000000000220802000000400000000000000000000000000000001000000000000008000000000000000400000000000000008000000000000000000000000004000000000000000000000020000000000000000000800280000000004000000000010000000000000040000000000000000001000000000000000000400000000000000000000000000000000000000000000000011000000000000020002000008000000800000002002000004000000000010000000000000000008000000001000000020020000200000000000000000000000200000000000000000000000000002020000", + "type": "0x2", + "transactionHash": "0xf47093c9a994180db717091db372d629a9de71e04ab204c6c557002ef63d2bee", + "transactionIndex": "0x15", + "blockHash": "0xac72d7855cd6f71aa84663d90b247eba4233e91758acd0d1bae6df2ca55117fe", + "blockNumber": "0xe4e7abf", + "gasUsed": "0x29ce1", + "effectiveGasPrice": "0xa5d138", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "contractAddress": null, + "gasUsedForL1": "0x37a3", + "l1BlockNumber": "0x1385697" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722945742, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722945872.json b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722945872.json new file mode 100644 index 0000000..382340f --- /dev/null +++ b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-1722945872.json @@ -0,0 +1,270 @@ +{ + "transactions": [ + { + "hash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "function": "deposit(uint256,address)", + "arguments": [ + "1000000", + "0xe95E012038D78C3582aDFBa4691BeBA3E62A4c65" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "gas": "0x3bd43", + "value": "0x0", + "input": "0x6e553f6500000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000e95e012038d78c3582adfba4691beba3e62a4c65", + "nonce": "0x6f", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "function": "deposit(uint256,address)", + "arguments": [ + "1000000000000000000", + "0xe95E012038D78C3582aDFBa4691BeBA3E62A4c65" + ], + "transaction": { + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "gas": "0x35487", + "value": "0x0", + "input": "0x6e553f650000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000e95e012038d78c3582adfba4691beba3e62a4c65", + "nonce": "0x70", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x16e34f", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0xe32bfe0922d38007b47e08c8b89b1ada8e4d0300000000000000000000000000", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb6e553f6500000000000000000000000000000000000000000000000000000000", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "logIndex": "0x14", + "removed": false + }, + { + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "logIndex": "0x15", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e95e012038d78c3582adfba4691beba3e62a4c65" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f423d", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "logIndex": "0x16", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000e95e012038d78c3582adfba4691beba3e62a4c65" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f423d", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "logIndex": "0x17", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000002dc6ba000000000000000000000000000000000000000000000000000000000007a126000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002625a00000000000000000000000000000000000000000033b306702db45e56690a48b0000000000000000000000000000000000000000000000000df8bc0eb73ade400000000000000000000000000000000000000000000000000000000066b21148", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "logIndex": "0x18", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "logIndex": "0x19", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000080000000000000000000220800000000400010000000000000000000000000001000000000000000000000000000000400000000000000008000000000000000000000000004000000000000000000000020000000000000000000800280000000004000000000010000000000000080000000000000000001000000000000000000400000000000000000000000000000000000000000000000011000000000000020002040008000000800000002002000004000000000010000000000000000008000000001000000020020000200000000000000000000000200000000000000000000000000002020000", + "type": "0x2", + "transactionHash": "0xe391b76887b29af5478aaa5b7e32aebee91fb224b2c1e8ced48ea84f27189442", + "transactionIndex": "0x9", + "blockHash": "0x33a804ffd1ec89659b03e893334506116282e7a3c1bb7b5b3729a7e5673f4fca", + "blockNumber": "0xe4e7cb9", + "gasUsed": "0x2927c", + "effectiveGasPrice": "0xb9ce68", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "contractAddress": null, + "gasUsedForL1": "0x31a7", + "l1BlockNumber": "0x13856a2" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x24575", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "0xe32bfe0922d38007b47e08c8b89b1ada8e4d0300000000000000000000000000", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb6e553f6500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e95e012038d78c3582adfba4691beba3e62a4c65" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7", + "0x000000000000000000000000e32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "0x000000000000000000000000e95e012038d78c3582adfba4691beba3e62a4c65" + ], + "data": "0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000de0b6b3a7640000", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "logIndex": "0x3", + "removed": false + }, + { + "address": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x00000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066b21149", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000f67f9b1042a7f419c2c0259c983fb1f75f981fd4" + ], + "data": "0x", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "logIndex": "0x5", + "removed": false + } + ], + "logsBloom": "0x00000000000000000008000000000000000000040000000800000000000020800000000400010000000000000000000000000000000000000000000000000000000000400000000001000008000000400000000000000000004000000000000000000000020000000000000000000800280000000004000000000010000000000000080000000000000000001000000000000008000400000000000000000000000000000000000000000000000001000000000000020000040008000000800000000002000004000000000010000000200000000008000000001000000020020000000020000004000000000000000000000000000000000000000000020000", + "type": "0x2", + "transactionHash": "0xab52d02fce6fbc0f74e325ec2cd6468a57364dee04a38f146d3c3497544610a9", + "transactionIndex": "0x1", + "blockHash": "0xb1a8fcafea4c404f5912835b31b13b9c6547059af1d1eb1b488623f733be8b65", + "blockNumber": "0xe4e7cbc", + "gasUsed": "0x24575", + "effectiveGasPrice": "0xbbf918", + "from": "0xe32bfe0922d38007b47e08c8b89b1ada8e4d03fb", + "to": "0xf67f9b1042a7f419c2c0259c983fb1f75f981fd4", + "contractAddress": null, + "gasUsedForL1": "0x3114", + "l1BlockNumber": "0x13856a2" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1722945872, + "chain": 42161, + "commit": "ea47789" +} \ No newline at end of file diff --git a/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-latest.json b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-latest.json new file mode 100644 index 0000000..327a0c7 --- /dev/null +++ b/broadcast/LiquidationSetupWithVaultCreated.sol/42161/run-latest.json @@ -0,0 +1,155 @@ +{ + "transactions": [ + { + "hash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "function": "borrow(uint256,address)", + "arguments": [ + "500000", + "0x37B5559c63821820EaAC5FF770e5C421d6A2676B" + ], + "transaction": { + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "gas": "0x55743", + "value": "0x0", + "input": "0x4b3fd148000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "nonce": "0x3d", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x9f6c0", + "logs": [ + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0x37b5559c63821820eaac5ff770e5c421d6a26700000000000000000000000000", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b4b3fd14800000000000000000000000000000000000000000000000000000000", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0xe", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0xcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000007a120", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0xf", + "removed": false + }, + { + "address": "0xe486a6141116e47a8b6a85c2bd191225af941b6a", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000007a120", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0x10", + "removed": false + }, + { + "address": "0xaf88d065e77c8cc2239327c5edb3a432268e5831", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000007a120", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0x11", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0x889a4d4628b31342e420737e2aeb45387087570710d26239aa8a5f13d3e829d4", + "0x00000000000000000000000037b5559c63821820eaac5ff770e5c421d6a2676b", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0x12", + "removed": false + }, + { + "address": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "topics": [ + "0x80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000001f7a38e00000000000000000000000000000000000000000000000000000000001e853500000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000001d86bba0000000000000000000000000000000000000000033b7a799d3d966b2e435314000000000000000000000000000000000000000000000000051648cb3350e5940000000000000000000000000000000000000000000000000000000066cd0d18", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0x13", + "removed": false + }, + { + "address": "0xe45ee4046bd755330d555dfe4ada7839a3eeb926", + "topics": [ + "0xaea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9", + "0x000000000000000000000000577e289f663a4e29c231135c09d6a0713ce7aaff" + ], + "data": "0x", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "logIndex": "0x14", + "removed": false + } + ], + "logsBloom": "0x0000000000000000000000000000000084000008000000000000000000022000000000000000000000000000000000000000000100000000000000000000000000000001000000000000001800000000000002000000000000400000000000000000000002000000000000000000080008000000000000800000001000000000000000000000000000000000100000000000000000000000084000000000000000000000000000000000004000001100000000000002002200000800000080000000a002000004000000000010000100000000000000000000001000000020000000200000000000800000400000200000000000000000000020000002020000", + "type": "0x2", + "transactionHash": "0x421790c31dda8588e3e3299fce067d4c08d032fefb5facf5b7e9128fff1f0e88", + "transactionIndex": "0x2", + "blockHash": "0x31761f338f274798485822df0d69365643685513b573feb2ca22fe9c9e7a3e9e", + "blockNumber": "0xeb9d3fd", + "gasUsed": "0x3cd55", + "effectiveGasPrice": "0x989680", + "from": "0x37b5559c63821820eaac5ff770e5c421d6a2676b", + "to": "0x577e289f663a4e29c231135c09d6a0713ce7aaff", + "contractAddress": null, + "gasUsedForL1": "0x1543", + "l1BlockNumber": "0x13a9336" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1724714271, + "chain": 42161, + "commit": "a2339cb" +} \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..236e3d2 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,51 @@ +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Docker Compose reference guide at +# https://docs.docker.com/go/compose-spec-reference/ + +# Here the instructions define your application as a service called "server". +# This service is built from the Dockerfile in the current directory. +# You can add other services your application may depend on here, such as a +# database or a cache. For examples, see the Awesome Compose repository: +# https://github.com/docker/awesome-compose +services: + server: + build: + context: . + ports: + - 8080:8080 + env_file: + - .env + +# The commented out section below is an example of how to define a PostgreSQL +# database that your application can use. `depends_on` tells Docker Compose to +# start the database before your application. The `db-data` volume persists the +# database data between container restarts. The `db-password` secret is used +# to set the database password. You must create `db/password.txt` and add +# a password of your choosing to it before running `docker compose up`. +# depends_on: +# db: +# condition: service_healthy +# db: +# image: postgres +# restart: always +# user: postgres +# secrets: +# - db-password +# volumes: +# - db-data:/var/lib/postgresql/data +# environment: +# - POSTGRES_DB=example +# - POSTGRES_PASSWORD_FILE=/run/secrets/db-password +# expose: +# - 5432 +# healthcheck: +# test: [ "CMD", "pg_isready" ] +# interval: 10s +# timeout: 5s +# retries: 5 +# volumes: +# db-data: +# secrets: +# db-password: +# file: db/password.txt + diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..db74a82 --- /dev/null +++ b/config.yaml @@ -0,0 +1,80 @@ +# Path to save location for logs +LOGS_PATH: "logs/account_monitor_logs.log" + +# Path to save location for state +SAVE_STATE_PATH: "state/account_monitor.json" + +# Path to save location for state (in seconds) +SAVE_INTERVAL: 1800 # 30 minutes + +# Health score bounds for min/max update interval frequency +HS_LIQUIDATION: 1.0 +HS_HIGH_RISK: 1.02 +HS_SAFE: 1.2 + +# Update interval frequency (in seconds) +MIN_UPDATE_INTERVAL: 30 +HIGH_RISK_UPDATE_INTERVAL: 300 +MAX_UPDATE_INTERVAL: 3600 # 60 minutes + +# Interval for reporting low health accounts +LOW_HEALTH_REPORT_INTERVAL: 21600 # 30 minutes +SLACK_REPORT_HEALTH_SCORE: 10 + +# Threshold for excluding small positions from frequent notifications, in USD terms +SMALL_POSITION_THRESHOLD: 500000000000000000000 # 500 USD +SMALL_POSITION_REPORT_INTERVAL: 7200 # 2 hours + +ERROR_COOLDOWN: 900 + +# Bath size for scanning blocks on startup +BATCH_SIZE: 10000 +BATCH_INTERVAL: 0.1 + +# Time to wait between scanning on regular intervals +SCAN_INTERVAL: 120 # 2 minutes + +# Settings for 1INCH Quoting & other API calls +NUM_RETRIES: 3 +RETRY_DELAY: 10 + +# Acceptable amound of overswapping of collateral for 1INCH binary search +SWAP_DELTA: .001 # 1% +MAX_SEARCH_ITERATIONS: 20 +API_REQUEST_DELAY: .25 + +# EVC Deployment Block +EVC_DEPLOYMENT_BLOCK: 20529207 + +# Addresses of relevant contracts +WETH: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" +USD: "0x0000000000000000000000000000000000000348" +BTC: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + +EVC: "0x0C9a3dd6b8F28529d72d7f9cE918D493519EE383" +ORACLE_LENS: "0x500e768Ad118035bB326AD723bcA116291923D38" +SWAPPER: "0x7813D94D8276fb1658e7fC842564684005515c9e" +SWAP_VERIFIER: "0xae26485ACDDeFd486Fe9ad7C2b34169d360737c7" + +LIQUIDATOR_CONTRACT: "0xe730e2548Abf263a5B4E42ACA8F8b31Cd4045a93" + +PYTH: "0x4305FB66699C3B2702D4d05CF36551390A4c69C6" + +ETH_ADAPTER: "0x10674C8C1aE2072d4a75FE83f1E159425fd84E1D" +BTC_ADAPTER: "0x0484Df76f561443d93548D86740b5C4A826e5A33" + +# Receiver of profits +PROFIT_RECEIVER: "0x8cbB534874bab83e44a7325973D2F04493359dF8" + + +# Compiled contract paths +EVAULT_ABI_PATH: "contracts/EVault.json" +EVC_ABI_PATH: "contracts/EthereumVaultConnector.json" +LIQUIDATOR_ABI_PATH: "out/Liquidator.sol/Liquidator.json" +ORACLE_ABI_PATH: "contracts/IOracle.json" +PYTH_ABI_PATH: "contracts/IPyth.json" +ERC20_ABI_PATH: "out/IERC20.sol/IERC20.json" +ROUTER_ABI_PATH: "contracts/EulerRouter.json" + +# Chain ID +CHAIN_ID: 1 \ No newline at end of file diff --git a/contracts/DeployLiquidator.sol b/contracts/DeployLiquidator.sol new file mode 100644 index 0000000..6f35719 --- /dev/null +++ b/contracts/DeployLiquidator.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +import {Script} from "forge-std/Script.sol"; +import {Test} from "forge-std/Test.sol"; + +import {Liquidator} from "./Liquidator.sol"; + +import "forge-std/console2.sol"; + +contract DeployLiquidator is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("LIQUIDATOR_PRIVATE_KEY"); + + address swapperAddress = 0x7813D94D8276fb1658e7fC842564684005515c9e; + address swapVerifierAddress = 0xae26485ACDDeFd486Fe9ad7C2b34169d360737c7; + address evcAddress = 0x0C9a3dd6b8F28529d72d7f9cE918D493519EE383; + address pyth = 0x4305FB66699C3B2702D4d05CF36551390A4c69C6; + + address deployer = vm.addr(deployerPrivateKey); + vm.startBroadcast(deployerPrivateKey); + + uint256 beforeGas = gasleft(); + console2.log("Gas before: ", beforeGas); + console2.log("Gas price: ", tx.gasprice); + + Liquidator liquidator = new Liquidator(deployer, swapperAddress, swapVerifierAddress, evcAddress, pyth); + uint256 afterGas = gasleft(); + console2.log("Gas after: ", afterGas); + + console2.log("Total gas cost: ", (beforeGas - afterGas) * tx.gasprice); + + console2.log("Liquidator deployed at: ", address(liquidator)); + } +} diff --git a/contracts/EVault.json b/contracts/EVault.json new file mode 100644 index 0000000..196ef75 --- /dev/null +++ b/contracts/EVault.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"integrations","type":"tuple","internalType":"struct Base.Integrations","components":[{"name":"evc","type":"address","internalType":"address"},{"name":"protocolConfig","type":"address","internalType":"address"},{"name":"sequenceRegistry","type":"address","internalType":"address"},{"name":"balanceTracker","type":"address","internalType":"address"},{"name":"permit2","type":"address","internalType":"address"}]},{"name":"modules","type":"tuple","internalType":"struct Dispatch.DeployedModules","components":[{"name":"initialize","type":"address","internalType":"address"},{"name":"token","type":"address","internalType":"address"},{"name":"vault","type":"address","internalType":"address"},{"name":"borrowing","type":"address","internalType":"address"},{"name":"liquidation","type":"address","internalType":"address"},{"name":"riskManager","type":"address","internalType":"address"},{"name":"balanceForwarder","type":"address","internalType":"address"},{"name":"governance","type":"address","internalType":"address"}]}],"stateMutability":"nonpayable"},{"type":"function","name":"EVC","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"LTVBorrow","inputs":[{"name":"collateral","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"LTVFull","inputs":[{"name":"collateral","type":"address","internalType":"address"}],"outputs":[{"name":"borrowLTV","type":"uint16","internalType":"uint16"},{"name":"liquidationLTV","type":"uint16","internalType":"uint16"},{"name":"initialLiquidationLTV","type":"uint16","internalType":"uint16"},{"name":"targetTimestamp","type":"uint48","internalType":"uint48"},{"name":"rampDuration","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"LTVLiquidation","inputs":[{"name":"collateral","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"LTVList","inputs":[],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"MODULE_BALANCE_FORWARDER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_BORROWING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_GOVERNANCE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_INITIALIZE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_LIQUIDATION","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_RISKMANAGER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_TOKEN","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MODULE_VAULT","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"accountLiquidity","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"liquidation","type":"bool","internalType":"bool"}],"outputs":[{"name":"collateralValue","type":"uint256","internalType":"uint256"},{"name":"liabilityValue","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"accountLiquidityFull","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"liquidation","type":"bool","internalType":"bool"}],"outputs":[{"name":"collaterals","type":"address[]","internalType":"address[]"},{"name":"collateralValues","type":"uint256[]","internalType":"uint256[]"},{"name":"liabilityValue","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"accumulatedFees","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"accumulatedFeesAssets","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"allowance","inputs":[{"name":"holder","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"asset","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"balanceForwarderEnabled","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"balanceTrackerAddress","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"borrow","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"caps","inputs":[],"outputs":[{"name":"supplyCap","type":"uint16","internalType":"uint16"},{"name":"borrowCap","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"cash","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"checkAccountStatus","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"collaterals","type":"address[]","internalType":"address[]"}],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"type":"function","name":"checkLiquidation","inputs":[{"name":"liquidator","type":"address","internalType":"address"},{"name":"violator","type":"address","internalType":"address"},{"name":"collateral","type":"address","internalType":"address"}],"outputs":[{"name":"maxRepay","type":"uint256","internalType":"uint256"},{"name":"maxYield","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"checkVaultStatus","inputs":[],"outputs":[{"name":"","type":"bytes4","internalType":"bytes4"}],"stateMutability":"nonpayable"},{"type":"function","name":"configFlags","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"convertFees","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"convertToAssets","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"convertToShares","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"creator","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"dToken","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"debtOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"debtOfExact","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"deposit","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"disableBalanceForwarder","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"disableController","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"enableBalanceForwarder","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"feeReceiver","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"flashLoan","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"governorAdmin","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"hookConfig","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"proxyCreator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"interestAccumulator","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"interestFee","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"interestRate","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"interestRateModel","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"liquidate","inputs":[{"name":"violator","type":"address","internalType":"address"},{"name":"collateral","type":"address","internalType":"address"},{"name":"repayAssets","type":"uint256","internalType":"uint256"},{"name":"minYieldBalance","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"liquidationCoolOffTime","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"maxDeposit","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxLiquidationDiscount","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"type":"function","name":"maxMint","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxRedeem","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"maxWithdraw","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"oracle","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"permit2Address","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"previewDeposit","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"previewMint","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"previewRedeem","inputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"previewWithdraw","inputs":[{"name":"assets","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"protocolConfigAddress","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"protocolFeeReceiver","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"protocolFeeShare","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"pullDebt","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"from","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"redeem","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"repay","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"repayWithShares","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"debt","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"setCaps","inputs":[{"name":"supplyCap","type":"uint16","internalType":"uint16"},{"name":"borrowCap","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConfigFlags","inputs":[{"name":"newConfigFlags","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFeeReceiver","inputs":[{"name":"newFeeReceiver","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setGovernorAdmin","inputs":[{"name":"newGovernorAdmin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setHookConfig","inputs":[{"name":"newHookTarget","type":"address","internalType":"address"},{"name":"newHookedOps","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setInterestFee","inputs":[{"name":"newFee","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setInterestRateModel","inputs":[{"name":"newModel","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setLTV","inputs":[{"name":"collateral","type":"address","internalType":"address"},{"name":"borrowLTV","type":"uint16","internalType":"uint16"},{"name":"liquidationLTV","type":"uint16","internalType":"uint16"},{"name":"rampDuration","type":"uint32","internalType":"uint32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setLiquidationCoolOffTime","inputs":[{"name":"newCoolOffTime","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMaxLiquidationDiscount","inputs":[{"name":"newDiscount","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"skim","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"totalBorrows","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"totalBorrowsExact","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"touch","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFromMax","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"unitOfAccount","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"viewDelegate","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"withdraw","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"receiver","type":"address","internalType":"address"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BalanceForwarderStatus","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"status","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"Borrow","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConvertFees","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"protocolReceiver","type":"address","indexed":true,"internalType":"address"},{"name":"governorReceiver","type":"address","indexed":true,"internalType":"address"},{"name":"protocolShares","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"governorShares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DebtSocialized","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"EVaultCreated","inputs":[{"name":"creator","type":"address","indexed":true,"internalType":"address"},{"name":"asset","type":"address","indexed":true,"internalType":"address"},{"name":"dToken","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"GovSetCaps","inputs":[{"name":"newSupplyCap","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"newBorrowCap","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"GovSetConfigFlags","inputs":[{"name":"newConfigFlags","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"GovSetFeeReceiver","inputs":[{"name":"newFeeReceiver","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"GovSetGovernorAdmin","inputs":[{"name":"newGovernorAdmin","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"GovSetHookConfig","inputs":[{"name":"newHookTarget","type":"address","indexed":true,"internalType":"address"},{"name":"newHookedOps","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"GovSetInterestFee","inputs":[{"name":"newFee","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"GovSetInterestRateModel","inputs":[{"name":"newInterestRateModel","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"GovSetLTV","inputs":[{"name":"collateral","type":"address","indexed":true,"internalType":"address"},{"name":"borrowLTV","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"liquidationLTV","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"initialLiquidationLTV","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"targetTimestamp","type":"uint48","indexed":false,"internalType":"uint48"},{"name":"rampDuration","type":"uint32","indexed":false,"internalType":"uint32"}],"anonymous":false},{"type":"event","name":"GovSetLiquidationCoolOffTime","inputs":[{"name":"newCoolOffTime","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"GovSetMaxLiquidationDiscount","inputs":[{"name":"newDiscount","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"type":"event","name":"InterestAccrued","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Liquidate","inputs":[{"name":"liquidator","type":"address","indexed":true,"internalType":"address"},{"name":"violator","type":"address","indexed":true,"internalType":"address"},{"name":"collateral","type":"address","indexed":false,"internalType":"address"},{"name":"repayAssets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"yieldBalance","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PullDebt","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Repay","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"VaultStatus","inputs":[{"name":"totalShares","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalBorrows","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"accumulatedFees","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"cash","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"interestAccumulator","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"interestRate","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"receiver","type":"address","indexed":true,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"assets","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"E_AccountLiquidity","inputs":[]},{"type":"error","name":"E_AmountTooLargeToEncode","inputs":[]},{"type":"error","name":"E_BadAddress","inputs":[]},{"type":"error","name":"E_BadAssetReceiver","inputs":[]},{"type":"error","name":"E_BadBorrowCap","inputs":[]},{"type":"error","name":"E_BadCollateral","inputs":[]},{"type":"error","name":"E_BadFee","inputs":[]},{"type":"error","name":"E_BadMaxLiquidationDiscount","inputs":[]},{"type":"error","name":"E_BadSharesOwner","inputs":[]},{"type":"error","name":"E_BadSharesReceiver","inputs":[]},{"type":"error","name":"E_BadSupplyCap","inputs":[]},{"type":"error","name":"E_BorrowCapExceeded","inputs":[]},{"type":"error","name":"E_CheckUnauthorized","inputs":[]},{"type":"error","name":"E_CollateralDisabled","inputs":[]},{"type":"error","name":"E_ConfigAmountTooLargeToEncode","inputs":[]},{"type":"error","name":"E_ControllerDisabled","inputs":[]},{"type":"error","name":"E_DebtAmountTooLargeToEncode","inputs":[]},{"type":"error","name":"E_EmptyError","inputs":[]},{"type":"error","name":"E_ExcessiveRepayAmount","inputs":[]},{"type":"error","name":"E_FlashLoanNotRepaid","inputs":[]},{"type":"error","name":"E_Initialized","inputs":[]},{"type":"error","name":"E_InsufficientAllowance","inputs":[]},{"type":"error","name":"E_InsufficientAssets","inputs":[]},{"type":"error","name":"E_InsufficientBalance","inputs":[]},{"type":"error","name":"E_InsufficientCash","inputs":[]},{"type":"error","name":"E_InsufficientDebt","inputs":[]},{"type":"error","name":"E_InvalidLTVAsset","inputs":[]},{"type":"error","name":"E_LTVBorrow","inputs":[]},{"type":"error","name":"E_LTVLiquidation","inputs":[]},{"type":"error","name":"E_LiquidationCoolOff","inputs":[]},{"type":"error","name":"E_MinYield","inputs":[]},{"type":"error","name":"E_NoLiability","inputs":[]},{"type":"error","name":"E_NoPriceOracle","inputs":[]},{"type":"error","name":"E_NotController","inputs":[]},{"type":"error","name":"E_NotHookTarget","inputs":[]},{"type":"error","name":"E_NotSupported","inputs":[]},{"type":"error","name":"E_OperationDisabled","inputs":[]},{"type":"error","name":"E_OutstandingDebt","inputs":[]},{"type":"error","name":"E_ProxyMetadata","inputs":[]},{"type":"error","name":"E_Reentrancy","inputs":[]},{"type":"error","name":"E_RepayTooMuch","inputs":[]},{"type":"error","name":"E_SelfLiquidation","inputs":[]},{"type":"error","name":"E_SelfTransfer","inputs":[]},{"type":"error","name":"E_SupplyCapExceeded","inputs":[]},{"type":"error","name":"E_TransientState","inputs":[]},{"type":"error","name":"E_Unauthorized","inputs":[]},{"type":"error","name":"E_ViolatorLiquidityDeferred","inputs":[]},{"type":"error","name":"E_ZeroAssets","inputs":[]},{"type":"error","name":"E_ZeroShares","inputs":[]}],"bytecode":{"object":"0x61022060405234801562000011575f80fd5b506040516200601338038062006013833981016040819052620000349162000250565b815182908290829062000047816200019f565b6001600160a01b031660805250602081015162000064906200019f565b6001600160a01b031660a052604081015162000080906200019f565b6001600160a01b0390811660c0526060820151811660e05260809091015116610100525f805460ff191660011790558051620000bc906200019f565b6001600160a01b0316610120526020810151620000d9906200019f565b6001600160a01b0316610140526040810151620000f6906200019f565b6001600160a01b031661016052606081015162000113906200019f565b6001600160a01b031661018052608081015162000130906200019f565b6001600160a01b03166101a05260a08101516200014d906200019f565b6001600160a01b03166101c05260c08101516200016a906200019f565b6001600160a01b03166101e05260e081015162000187906200019f565b6001600160a01b031661020052506200039b92505050565b5f816001600160a01b03163b5f03620001cb576040516306e1f36760e31b815260040160405180910390fd5b5090565b60405160a081016001600160401b0381118282101715620001fe57634e487b7160e01b5f52604160045260245ffd5b60405290565b60405161010081016001600160401b0381118282101715620001fe57634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146200024b575f80fd5b919050565b5f808284036101a081121562000264575f80fd5b60a081121562000272575f80fd5b6200027c620001cf565b620002878562000234565b8152620002976020860162000234565b6020820152620002aa6040860162000234565b6040820152620002bd6060860162000234565b6060820152620002d06080860162000234565b60808201529250610100609f198201811315620002eb575f80fd5b620002f562000204565b91506200030560a0860162000234565b82526200031560c0860162000234565b60208301526200032860e0860162000234565b60408301526200033a81860162000234565b6060830152506200034f610120850162000234565b608082015262000363610140850162000234565b60a082015262000377610160850162000234565b60c08201526200038b610180850162000234565b60e0820152809150509250929050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051615a6b620005a85f395f8181610d300152818161104e01528181611159015281816111c00152818161120a015281816112e7015281816113510152818161137d01528181611689015261185c01525f8181610b2c0152818161123e0152818161189c01526118c701525f8181610acb01528181611422015281816114ea01526117e201525f81816108f60152818161144e015261177201525f818161071a01528181610fb4015281816112af01528181611318015281816114be015281816115aa015281816115ea015261165101525f8181610efc01528181610f4901528181610ff1015281816113e5015261170501525f8181610a0601528181610f79015261102201525f8181610c6701526117aa01525f50505f81816144ce015261465901525f50505f50505f81816111160152818161119801528181611287015281816113bd01528181611496015281816115320152818161158201528181611629015281816116dd0152818161174a0152818161182a01528181611c6001528181611e2c01528181611e56015281816120f9015281816125380152818161256201528181612cd701528181612d2e01528181613f3b01528181613f6c0152818161410c015281816141c6015281816148b001526150ba0152615a6b5ff3fe608060405260043610610603575f3560e01c806394bf804d11610311578063bf58094d1161019c578063d87f780f116100e7578063e388be7b11610092578063efdcd9741161006d578063efdcd97414610aed578063f3fdb15a146108a3578063f6e50f5814610f32575f80fd5b8063e388be7b146106a7578063ece6a7fa14610f1e578063ef8b30f7146106ea575f80fd5b8063dd62ed3e116100c2578063dd62ed3e14610ead578063e15c82ec14610ecc578063e2f206e514610eeb575f80fd5b8063d87f780f14610e7f578063d905777e146108b7578063d9d7858a14610e99575f80fd5b8063c7b0e3a311610147578063cf349b7d11610122578063cf349b7d14610dfc578063d1a3a30814610e41578063d283e75f14610e60575f80fd5b8063c7b0e3a314610daf578063cbfdd7e114610ddd578063ce96cb77146108b7575f80fd5b8063c522498311610177578063c5224983146108a3578063c63d75b6146108b7578063c6e6f59214610d90575f80fd5b8063bf58094d14610cc2578063c134257414610d52578063c4d66de814610d71575f80fd5b8063ad80ad0b1161025c578063b3d7f6b911610207578063b460af94116101e2578063b460af9414610d00578063b4cd541b14610d1f578063ba08765214610d00575f80fd5b8063b3d7f6b9146106ea578063b3f00674146108a3578063b4113ba714610a28575f80fd5b8063af06d3cf11610237578063af06d3cf14610a28578063af5aaeeb14610cc2578063b168c58f14610ce1575f80fd5b8063ad80ad0b14610c56578063ada3d56f14610c89578063aebde56b14610ca3575f80fd5b8063a75df498116102bc578063a9c8eb7e11610297578063a9c8eb7e14610c18578063ab49b7f114610c37578063acb7081514610984575f80fd5b8063a75df49814610baa578063a824bf6714610bda578063a9059cbb14610bf9575f80fd5b8063961be391116102ec578063961be391146106a7578063a55526db14610b96578063a70354a1146108a3575f80fd5b806394bf804d14610a6857806395d89b4114610667578063960b26a214610b82575f80fd5b80634b3d1223116104915780636ce98c29116103dc57806382ebd6741161038757806388aa6f121161036257806388aa6f1214610b4e5780638bcd401614610aed5780638d56c63914610a68575f80fd5b806382ebd67414610aed578063869e50c714610b07578063883e387514610b1b575f80fd5b80637c3a00fd116103b75780637c3a00fd14610aa65780637d5f2e4e14610aba5780637dc0d1d0146108a3575f80fd5b80636ce98c29146108a35780636e553f6514610a6857806370a0823114610a87575f80fd5b8063539bd5bf1161043c57806360cb90ef1161041757806360cb90ef14610a2857806364b1cdd6146108d15780636a16ef8414610a47575f80fd5b8063539bd5bf146108a3578063587f5ed7146109e15780635fa23055146109f5575f80fd5b80634cdad5061161046c5780634cdad506146106ea5780634f7e43df146109185780635296a431146109c2575f80fd5b80634b3d12231461093f5780634b3fd148146109845780634bca3d5b146109a3575f80fd5b80632b38a367116105515780633e833364116104fc57806342895567116104d757806342895567146108e557806347bd3718146106a75780634abdb95914610918575f80fd5b80633e833364146108a3578063402d267d146108b757806341233a98146108d1575f80fd5b806333708d0c1161052c57806333708d0c1461080b57806338d52e0f1461086b57806339a51be5146108a3575f80fd5b80632b38a367146107a85780632b5335c3146107d1578063313ce567146107e5575f80fd5b80630a28a477116105b157806318e22d981161058c57806318e22d98146107505780631fe8b9531461077f57806323b872dd14610789575f80fd5b80630a28a477146106ea57806314c054bc1461070957806318160ddd1461073c575f80fd5b806307a2d13a116105e157806307a2d13a14610688578063087a6007146106a7578063095ea7b3146106bb575f80fd5b806301e1d1141461060757806302d05d3f1461062e57806306fdde0314610667575b5f80fd5b348015610612575f80fd5b5061061b610f46565b6040519081526020015b60405180910390f35b348015610639575f80fd5b50610642610f46565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610625565b348015610672575f80fd5b5061067b610f75565b6040516106259190615323565b348015610693575f80fd5b5061061b6106a2366004615373565b610fa1565b3480156106b2575f80fd5b5061061b610fb1565b3480156106c6575f80fd5b506106da6106d53660046153ab565b610fdc565b6040519015158152602001610625565b3480156106f5575f80fd5b5061061b610704366004615373565b610fee565b348015610714575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610747575f80fd5b5061061b61101f565b34801561075b575f80fd5b5061076461104a565b6040805161ffff938416815292909116602083015201610625565b61078761107b565b005b348015610794575f80fd5b506106da6107a33660046153d5565b6110fe565b3480156107b3575f80fd5b506107bc611156565b60405163ffffffff9091168152602001610625565b3480156107dc575f80fd5b50610787611181565b3480156107f0575f80fd5b506107f96111f5565b60405160ff9091168152602001610625565b348015610816575f80fd5b5061082a610825366004615413565b611203565b6040805161ffff96871681529486166020860152929094169183019190915265ffffffffffff16606082015263ffffffff909116608082015260a001610625565b348015610876575f80fd5b50367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4013560601c610642565b3480156108ae575f80fd5b50610642611156565b3480156108c2575f80fd5b5061061b610704366004615413565b3480156108dc575f80fd5b5061078761123c565b3480156108f0575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610923575f80fd5b5061092c611156565b60405161ffff9091168152602001610625565b34801561094a575f80fd5b50610953611266565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610625565b34801561098f575f80fd5b5061061b61099e36600461542e565b61126f565b3480156109ae575f80fd5b506107876109bd366004615480565b6112e5565b3480156109cd575f80fd5b506107876109dc3660046154d3565b611316565b3480156109ec575f80fd5b5061061b611346565b348015610a00575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610a33575f80fd5b50610787610a42366004615548565b61134f565b348015610a52575f80fd5b50610a5b611379565b60405161062591906155b1565b348015610a73575f80fd5b5061061b610a8236600461542e565b6113a5565b348015610a92575f80fd5b5061061b610aa1366004615413565b61140d565b348015610ab1575f80fd5b5061061b611417565b348015610ac5575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610af8575f80fd5b50610787610a42366004615413565b348015610b12575f80fd5b50610787611420565b348015610b26575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610b59575f80fd5b50610b6d610b683660046155c3565b61144a565b60408051928352602083019190915201610625565b348015610b8d575f80fd5b5061061b611156565b348015610ba1575f80fd5b5061078761147f565b348015610bb5575f80fd5b5060065474010000000000000000000000000000000000000000900461ffff1661092c565b348015610be5575f80fd5b50610b6d610bf4366004615618565b6114e6565b348015610c04575f80fd5b506106da610c133660046153ab565b61151a565b348015610c23575f80fd5b50610b6d610c3236600461542e565b611569565b348015610c42575f80fd5b5061061b610c51366004615413565b6115e7565b348015610c61575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610c94575f80fd5b50610787610a42366004615644565b348015610cae575f80fd5b50610787610cbd36600461542e565b611612565b348015610ccd575f80fd5b5061092c610cdc366004615413565b611686565b348015610cec575f80fd5b50610953610cfb36600461565d565b6116b1565b348015610d0b575f80fd5b5061061b610d1a3660046156cb565b6116c5565b348015610d2a575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610d5d575f80fd5b50610787610d6c3660046156ef565b611733565b348015610d7c575f80fd5b50610787610d8b366004615413565b6117a8565b348015610d9b575f80fd5b5061061b610daa366004615373565b6117d2565b348015610dba575f80fd5b50610dce610dc9366004615618565b6117dc565b60405161062593929190615732565b348015610de8575f80fd5b506106da610df7366004615790565b611812565b348015610e07575f80fd5b50610e1061104a565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835263ffffffff909116602083015201610625565b348015610e4c575f80fd5b50610787610e5b3660046157bc565b61185a565b348015610e6b575f80fd5b5061061b610e7a366004615413565b611884565b348015610e8a575f80fd5b50610787610e5b3660046157ef565b348015610ea4575f80fd5b50610642610fb1565b348015610eb8575f80fd5b5061061b610ec7366004615790565b61188e565b348015610ed7575f80fd5b506106da610ee6366004615413565b611899565b348015610ef6575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610f29575f80fd5b506106426118c4565b348015610f3d575f80fd5b5061061b6118ef565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5090565b60607f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f610fab82611949565b92915050565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f610fe78383611a6c565b9392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b50919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f807f0000000000000000000000000000000000000000000000000000000000000000611076816118f8565b509091565b3330146110b4576040517f08e2ce1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36018060245f375f80825f6004355af490503d5f803e8080156110f6573d5ff35b3d5ffd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361114e57611147848484611b5a565b9050610fe7565b610fe7611c5d565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036111eb577f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b50565b6111f3611c5d565b565b5f6111fe611d09565b905090565b5f805f805f7f0000000000000000000000000000000000000000000000000000000000000000611232816118f8565b5091939590929450565b7f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b5f6111fe611e13565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd577f00000000000000000000000000000000000000000000000000000000000000006112d781611cef565b50610fab565b610fab611c5d565b7f000000000000000000000000000000000000000000000000000000000000000061130f81611cef565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000061134081611cef565b50505050565b5f6111fe612145565b7f00000000000000000000000000000000000000000000000000000000000000006110fa81611cef565b60607f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd577f00000000000000000000000000000000000000000000000000000000000000006112d781611cef565b5f610fab8261223d565b5f6111fe612344565b7f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b5f807f0000000000000000000000000000000000000000000000000000000000000000611476816118f8565b50935093915050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036111eb577f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b5f807f0000000000000000000000000000000000000000000000000000000000000000611512816118f8565b509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd57611562838361242a565b9050610fab565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036115d8577f00000000000000000000000000000000000000000000000000000000000000006115d281611cef565b506115e0565b6115e0611c5d565b9250929050565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361167e577f000000000000000000000000000000000000000000000000000000000000000061167981611cef565b505050565b6110fa611c5d565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b5f6116bd84848461251f565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361114e577f000000000000000000000000000000000000000000000000000000000000000061172d81611cef565b50610fe7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036117a0577f000000000000000000000000000000000000000000000000000000000000000061179a81611cef565b50611340565b611340611c5d565b7f00000000000000000000000000000000000000000000000000000000000000006110fa81611cef565b5f610fab82612693565b6060805f7f000000000000000000000000000000000000000000000000000000000000000061180a816118f8565b509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd57611562838361279a565b7f000000000000000000000000000000000000000000000000000000000000000061167981611cef565b5f610fab82612890565b5f610fe78383612996565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f6111fe612aa8565b7f1fe8b953000000000000000000000000000000000000000000000000000000005f526040360333816018015281600452805f6024375f80603883015f305afa90503d5f803e8080156110f6573d5ff35b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615611a1f57600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906119e6575033301480156119e457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15611a1d576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f611a28612bb9565b9050611a63611a5082611a3a86612c32565b6dffffffffffffffffffffffffffff1690612c7b565b6dffffffffffffffffffffffffffff1690565b9150505b919050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615611acb576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000001790555f611b1b612cbf565b9050611b28818585612db7565b5050600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055506001919050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615611bb9576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c0100000000000000000000000000000000000000000000000000000000179055611c0984612e61565b5f611c15601086612ed1565b915050611c2c818686611c2787612c32565b613118565b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905595945050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000009050604036037f1f8b5215000000000000000000000000000000000000000000000000000000005f52306004523360245234604452608060645280608452805f60a4375f8160a401525f80601f19601f84011660a4015f34865af190503d5f803e8080156110f65760403d036040f35b365f80375f80365f845af43d5f803e8080156110f6573d5ff35b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4013560601c91839182918491611d9a91615817565b5f60405180830381855afa9150503d805f8114611dd2576040519150601f19603f3d011682016040523d82523d5f602084013e611dd7565b606091505b5091509150818015611deb57506020815110155b611df6576012611e0a565b80806020019051810190611e0a9190615832565b93505050505b90565b5f3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016141580611ee357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e21e537c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee19190615852565b155b15611f1a576040517ff0991feb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611f2361319f565b90505f611f2f826132dd565b9050611f3b8282613522565b816101a00151156120eb575f6101a08301819052600280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556001546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000090920416908190505f611fca611a508760a0015171ffffffffffffffffffffffffffffffffffff166135e9565b905085610140015181118015611fdf57508181115b15612016576040517f6ef90ef100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612031836dffffffffffffffffffffffffffff871661589a565b90505f612058611a508960a0015171ffffffffffffffffffffffffffffffffffff16613631565b60808901516dffffffffffffffffffffffffffff16612077919061589a565b90508761012001518111801561208c57508181115b156120c3576040517f426073f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7c01000000000000000000000000000000000000000000000000000000006001555050505050505b61211d8261016001516140007f0000000000000000000000000000000000000000000000000000000000000000613672565b507f4b3d12230000000000000000000000000000000000000000000000000000000092915050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561221b57600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906121e2575033301480156121e057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612219576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6111fe612226612bb9565b60e001516dffffffffffffffffffffffffffff1690565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561231357600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906122da575033301480156122d857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612311576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b73ffffffffffffffffffffffffffffffffffffffff82165f908152600d60205260409020610fab90611a5090613699565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561241a57600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906123e1575033301480156123df57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612418576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6111fe612425612bb9565b6136b2565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615612489576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000001790555f6124dd60106001612ed1565b9150506124ef818286611c2787612c32565b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055949350505050565b5f3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161415806125ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e21e537c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ed9190615852565b155b15612626576040517ff0991feb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61266a612631612bb9565b858585808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506138b692505050565b507fb168c58f000000000000000000000000000000000000000000000000000000009392505050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561276957600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906127305750333014801561272e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612767576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f612772612bb9565b9050611a63611a508261278486612c32565b6dffffffffffffffffffffffffffff169061399e565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff16156127f9576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000017905561284983612e61565b5f612855601085612ed1565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600d602052604090209092506124ef9150829086908690611c2790613699565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561296657600c5473ffffffffffffffffffffffffffffffffffffffff1633811480159061292d5750333014801561292b57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612964576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b610fab611a5061297d612977612bb9565b856139ac565b71ffffffffffffffffffffffffffffffffffff166135e9565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615612a6c57600c5473ffffffffffffffffffffffffffffffffffffffff16338114801590612a3357503330148015612a3157507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612a6a576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5073ffffffffffffffffffffffffffffffffffffffff9182165f908152600d602090815260408083209390941682526002909201909152205490565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615612b7e57600c5473ffffffffffffffffffffffffffffffffffffffff16338114801590612b4557503330148015612b4357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612b7c576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f612b87612bb9565b9050612bb3611a50828360e001516dffffffffffffffffffffffffffff16612c7b90919063ffffffff16565b91505090565b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152610f71816139f5565b5f6dffffffffffffffffffffffffffff821115610f71576040517f64e0647900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f612c8784613ea8565b9092509050612cb681836dffffffffffffffffffffffffffff88160281612cb057612cb06158ad565b04612c32565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303612db2576040517f18503a1e0000000000000000000000000000000000000000000000000000000081525f60048201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906318503a1e906024016040805180830381865afa158015612d87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dab91906158da565b5092915050565b503390565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612def57505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f818152600d60209081526040808320948716808452600290950182529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff81161580612e9a575073ffffffffffffffffffffffffffffffffffffffff81166001145b156111e8576040517f9b44163600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810182905290612f4961319f565b9150612f596175bf851615613f22565b9050612f6b8261016001518583614083565b612f9873ffffffffffffffffffffffffffffffffffffffff8416600114612f9257836140aa565b816140aa565b816101a0015115801561300057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101200151148015612ffe57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101400151145b155b156115e05760016101a0830152600280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d010000000000000000000000000000000000000000000000000000000000179055608082015160a08301516115e091906130819071ffffffffffffffffffffffffffffffffffff166135e9565b6001919082547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff9283166e010000000000000000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909216929093169190911717167c0100000000000000000000000000000000000000000000000000000000179055565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361317e576040517ff2fbfb2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613189848684614207565b613194848484614345565b506001949350505050565b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152613218816139f5565b15611e105760608101516002805465ffffffffffff9092167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921691909117905560e0810151600480546dffffffffffffffffffffffffffff9283167fffffffffffffffffffffffffffffffffffff000000000000000000000000000090911617905560c082015160a083015171ffffffffffffffffffffffffffffffffffff166e0100000000000000000000000000000291161760035561010081015160055590565b6006545f9073ffffffffffffffffffffffffffffffffffffffff811690760100000000000000000000000000000000000000000000900468ffffffffffffffffff168115610fe7575f808373ffffffffffffffffffffffffffffffffffffffff163061336a88608001516dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1690565b61338e611a508a60a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60405173ffffffffffffffffffffffffffffffffffffffff909316602484015260448301919091526064820152608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fbca02c13000000000000000000000000000000000000000000000000000000001790525161343f9190615817565b5f604051808303815f865af19150503d805f8114613478576040519150601f19603f3d011682016040523d82523d5f602084013e61347d565b606091505b509150915081801561349157506020815110155b1561351957808060200190518101906134aa9190615907565b9250680fd278dfcb4529121f8311156134ca57680fd278dfcb4529121f92505b600680547fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000068ffffffffffffffffff8616021790555b50509392505050565b60c08201517f80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c906dffffffffffffffffffffffffffff1661357d611a508560a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60e08501516dffffffffffffffffffffffffffff1660808601516dffffffffffffffffffffffffffff16610100870151604080519586526020860194909452928401919091526060830152608082015260a081018390524260c082015260e00160405180910390a15050565b5f8171ffffffffffffffffffffffffffffffffffff165f0361360c57505f919050565b610fab61362c8371ffffffffffffffffffffffffffffffffffff16614778565b612c32565b5f8171ffffffffffffffffffffffffffffffffffff165f0361365457505f919050565b610fab6e01ffffffffffffffffffffffffffff601f84901c16612c32565b61368663ffffffff80851690849061479d16565b1561369057505050565b611679816147a8565b80545f906dffffffffffffffffffffffffffff16610fab565b6006545f9073ffffffffffffffffffffffffffffffffffffffff811690760100000000000000000000000000000000000000000000900468ffffffffffffffffff1681158015906137065750613706614880565b15610fe7575f808373ffffffffffffffffffffffffffffffffffffffff163061375088608001516dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1690565b613774611a508a60a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60405173ffffffffffffffffffffffffffffffffffffffff909316602484015260448301919091526064820152608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2e34c87200000000000000000000000000000000000000000000000000000000179052516138259190615817565b5f60405180830381855afa9150503d805f811461385d576040519150601f19603f3d011682016040523d82523d5f602084013e613862565b606091505b509150915081801561387657506020815110155b15613519578080602001905181019061388f9190615907565b9250680fd278dfcb4529121f8311156135195750680fd278dfcb4529121f95945050505050565b6138bf8361492e565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600d602052604090205460701c717fffffffffffffffffffffffffffffffffff16806139065750505050565b5f6139138585845f61497f565b90505f805b845181101561396b5761394687878784815181106139385761393861591e565b60200260200101515f614b51565b613950908361589a565b9150828211156139635750505050505050565b600101613918565b506040517f34373fbc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fe761362c8484614d9b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600d6020526040812054610fe7908490849060701c717fffffffffffffffffffffffffffffffffff16614dd7565b367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec810135606090811c60408401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8820135811c60208401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc490910135811c825260025465ffffffffffff811691830191909152660100000000000081046dffffffffffffffffffffffffffff1660808301525f90613ad19074010000000000000000000000000000000000000000900461ffff16614e45565b610120830152600254613b0190760100000000000000000000000000000000000000000000900461ffff16614e45565b6101408301526002547801000000000000000000000000000000000000000000000000810463ffffffff9081166101608501527d01000000000000000000000000000000000000000000000000000000000090910460ff1615156101a08401526003546dffffffffffffffffffffffffffff80821660c08601526e01000000000000000000000000000090910471ffffffffffffffffffffffffffffffffffff1660a085015260045490811660e0850152720100000000000000000000000000000000000090041661018083015260055461010083015260608201515f90613bf19065ffffffffffff164261594b565b905080156110195760065461010084015160a08501516001945074010000000000000000000000000000000000000000830461ffff1692760100000000000000000000000000000000000000000000900468ffffffffffffffffff16919071ffffffffffffffffffffffffffffffffffff165f8080613c816b033b2e3c9fd0803ce8000000808801908a90614e91565b9150915080613cb7578185029250818381613c9e57613c9e6158ad565b048503613cb7576b033b2e3c9fd0803ce8000000830494505b8484029250848381613ccb57613ccb6158ad565b048403613cea578961010001518381613ce657613ce66158ad565b0493505b50505060e087015160c088015160a08901516dffffffffffffffffffffffffffff92831692909116905f90651388000000009061ffff89169071ffffffffffffffffffffffffffffffffffff16613d41908761594b565b613d4b919061595e565b613d559190615975565b90508015613dd6575f613d6785614778565b60808c01516dffffffffffffffffffffffffffff16613d86919061589a565b9050613d92828261594b565b613d9c848361595e565b613da69190615975565b60c08c01519093506dffffffffffffffffffffffffffff16613dc8908461594b565b613dd2908561589a565b9350505b717fffffffffffffffffffffffffff800000008411613e9b57613df884614f63565b71ffffffffffffffffffffffffffffffffffff1660a08b01526101008a018590524265ffffffffffff1660608b015260c08a01516dffffffffffffffffffffffffffff168214158015613e5957506dffffffffffffffffffffffffffff8211155b15613e9b57613e6783612c32565b6dffffffffffffffffffffffffffff1660e08b0152613e8582612c32565b6dffffffffffffffffffffffffffff1660c08b01525b5050505050505050919050565b5f80620f4240613ed2611a508560a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60808501516dffffffffffffffffffffffffffff1601019150620f4240613f1a8460c001516dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1690565b019050915091565b5f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614613f6857613f686159ad565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318503a1e85613fb1575f613fb3565b305b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015614019573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061403d91906158da565b9150915083801561404c575080155b15612dab576040517f13790bf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61409763ffffffff80851690849061479d16565b156140a157505050565b61167981614fb0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff8216016140ef576140ef6159ad565b73ffffffffffffffffffffffffffffffffffffffff8116614181577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a37d54af6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561416f575f80fd5b505af115801561130f573d5f803e3d5ffd5b6040517f30f3166700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330f31667906024015f604051808303815f87803b15801561416f575f80fd5b6dffffffffffffffffffffffffffff8116158061424f57508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b1561425957505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152600d602090815260408083209386168352600284019091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461130f576dffffffffffffffffffffffffffff8316811015614301576040517f9f428ac400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6dffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff85165f90815260028401602052604090209103908190555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216614392576040517fa8af73b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6dffffffffffffffffffffffffffff81161561471d5773ffffffffffffffffffffffffffffffffffffffff83165f908152600d60205260408120908061440e83546dffffffffffffffffffffffffffff8116917f8000000000000000000000000000000000000000000000000000000000000000909116151590565b90925090506dffffffffffffffffffffffffffff8085169083161015614460576040517f7374809300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6dffffffffffffffffffffffffffff8581169084160384547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff8216178555905081156145965773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636fc4fdc1886dffffffffffffffffffffffffffff841661450d6150b7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830191909152151560448201526064015f604051808303815f87803b15801561457f575f80fd5b505af1158015614591573d5f803e3d5ffd5b505050505b73ffffffffffffffffffffffffffffffffffffffff86165f908152600d6020526040812080549095506dffffffffffffffffffffffffffff8116917f80000000000000000000000000000000000000000000000000000000000000009091161515906146028389615121565b87547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff8216178855905081156147155773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636fc4fdc18a6dffffffffffffffffffffffffffff84166040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201525f60448201526064015f604051808303815f87803b1580156146fe575f80fd5b505af1158015614710573d5f803e3d5ffd5b505050505b505050505050505b73ffffffffffffffffffffffffffffffffffffffff8083169084167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6dffffffffffffffffffffffffffff8416604051908152602001612e54565b5f601f600161478b63800000008561589a565b614795919061594b565b901c92915050565b1663ffffffff161590565b6002547c0100000000000000000000000000000000000000000000000000000000900460ff1615614805576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000017905561485581614fb0565b50600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055565b6040517fcdd8ea780000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063cdd8ea7890602401602060405180830381865afa15801561490a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fe9190615852565b602081015173ffffffffffffffffffffffffffffffffffffffff166111e8576040517f5b92337100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80614992611a5061297d888888614dd7565b9050805f036149a4575f9150506116bd565b856040015173ffffffffffffffffffffffffffffffffffffffff16865f015173ffffffffffffffffffffffffffffffffffffffff16036149e657809150614b48565b8215614a9c576020860151865160408089015190517fae68676c0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff9283166024820152908216604482015291169063ae68676c90606401602060405180830381865afa158015614a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a959190615907565b9150614b48565b6020860151865160408089015190517f0579e61f0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff92831660248201529082166044820152911690630579e61f906064016040805180830381865afa158015614b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b4491906159da565b9250505b50949350505050565b5f80614b5d8484615142565b905061ffff8116614b71575f9150506116bd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301525f91908616906370a0823190602401602060405180830381865afa158015614bde573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c029190615907565b9050805f03614c15575f925050506116bd565b5f8415614cca5760208801516040808a015190517fae68676c0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8981166024830152918216604482015291169063ae68676c90606401602060405180830381865afa158015614c9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cc39190615907565b9050614d74565b60208801516040808a015190517f0579e61f0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff89811660248301529182166044820152911690630579e61f906064016040805180830381865afa158015614d4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d7091906159da565b5090505b612710614d8561ffff85168361595e565b614d8f9190615975565b98975050505050505050565b5f805f614da784613ea8565b909250905081816dffffffffffffffffffffffffffff87160281614dcd57614dcd6158ad565b0495945050505050565b5f71ffffffffffffffffffffffffffffffffffff8216614df857505f610fe7565b61010084015173ffffffffffffffffffffffffffffffffffffffff84165f908152600d60205260409020600101546116bd9171ffffffffffffffffffffffffffffffffffff8516916151dc565b5f61ffff8216808203614e7a57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92915050565b6064603f8216600a0a600683901c02049392505050565b5f80848015614f4657600185168015614eac57869350614eb0565b8493505b508360011c8560011c95505b8515614f40578660801c15614ed45760019250614f40565b86870281810181811015614eed57600194505050614f40565b8690049750506001861615614f35578684028488820414614f18578715614f18576001935050614f40565b81810181811015614f2e57600194505050614f40565b8690049450505b8560011c9550614ebc565b50611476565b848015614f55575f9350614f59565b8493505b5050935093915050565b5f717fffffffffffffffffffffffffff80000000821115610f71576040517f9388c33400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c5473ffffffffffffffffffffffffffffffffffffffff1680615000576040517f750f881700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808273ffffffffffffffffffffffffffffffffffffffff165f368660405160200161502e939291906159fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261506691615817565b5f604051808303815f865af19150503d805f811461509f576040519150601f19603f3d011682016040523d82523d5f602084013e6150a4565b606091505b509150915081611340576113408161520e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663863789d76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561490a573d5f803e3d5ffd5b5f610fe761362c6dffffffffffffffffffffffffffff80851690861661589a565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e60209081526040808320815160a081018352905461ffff808216835262010000820481169483019490945264010000000081049093169181019190915265ffffffffffff6601000000000000830416606082015263ffffffff6c0100000000000000000000000090920482166080820152610fe791849061524f16565b5f6116bd826151ff8571ffffffffffffffffffffffffffffffffffff881661595e565b6152099190615975565b614f63565b80511561521d57805181602001fd5b6040517f2082e20000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8161525d57508151610fab565b826060015165ffffffffffff164210158061528857506020830151604084015161ffff908116911610155b1561529857506020820151610fab565b5f6152a8846040015161ffff1690565b61ffff1690505f6152be856020015161ffff1690565b61ffff1690505f42866060015165ffffffffffff16039050856080015163ffffffff168183850302816152f3576152f36158ad565b049190910195945050505050565b5f5b8381101561531b578181015183820152602001615303565b50505f910152565b602081525f8251806020840152615341816040850160208701615301565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215615383575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111e8575f80fd5b5f80604083850312156153bc575f80fd5b82356153c78161538a565b946020939093013593505050565b5f805f606084860312156153e7575f80fd5b83356153f28161538a565b925060208401356154028161538a565b929592945050506040919091013590565b5f60208284031215615423575f80fd5b8135610fe78161538a565b5f806040838503121561543f575f80fd5b8235915060208301356154518161538a565b809150509250929050565b803561ffff81168114611a67575f80fd5b803563ffffffff81168114611a67575f80fd5b5f805f8060808587031215615493575f80fd5b843561549e8161538a565b93506154ac6020860161545c565b92506154ba6040860161545c565b91506154c86060860161546d565b905092959194509250565b5f805f604084860312156154e5575f80fd5b83359250602084013567ffffffffffffffff80821115615503575f80fd5b818601915086601f830112615516575f80fd5b813581811115615524575f80fd5b876020828501011115615535575f80fd5b6020830194508093505050509250925092565b5f60208284031215615558575f80fd5b610fe78261545c565b5f815180845260208085019450602084015f5b838110156155a657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615574565b509495945050505050565b602081525f610fe76020830184615561565b5f805f606084860312156155d5575f80fd5b83356155e08161538a565b925060208401356155f08161538a565b915060408401356156008161538a565b809150509250925092565b80151581146111e8575f80fd5b5f8060408385031215615629575f80fd5b82356156348161538a565b915060208301356154518161560b565b5f60208284031215615654575f80fd5b610fe78261546d565b5f805f6040848603121561566f575f80fd5b833561567a8161538a565b9250602084013567ffffffffffffffff80821115615696575f80fd5b818601915086601f8301126156a9575f80fd5b8135818111156156b7575f80fd5b8760208260051b8501011115615535575f80fd5b5f805f606084860312156156dd575f80fd5b8335925060208401356155f08161538a565b5f805f8060808587031215615702575f80fd5b843561570d8161538a565b9350602085013561571d8161538a565b93969395505050506040820135916060013590565b606081525f6157446060830186615561565b8281036020848101919091528551808352868201928201905f5b8181101561577a5784518352938301939183019160010161575e565b5050809350505050826040830152949350505050565b5f80604083850312156157a1575f80fd5b82356157ac8161538a565b915060208301356154518161538a565b5f80604083850312156157cd575f80fd5b82356157d88161538a565b91506157e66020840161546d565b90509250929050565b5f8060408385031215615800575f80fd5b6158098361545c565b91506157e66020840161545c565b5f8251615828818460208701615301565b9190910192915050565b5f60208284031215615842575f80fd5b815160ff81168114610fe7575f80fd5b5f60208284031215615862575f80fd5b8151610fe78161560b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610fab57610fab61586d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f80604083850312156158eb575f80fd5b82516158f68161538a565b60208401519092506154518161560b565b5f60208284031215615917575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610fab57610fab61586d565b8082028115828204841417610fab57610fab61586d565b5f826159a8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f80604083850312156159eb575f80fd5b505080516020909101519092909150565b8284823760609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016910190815260140191905056fea26469706673582212203d1e6ff553411d923aedce43bd7ecdb510f6d90bed7fdded6c220608361c6c6b64736f6c63430008180033","sourceMap":"430:13141:71:-:0;;;464:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1706:16:83;;551:12:71;;565:7;;551:12;;955:32:87;1706:16:83;955:26:87;:32::i;:::-;-1:-1:-1;;;;;944:44:87;;;-1:-1:-1;1794:27:83::1;::::0;::::1;::::0;1767:55:::1;::::0;:26:::1;:55::i;:::-;-1:-1:-1::0;;;;;1734:89:83::1;;::::0;1897:29:::1;::::0;::::1;::::0;1870:57:::1;::::0;:26:::1;:57::i;:::-;-1:-1:-1::0;;;;;1833:95:83;;::::1;;::::0;1971:27:::1;::::0;::::1;::::0;1938:61;::::1;;::::0;2019:20:::1;::::0;;::::1;::::0;2009:30:::1;;::::0;2876:11:76;:18;;-1:-1:-1;;2876:18:76;2890:4;2876:18;;;2697::70;;2670:46:::1;::::0;:26:::1;:46::i;:::-;-1:-1:-1::0;;;;;2650:66:70::1;;::::0;2768:13:::1;::::0;::::1;::::0;2741:41:::1;::::0;:26:::1;:41::i;:::-;-1:-1:-1::0;;;;;2726:56:70::1;;::::0;2834:13:::1;::::0;::::1;::::0;2807:41:::1;::::0;:26:::1;:41::i;:::-;-1:-1:-1::0;;;;;2792:56:70::1;;::::0;2904:17:::1;::::0;::::1;::::0;2877:45:::1;::::0;:26:::1;:45::i;:::-;-1:-1:-1::0;;;;;2858:64:70::1;;::::0;2980:19:::1;::::0;::::1;::::0;2953:47:::1;::::0;:26:::1;:47::i;:::-;-1:-1:-1::0;;;;;2932:68:70::1;;::::0;3058:19:::1;::::0;::::1;::::0;3031:47:::1;::::0;:26:::1;:47::i;:::-;-1:-1:-1::0;;;;;3010:68:70::1;;::::0;3142:24:::1;::::0;::::1;::::0;3115:52:::1;::::0;:26:::1;:52::i;:::-;-1:-1:-1::0;;;;;3088:79:70::1;;::::0;3224:18:::1;::::0;::::1;::::0;3197:46:::1;::::0;:26:::1;:46::i;:::-;-1:-1:-1::0;;;;;3177:66:70::1;;::::0;-1:-1:-1;430:13141:71;;-1:-1:-1;;;430:13141:71;364:163:93;424:7;447:4;-1:-1:-1;;;;;447:16:93;;467:1;447:21;443:55;;477:21;;-1:-1:-1;;;477:21:93;;;;;;;;;;;443:55;-1:-1:-1;516:4:93;364:163::o;14:349:270:-;85:2;79:9;127:4;115:17;;-1:-1:-1;;;;;147:34:270;;183:22;;;144:62;141:185;;;248:10;243:3;239:20;236:1;229:31;283:4;280:1;273:15;311:4;308:1;301:15;141:185;342:2;335:22;14:349;:::o;368:347::-;435:2;429:9;477:6;465:19;;-1:-1:-1;;;;;499:34:270;;535:22;;;496:62;493:185;;;600:10;595:3;591:20;588:1;581:31;635:4;632:1;625:15;663:4;660:1;653:15;720:177;799:13;;-1:-1:-1;;;;;841:31:270;;831:42;;821:70;;887:1;884;877:12;821:70;720:177;;;:::o;902:1579::-;1046:6;1054;1098:9;1089:7;1085:23;1128:3;1124:2;1120:12;1117:32;;;1145:1;1142;1135:12;1117:32;1169:4;1165:2;1161:13;1158:33;;;1187:1;1184;1177:12;1158:33;1213:21;;:::i;:::-;1257:40;1287:9;1257:40;:::i;:::-;1250:5;1243:55;1330:49;1375:2;1364:9;1360:18;1330:49;:::i;:::-;1325:2;1318:5;1314:14;1307:73;1412:49;1457:2;1446:9;1442:18;1412:49;:::i;:::-;1407:2;1400:5;1396:14;1389:73;1494:49;1539:2;1528:9;1524:18;1494:49;:::i;:::-;1489:2;1482:5;1478:14;1471:73;1577:50;1622:3;1611:9;1607:19;1577:50;:::i;:::-;1571:3;1560:15;;1553:75;1564:5;-1:-1:-1;1671:6:270;-1:-1:-1;;1693:17:270;;1689:26;-1:-1:-1;1686:46:270;;;1728:1;1725;1718:12;1686:46;1756:17;;:::i;:::-;1741:32;;1798:51;1843:4;1832:9;1828:20;1798:51;:::i;:::-;1789:7;1782:68;1884:50;1929:3;1918:9;1914:19;1884:50;:::i;:::-;1879:2;1870:7;1866:16;1859:76;1969:50;2014:3;2003:9;1999:19;1969:50;:::i;:::-;1964:2;1955:7;1951:16;1944:76;2054:49;2099:2;2088:9;2084:18;2054:49;:::i;:::-;2049:2;2040:7;2036:16;2029:75;;2139:50;2184:3;2173:9;2169:19;2139:50;:::i;:::-;2133:3;2124:7;2120:17;2113:77;2226:50;2271:3;2260:9;2256:19;2226:50;:::i;:::-;2219:4;2210:7;2206:18;2199:78;2312:50;2357:3;2346:9;2342:19;2312:50;:::i;:::-;2306:3;2297:7;2293:17;2286:77;2398:50;2443:3;2432:9;2428:19;2398:50;:::i;:::-;2392:3;2383:7;2379:17;2372:77;2468:7;2458:17;;;902:1579;;;;;:::o;:::-;430:13141:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610603575f3560e01c806394bf804d11610311578063bf58094d1161019c578063d87f780f116100e7578063e388be7b11610092578063efdcd9741161006d578063efdcd97414610aed578063f3fdb15a146108a3578063f6e50f5814610f32575f80fd5b8063e388be7b146106a7578063ece6a7fa14610f1e578063ef8b30f7146106ea575f80fd5b8063dd62ed3e116100c2578063dd62ed3e14610ead578063e15c82ec14610ecc578063e2f206e514610eeb575f80fd5b8063d87f780f14610e7f578063d905777e146108b7578063d9d7858a14610e99575f80fd5b8063c7b0e3a311610147578063cf349b7d11610122578063cf349b7d14610dfc578063d1a3a30814610e41578063d283e75f14610e60575f80fd5b8063c7b0e3a314610daf578063cbfdd7e114610ddd578063ce96cb77146108b7575f80fd5b8063c522498311610177578063c5224983146108a3578063c63d75b6146108b7578063c6e6f59214610d90575f80fd5b8063bf58094d14610cc2578063c134257414610d52578063c4d66de814610d71575f80fd5b8063ad80ad0b1161025c578063b3d7f6b911610207578063b460af94116101e2578063b460af9414610d00578063b4cd541b14610d1f578063ba08765214610d00575f80fd5b8063b3d7f6b9146106ea578063b3f00674146108a3578063b4113ba714610a28575f80fd5b8063af06d3cf11610237578063af06d3cf14610a28578063af5aaeeb14610cc2578063b168c58f14610ce1575f80fd5b8063ad80ad0b14610c56578063ada3d56f14610c89578063aebde56b14610ca3575f80fd5b8063a75df498116102bc578063a9c8eb7e11610297578063a9c8eb7e14610c18578063ab49b7f114610c37578063acb7081514610984575f80fd5b8063a75df49814610baa578063a824bf6714610bda578063a9059cbb14610bf9575f80fd5b8063961be391116102ec578063961be391146106a7578063a55526db14610b96578063a70354a1146108a3575f80fd5b806394bf804d14610a6857806395d89b4114610667578063960b26a214610b82575f80fd5b80634b3d1223116104915780636ce98c29116103dc57806382ebd6741161038757806388aa6f121161036257806388aa6f1214610b4e5780638bcd401614610aed5780638d56c63914610a68575f80fd5b806382ebd67414610aed578063869e50c714610b07578063883e387514610b1b575f80fd5b80637c3a00fd116103b75780637c3a00fd14610aa65780637d5f2e4e14610aba5780637dc0d1d0146108a3575f80fd5b80636ce98c29146108a35780636e553f6514610a6857806370a0823114610a87575f80fd5b8063539bd5bf1161043c57806360cb90ef1161041757806360cb90ef14610a2857806364b1cdd6146108d15780636a16ef8414610a47575f80fd5b8063539bd5bf146108a3578063587f5ed7146109e15780635fa23055146109f5575f80fd5b80634cdad5061161046c5780634cdad506146106ea5780634f7e43df146109185780635296a431146109c2575f80fd5b80634b3d12231461093f5780634b3fd148146109845780634bca3d5b146109a3575f80fd5b80632b38a367116105515780633e833364116104fc57806342895567116104d757806342895567146108e557806347bd3718146106a75780634abdb95914610918575f80fd5b80633e833364146108a3578063402d267d146108b757806341233a98146108d1575f80fd5b806333708d0c1161052c57806333708d0c1461080b57806338d52e0f1461086b57806339a51be5146108a3575f80fd5b80632b38a367146107a85780632b5335c3146107d1578063313ce567146107e5575f80fd5b80630a28a477116105b157806318e22d981161058c57806318e22d98146107505780631fe8b9531461077f57806323b872dd14610789575f80fd5b80630a28a477146106ea57806314c054bc1461070957806318160ddd1461073c575f80fd5b806307a2d13a116105e157806307a2d13a14610688578063087a6007146106a7578063095ea7b3146106bb575f80fd5b806301e1d1141461060757806302d05d3f1461062e57806306fdde0314610667575b5f80fd5b348015610612575f80fd5b5061061b610f46565b6040519081526020015b60405180910390f35b348015610639575f80fd5b50610642610f46565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610625565b348015610672575f80fd5b5061067b610f75565b6040516106259190615323565b348015610693575f80fd5b5061061b6106a2366004615373565b610fa1565b3480156106b2575f80fd5b5061061b610fb1565b3480156106c6575f80fd5b506106da6106d53660046153ab565b610fdc565b6040519015158152602001610625565b3480156106f5575f80fd5b5061061b610704366004615373565b610fee565b348015610714575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610747575f80fd5b5061061b61101f565b34801561075b575f80fd5b5061076461104a565b6040805161ffff938416815292909116602083015201610625565b61078761107b565b005b348015610794575f80fd5b506106da6107a33660046153d5565b6110fe565b3480156107b3575f80fd5b506107bc611156565b60405163ffffffff9091168152602001610625565b3480156107dc575f80fd5b50610787611181565b3480156107f0575f80fd5b506107f96111f5565b60405160ff9091168152602001610625565b348015610816575f80fd5b5061082a610825366004615413565b611203565b6040805161ffff96871681529486166020860152929094169183019190915265ffffffffffff16606082015263ffffffff909116608082015260a001610625565b348015610876575f80fd5b50367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4013560601c610642565b3480156108ae575f80fd5b50610642611156565b3480156108c2575f80fd5b5061061b610704366004615413565b3480156108dc575f80fd5b5061078761123c565b3480156108f0575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610923575f80fd5b5061092c611156565b60405161ffff9091168152602001610625565b34801561094a575f80fd5b50610953611266565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610625565b34801561098f575f80fd5b5061061b61099e36600461542e565b61126f565b3480156109ae575f80fd5b506107876109bd366004615480565b6112e5565b3480156109cd575f80fd5b506107876109dc3660046154d3565b611316565b3480156109ec575f80fd5b5061061b611346565b348015610a00575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610a33575f80fd5b50610787610a42366004615548565b61134f565b348015610a52575f80fd5b50610a5b611379565b60405161062591906155b1565b348015610a73575f80fd5b5061061b610a8236600461542e565b6113a5565b348015610a92575f80fd5b5061061b610aa1366004615413565b61140d565b348015610ab1575f80fd5b5061061b611417565b348015610ac5575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610af8575f80fd5b50610787610a42366004615413565b348015610b12575f80fd5b50610787611420565b348015610b26575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610b59575f80fd5b50610b6d610b683660046155c3565b61144a565b60408051928352602083019190915201610625565b348015610b8d575f80fd5b5061061b611156565b348015610ba1575f80fd5b5061078761147f565b348015610bb5575f80fd5b5060065474010000000000000000000000000000000000000000900461ffff1661092c565b348015610be5575f80fd5b50610b6d610bf4366004615618565b6114e6565b348015610c04575f80fd5b506106da610c133660046153ab565b61151a565b348015610c23575f80fd5b50610b6d610c3236600461542e565b611569565b348015610c42575f80fd5b5061061b610c51366004615413565b6115e7565b348015610c61575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610c94575f80fd5b50610787610a42366004615644565b348015610cae575f80fd5b50610787610cbd36600461542e565b611612565b348015610ccd575f80fd5b5061092c610cdc366004615413565b611686565b348015610cec575f80fd5b50610953610cfb36600461565d565b6116b1565b348015610d0b575f80fd5b5061061b610d1a3660046156cb565b6116c5565b348015610d2a575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610d5d575f80fd5b50610787610d6c3660046156ef565b611733565b348015610d7c575f80fd5b50610787610d8b366004615413565b6117a8565b348015610d9b575f80fd5b5061061b610daa366004615373565b6117d2565b348015610dba575f80fd5b50610dce610dc9366004615618565b6117dc565b60405161062593929190615732565b348015610de8575f80fd5b506106da610df7366004615790565b611812565b348015610e07575f80fd5b50610e1061104a565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835263ffffffff909116602083015201610625565b348015610e4c575f80fd5b50610787610e5b3660046157bc565b61185a565b348015610e6b575f80fd5b5061061b610e7a366004615413565b611884565b348015610e8a575f80fd5b50610787610e5b3660046157ef565b348015610ea4575f80fd5b50610642610fb1565b348015610eb8575f80fd5b5061061b610ec7366004615790565b61188e565b348015610ed7575f80fd5b506106da610ee6366004615413565b611899565b348015610ef6575f80fd5b506106427f000000000000000000000000000000000000000000000000000000000000000081565b348015610f29575f80fd5b506106426118c4565b348015610f3d575f80fd5b5061061b6118ef565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5090565b60607f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f610fab82611949565b92915050565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f610fe78383611a6c565b9392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b50919050565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f807f0000000000000000000000000000000000000000000000000000000000000000611076816118f8565b509091565b3330146110b4576040517f08e2ce1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36018060245f375f80825f6004355af490503d5f803e8080156110f6573d5ff35b3d5ffd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361114e57611147848484611b5a565b9050610fe7565b610fe7611c5d565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036111eb577f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b50565b6111f3611c5d565b565b5f6111fe611d09565b905090565b5f805f805f7f0000000000000000000000000000000000000000000000000000000000000000611232816118f8565b5091939590929450565b7f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b5f6111fe611e13565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd577f00000000000000000000000000000000000000000000000000000000000000006112d781611cef565b50610fab565b610fab611c5d565b7f000000000000000000000000000000000000000000000000000000000000000061130f81611cef565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000061134081611cef565b50505050565b5f6111fe612145565b7f00000000000000000000000000000000000000000000000000000000000000006110fa81611cef565b60607f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd577f00000000000000000000000000000000000000000000000000000000000000006112d781611cef565b5f610fab8261223d565b5f6111fe612344565b7f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b5f807f0000000000000000000000000000000000000000000000000000000000000000611476816118f8565b50935093915050565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036111eb577f00000000000000000000000000000000000000000000000000000000000000006111e881611cef565b5f807f0000000000000000000000000000000000000000000000000000000000000000611512816118f8565b509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd57611562838361242a565b9050610fab565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036115d8577f00000000000000000000000000000000000000000000000000000000000000006115d281611cef565b506115e0565b6115e0611c5d565b9250929050565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361167e577f000000000000000000000000000000000000000000000000000000000000000061167981611cef565b505050565b6110fa611c5d565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b5f6116bd84848461251f565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361114e577f000000000000000000000000000000000000000000000000000000000000000061172d81611cef565b50610fe7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036117a0577f000000000000000000000000000000000000000000000000000000000000000061179a81611cef565b50611340565b611340611c5d565b7f00000000000000000000000000000000000000000000000000000000000000006110fa81611cef565b5f610fab82612693565b6060805f7f000000000000000000000000000000000000000000000000000000000000000061180a816118f8565b509250925092565b5f73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036112dd57611562838361279a565b7f000000000000000000000000000000000000000000000000000000000000000061167981611cef565b5f610fab82612890565b5f610fe78383612996565b5f7f0000000000000000000000000000000000000000000000000000000000000000611019816118f8565b5f7f0000000000000000000000000000000000000000000000000000000000000000610f71816118f8565b5f6111fe612aa8565b7f1fe8b953000000000000000000000000000000000000000000000000000000005f526040360333816018015281600452805f6024375f80603883015f305afa90503d5f803e8080156110f6573d5ff35b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615611a1f57600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906119e6575033301480156119e457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15611a1d576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f611a28612bb9565b9050611a63611a5082611a3a86612c32565b6dffffffffffffffffffffffffffff1690612c7b565b6dffffffffffffffffffffffffffff1690565b9150505b919050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615611acb576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000001790555f611b1b612cbf565b9050611b28818585612db7565b5050600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055506001919050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615611bb9576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c0100000000000000000000000000000000000000000000000000000000179055611c0984612e61565b5f611c15601086612ed1565b915050611c2c818686611c2787612c32565b613118565b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905595945050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000009050604036037f1f8b5215000000000000000000000000000000000000000000000000000000005f52306004523360245234604452608060645280608452805f60a4375f8160a401525f80601f19601f84011660a4015f34865af190503d5f803e8080156110f65760403d036040f35b365f80375f80365f845af43d5f803e8080156110f6573d5ff35b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc4013560601c91839182918491611d9a91615817565b5f60405180830381855afa9150503d805f8114611dd2576040519150601f19603f3d011682016040523d82523d5f602084013e611dd7565b606091505b5091509150818015611deb57506020815110155b611df6576012611e0a565b80806020019051810190611e0a9190615832565b93505050505b90565b5f3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016141580611ee357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e21e537c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee19190615852565b155b15611f1a576040517ff0991feb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611f2361319f565b90505f611f2f826132dd565b9050611f3b8282613522565b816101a00151156120eb575f6101a08301819052600280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556001546dffffffffffffffffffffffffffff808216926e01000000000000000000000000000090920416908190505f611fca611a508760a0015171ffffffffffffffffffffffffffffffffffff166135e9565b905085610140015181118015611fdf57508181115b15612016576040517f6ef90ef100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612031836dffffffffffffffffffffffffffff871661589a565b90505f612058611a508960a0015171ffffffffffffffffffffffffffffffffffff16613631565b60808901516dffffffffffffffffffffffffffff16612077919061589a565b90508761012001518111801561208c57508181115b156120c3576040517f426073f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7c01000000000000000000000000000000000000000000000000000000006001555050505050505b61211d8261016001516140007f0000000000000000000000000000000000000000000000000000000000000000613672565b507f4b3d12230000000000000000000000000000000000000000000000000000000092915050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561221b57600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906121e2575033301480156121e057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612219576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6111fe612226612bb9565b60e001516dffffffffffffffffffffffffffff1690565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561231357600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906122da575033301480156122d857507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612311576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b73ffffffffffffffffffffffffffffffffffffffff82165f908152600d60205260409020610fab90611a5090613699565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561241a57600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906123e1575033301480156123df57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612418576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6111fe612425612bb9565b6136b2565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615612489576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000001790555f6124dd60106001612ed1565b9150506124ef818286611c2787612c32565b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055949350505050565b5f3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161415806125ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e21e537c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ed9190615852565b155b15612626576040517ff0991feb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61266a612631612bb9565b858585808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506138b692505050565b507fb168c58f000000000000000000000000000000000000000000000000000000009392505050565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561276957600c5473ffffffffffffffffffffffffffffffffffffffff163381148015906127305750333014801561272e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612767576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f612772612bb9565b9050611a63611a508261278486612c32565b6dffffffffffffffffffffffffffff169061399e565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff16156127f9576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000017905561284983612e61565b5f612855601085612ed1565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600d602052604090209092506124ef9150829086908690611c2790613699565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff161561296657600c5473ffffffffffffffffffffffffffffffffffffffff1633811480159061292d5750333014801561292b57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612964576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b610fab611a5061297d612977612bb9565b856139ac565b71ffffffffffffffffffffffffffffffffffff166135e9565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615612a6c57600c5473ffffffffffffffffffffffffffffffffffffffff16338114801590612a3357503330148015612a3157507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612a6a576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5073ffffffffffffffffffffffffffffffffffffffff9182165f908152600d602090815260408083209390941682526002909201909152205490565b6002545f907c0100000000000000000000000000000000000000000000000000000000900460ff1615612b7e57600c5473ffffffffffffffffffffffffffffffffffffffff16338114801590612b4557503330148015612b4357507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffac36013560601c73ffffffffffffffffffffffffffffffffffffffff8216145b155b15612b7c576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f612b87612bb9565b9050612bb3611a50828360e001516dffffffffffffffffffffffffffff16612c7b90919063ffffffff16565b91505090565b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152610f71816139f5565b5f6dffffffffffffffffffffffffffff821115610f71576040517f64e0647900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f612c8784613ea8565b9092509050612cb681836dffffffffffffffffffffffffffff88160281612cb057612cb06158ad565b04612c32565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303612db2576040517f18503a1e0000000000000000000000000000000000000000000000000000000081525f60048201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906318503a1e906024016040805180830381865afa158015612d87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dab91906158da565b5092915050565b503390565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612def57505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f818152600d60209081526040808320948716808452600290950182529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff81161580612e9a575073ffffffffffffffffffffffffffffffffffffffff81166001145b156111e8576040517f9b44163600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810182905290612f4961319f565b9150612f596175bf851615613f22565b9050612f6b8261016001518583614083565b612f9873ffffffffffffffffffffffffffffffffffffffff8416600114612f9257836140aa565b816140aa565b816101a0015115801561300057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101200151148015612ffe57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101400151145b155b156115e05760016101a0830152600280547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d010000000000000000000000000000000000000000000000000000000000179055608082015160a08301516115e091906130819071ffffffffffffffffffffffffffffffffffff166135e9565b6001919082547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff6dffffffffffffffffffffffffffff9283166e010000000000000000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909216929093169190911717167c0100000000000000000000000000000000000000000000000000000000179055565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361317e576040517ff2fbfb2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613189848684614207565b613194848484614345565b506001949350505050565b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a0810191909152613218816139f5565b15611e105760608101516002805465ffffffffffff9092167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921691909117905560e0810151600480546dffffffffffffffffffffffffffff9283167fffffffffffffffffffffffffffffffffffff000000000000000000000000000090911617905560c082015160a083015171ffffffffffffffffffffffffffffffffffff166e0100000000000000000000000000000291161760035561010081015160055590565b6006545f9073ffffffffffffffffffffffffffffffffffffffff811690760100000000000000000000000000000000000000000000900468ffffffffffffffffff168115610fe7575f808373ffffffffffffffffffffffffffffffffffffffff163061336a88608001516dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1690565b61338e611a508a60a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60405173ffffffffffffffffffffffffffffffffffffffff909316602484015260448301919091526064820152608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fbca02c13000000000000000000000000000000000000000000000000000000001790525161343f9190615817565b5f604051808303815f865af19150503d805f8114613478576040519150601f19603f3d011682016040523d82523d5f602084013e61347d565b606091505b509150915081801561349157506020815110155b1561351957808060200190518101906134aa9190615907565b9250680fd278dfcb4529121f8311156134ca57680fd278dfcb4529121f92505b600680547fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000068ffffffffffffffffff8616021790555b50509392505050565b60c08201517f80b61abbfc5f73cfe5cf93cec97a69ed20643dc6c6f1833b05a1560aa164e24c906dffffffffffffffffffffffffffff1661357d611a508560a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60e08501516dffffffffffffffffffffffffffff1660808601516dffffffffffffffffffffffffffff16610100870151604080519586526020860194909452928401919091526060830152608082015260a081018390524260c082015260e00160405180910390a15050565b5f8171ffffffffffffffffffffffffffffffffffff165f0361360c57505f919050565b610fab61362c8371ffffffffffffffffffffffffffffffffffff16614778565b612c32565b5f8171ffffffffffffffffffffffffffffffffffff165f0361365457505f919050565b610fab6e01ffffffffffffffffffffffffffff601f84901c16612c32565b61368663ffffffff80851690849061479d16565b1561369057505050565b611679816147a8565b80545f906dffffffffffffffffffffffffffff16610fab565b6006545f9073ffffffffffffffffffffffffffffffffffffffff811690760100000000000000000000000000000000000000000000900468ffffffffffffffffff1681158015906137065750613706614880565b15610fe7575f808373ffffffffffffffffffffffffffffffffffffffff163061375088608001516dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1690565b613774611a508a60a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60405173ffffffffffffffffffffffffffffffffffffffff909316602484015260448301919091526064820152608401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f2e34c87200000000000000000000000000000000000000000000000000000000179052516138259190615817565b5f60405180830381855afa9150503d805f811461385d576040519150601f19603f3d011682016040523d82523d5f602084013e613862565b606091505b509150915081801561387657506020815110155b15613519578080602001905181019061388f9190615907565b9250680fd278dfcb4529121f8311156135195750680fd278dfcb4529121f95945050505050565b6138bf8361492e565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600d602052604090205460701c717fffffffffffffffffffffffffffffffffff16806139065750505050565b5f6139138585845f61497f565b90505f805b845181101561396b5761394687878784815181106139385761393861591e565b60200260200101515f614b51565b613950908361589a565b9150828211156139635750505050505050565b600101613918565b506040517f34373fbc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610fe761362c8484614d9b565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600d6020526040812054610fe7908490849060701c717fffffffffffffffffffffffffffffffffff16614dd7565b367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec810135606090811c60408401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8820135811c60208401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc490910135811c825260025465ffffffffffff811691830191909152660100000000000081046dffffffffffffffffffffffffffff1660808301525f90613ad19074010000000000000000000000000000000000000000900461ffff16614e45565b610120830152600254613b0190760100000000000000000000000000000000000000000000900461ffff16614e45565b6101408301526002547801000000000000000000000000000000000000000000000000810463ffffffff9081166101608501527d01000000000000000000000000000000000000000000000000000000000090910460ff1615156101a08401526003546dffffffffffffffffffffffffffff80821660c08601526e01000000000000000000000000000090910471ffffffffffffffffffffffffffffffffffff1660a085015260045490811660e0850152720100000000000000000000000000000000000090041661018083015260055461010083015260608201515f90613bf19065ffffffffffff164261594b565b905080156110195760065461010084015160a08501516001945074010000000000000000000000000000000000000000830461ffff1692760100000000000000000000000000000000000000000000900468ffffffffffffffffff16919071ffffffffffffffffffffffffffffffffffff165f8080613c816b033b2e3c9fd0803ce8000000808801908a90614e91565b9150915080613cb7578185029250818381613c9e57613c9e6158ad565b048503613cb7576b033b2e3c9fd0803ce8000000830494505b8484029250848381613ccb57613ccb6158ad565b048403613cea578961010001518381613ce657613ce66158ad565b0493505b50505060e087015160c088015160a08901516dffffffffffffffffffffffffffff92831692909116905f90651388000000009061ffff89169071ffffffffffffffffffffffffffffffffffff16613d41908761594b565b613d4b919061595e565b613d559190615975565b90508015613dd6575f613d6785614778565b60808c01516dffffffffffffffffffffffffffff16613d86919061589a565b9050613d92828261594b565b613d9c848361595e565b613da69190615975565b60c08c01519093506dffffffffffffffffffffffffffff16613dc8908461594b565b613dd2908561589a565b9350505b717fffffffffffffffffffffffffff800000008411613e9b57613df884614f63565b71ffffffffffffffffffffffffffffffffffff1660a08b01526101008a018590524265ffffffffffff1660608b015260c08a01516dffffffffffffffffffffffffffff168214158015613e5957506dffffffffffffffffffffffffffff8211155b15613e9b57613e6783612c32565b6dffffffffffffffffffffffffffff1660e08b0152613e8582612c32565b6dffffffffffffffffffffffffffff1660c08b01525b5050505050505050919050565b5f80620f4240613ed2611a508560a0015171ffffffffffffffffffffffffffffffffffff166135e9565b60808501516dffffffffffffffffffffffffffff1601019150620f4240613f1a8460c001516dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff1690565b019050915091565b5f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614613f6857613f686159ad565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318503a1e85613fb1575f613fb3565b305b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa158015614019573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061403d91906158da565b9150915083801561404c575080155b15612dab576040517f13790bf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61409763ffffffff80851690849061479d16565b156140a157505050565b61167981614fb0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff8216016140ef576140ef6159ad565b73ffffffffffffffffffffffffffffffffffffffff8116614181577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a37d54af6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561416f575f80fd5b505af115801561130f573d5f803e3d5ffd5b6040517f30f3166700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330f31667906024015f604051808303815f87803b15801561416f575f80fd5b6dffffffffffffffffffffffffffff8116158061424f57508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b1561425957505050565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152600d602090815260408083209386168352600284019091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461130f576dffffffffffffffffffffffffffff8316811015614301576040517f9f428ac400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6dffffffffffffffffffffffffffff831673ffffffffffffffffffffffffffffffffffffffff85165f90815260028401602052604090209103908190555050505050565b73ffffffffffffffffffffffffffffffffffffffff8216614392576040517fa8af73b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6dffffffffffffffffffffffffffff81161561471d5773ffffffffffffffffffffffffffffffffffffffff83165f908152600d60205260408120908061440e83546dffffffffffffffffffffffffffff8116917f8000000000000000000000000000000000000000000000000000000000000000909116151590565b90925090506dffffffffffffffffffffffffffff8085169083161015614460576040517f7374809300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6dffffffffffffffffffffffffffff8581169084160384547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff8216178555905081156145965773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636fc4fdc1886dffffffffffffffffffffffffffff841661450d6150b7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830191909152151560448201526064015f604051808303815f87803b15801561457f575f80fd5b505af1158015614591573d5f803e3d5ffd5b505050505b73ffffffffffffffffffffffffffffffffffffffff86165f908152600d6020526040812080549095506dffffffffffffffffffffffffffff8116917f80000000000000000000000000000000000000000000000000000000000000009091161515906146028389615121565b87547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff8216178855905081156147155773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636fc4fdc18a6dffffffffffffffffffffffffffff84166040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201525f60448201526064015f604051808303815f87803b1580156146fe575f80fd5b505af1158015614710573d5f803e3d5ffd5b505050505b505050505050505b73ffffffffffffffffffffffffffffffffffffffff8083169084167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6dffffffffffffffffffffffffffff8416604051908152602001612e54565b5f601f600161478b63800000008561589a565b614795919061594b565b901c92915050565b1663ffffffff161590565b6002547c0100000000000000000000000000000000000000000000000000000000900460ff1615614805576040517f74f3606300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000017905561485581614fb0565b50600280547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff169055565b6040517fcdd8ea780000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063cdd8ea7890602401602060405180830381865afa15801561490a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fe9190615852565b602081015173ffffffffffffffffffffffffffffffffffffffff166111e8576040517f5b92337100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80614992611a5061297d888888614dd7565b9050805f036149a4575f9150506116bd565b856040015173ffffffffffffffffffffffffffffffffffffffff16865f015173ffffffffffffffffffffffffffffffffffffffff16036149e657809150614b48565b8215614a9c576020860151865160408089015190517fae68676c0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff9283166024820152908216604482015291169063ae68676c90606401602060405180830381865afa158015614a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a959190615907565b9150614b48565b6020860151865160408089015190517f0579e61f0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff92831660248201529082166044820152911690630579e61f906064016040805180830381865afa158015614b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b4491906159da565b9250505b50949350505050565b5f80614b5d8484615142565b905061ffff8116614b71575f9150506116bd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301525f91908616906370a0823190602401602060405180830381865afa158015614bde573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c029190615907565b9050805f03614c15575f925050506116bd565b5f8415614cca5760208801516040808a015190517fae68676c0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8981166024830152918216604482015291169063ae68676c90606401602060405180830381865afa158015614c9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cc39190615907565b9050614d74565b60208801516040808a015190517f0579e61f0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff89811660248301529182166044820152911690630579e61f906064016040805180830381865afa158015614d4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d7091906159da565b5090505b612710614d8561ffff85168361595e565b614d8f9190615975565b98975050505050505050565b5f805f614da784613ea8565b909250905081816dffffffffffffffffffffffffffff87160281614dcd57614dcd6158ad565b0495945050505050565b5f71ffffffffffffffffffffffffffffffffffff8216614df857505f610fe7565b61010084015173ffffffffffffffffffffffffffffffffffffffff84165f908152600d60205260409020600101546116bd9171ffffffffffffffffffffffffffffffffffff8516916151dc565b5f61ffff8216808203614e7a57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92915050565b6064603f8216600a0a600683901c02049392505050565b5f80848015614f4657600185168015614eac57869350614eb0565b8493505b508360011c8560011c95505b8515614f40578660801c15614ed45760019250614f40565b86870281810181811015614eed57600194505050614f40565b8690049750506001861615614f35578684028488820414614f18578715614f18576001935050614f40565b81810181811015614f2e57600194505050614f40565b8690049450505b8560011c9550614ebc565b50611476565b848015614f55575f9350614f59565b8493505b5050935093915050565b5f717fffffffffffffffffffffffffff80000000821115610f71576040517f9388c33400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c5473ffffffffffffffffffffffffffffffffffffffff1680615000576040517f750f881700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808273ffffffffffffffffffffffffffffffffffffffff165f368660405160200161502e939291906159fc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261506691615817565b5f604051808303815f865af19150503d805f811461509f576040519150601f19603f3d011682016040523d82523d5f602084013e6150a4565b606091505b509150915081611340576113408161520e565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663863789d76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561490a573d5f803e3d5ffd5b5f610fe761362c6dffffffffffffffffffffffffffff80851690861661589a565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e60209081526040808320815160a081018352905461ffff808216835262010000820481169483019490945264010000000081049093169181019190915265ffffffffffff6601000000000000830416606082015263ffffffff6c0100000000000000000000000090920482166080820152610fe791849061524f16565b5f6116bd826151ff8571ffffffffffffffffffffffffffffffffffff881661595e565b6152099190615975565b614f63565b80511561521d57805181602001fd5b6040517f2082e20000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8161525d57508151610fab565b826060015165ffffffffffff164210158061528857506020830151604084015161ffff908116911610155b1561529857506020820151610fab565b5f6152a8846040015161ffff1690565b61ffff1690505f6152be856020015161ffff1690565b61ffff1690505f42866060015165ffffffffffff16039050856080015163ffffffff168183850302816152f3576152f36158ad565b049190910195945050505050565b5f5b8381101561531b578181015183820152602001615303565b50505f910152565b602081525f8251806020840152615341816040850160208701615301565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215615383575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111e8575f80fd5b5f80604083850312156153bc575f80fd5b82356153c78161538a565b946020939093013593505050565b5f805f606084860312156153e7575f80fd5b83356153f28161538a565b925060208401356154028161538a565b929592945050506040919091013590565b5f60208284031215615423575f80fd5b8135610fe78161538a565b5f806040838503121561543f575f80fd5b8235915060208301356154518161538a565b809150509250929050565b803561ffff81168114611a67575f80fd5b803563ffffffff81168114611a67575f80fd5b5f805f8060808587031215615493575f80fd5b843561549e8161538a565b93506154ac6020860161545c565b92506154ba6040860161545c565b91506154c86060860161546d565b905092959194509250565b5f805f604084860312156154e5575f80fd5b83359250602084013567ffffffffffffffff80821115615503575f80fd5b818601915086601f830112615516575f80fd5b813581811115615524575f80fd5b876020828501011115615535575f80fd5b6020830194508093505050509250925092565b5f60208284031215615558575f80fd5b610fe78261545c565b5f815180845260208085019450602084015f5b838110156155a657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101615574565b509495945050505050565b602081525f610fe76020830184615561565b5f805f606084860312156155d5575f80fd5b83356155e08161538a565b925060208401356155f08161538a565b915060408401356156008161538a565b809150509250925092565b80151581146111e8575f80fd5b5f8060408385031215615629575f80fd5b82356156348161538a565b915060208301356154518161560b565b5f60208284031215615654575f80fd5b610fe78261546d565b5f805f6040848603121561566f575f80fd5b833561567a8161538a565b9250602084013567ffffffffffffffff80821115615696575f80fd5b818601915086601f8301126156a9575f80fd5b8135818111156156b7575f80fd5b8760208260051b8501011115615535575f80fd5b5f805f606084860312156156dd575f80fd5b8335925060208401356155f08161538a565b5f805f8060808587031215615702575f80fd5b843561570d8161538a565b9350602085013561571d8161538a565b93969395505050506040820135916060013590565b606081525f6157446060830186615561565b8281036020848101919091528551808352868201928201905f5b8181101561577a5784518352938301939183019160010161575e565b5050809350505050826040830152949350505050565b5f80604083850312156157a1575f80fd5b82356157ac8161538a565b915060208301356154518161538a565b5f80604083850312156157cd575f80fd5b82356157d88161538a565b91506157e66020840161546d565b90509250929050565b5f8060408385031215615800575f80fd5b6158098361545c565b91506157e66020840161545c565b5f8251615828818460208701615301565b9190910192915050565b5f60208284031215615842575f80fd5b815160ff81168114610fe7575f80fd5b5f60208284031215615862575f80fd5b8151610fe78161560b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610fab57610fab61586d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f80604083850312156158eb575f80fd5b82516158f68161538a565b60208401519092506154518161560b565b5f60208284031215615917575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610fab57610fab61586d565b8082028115828204841417610fab57610fab61586d565b5f826159a8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f80604083850312156159eb575f80fd5b505080516020909101519092909150565b8284823760609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016910190815260140191905056fea26469706673582212203d1e6ff553411d923aedce43bd7ecdb510f6d90bed7fdded6c220608361c6c6b64736f6c63430008180033","sourceMap":"430:13141:71:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2963:94;;;;;;;;;;;;;:::i;:::-;;;160:25:270;;;148:2;133:18;2963:94:71;;;;;;;;4489:90;;;;;;;;;;;;;:::i;:::-;;;372:42:270;360:55;;;342:74;;330:2;315:18;4489:90:71;196:226:270;1284:93:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3063:129::-;;;;;;;;;;-1:-1:-1;3063:129:71;;;;;:::i;:::-;;:::i;6242:106::-;;;;;;;;;;;;;:::i;2274:131::-;;;;;;;;;;-1:-1:-1;2274:131:71;;;;;:::i;:::-;;:::i;:::-;;;1971:14:270;;1964:22;1946:41;;1934:2;1919:18;2274:131:71;1806:187:270;3902:112:71;;;;;;;;;;-1:-1:-1;3902:112:71;;;;;:::i;:::-;;:::i;1438:41:70:-;;;;;;;;;;;;;;;1583:94:71;;;;;;;;;;;;;:::i;10802:119::-;;;;;;;;;;;;;:::i;:::-;;;;2178:6:270;2211:15;;;2193:34;;2263:15;;;;2258:2;2243:18;;2236:43;2141:18;10802:119:71;1998:287:270;4843:488:70;;;:::i;:::-;;2102:166:71;;;;;;;;;;-1:-1:-1;2102:166:71;;;;;:::i;:::-;;:::i;11850:98::-;;;;;;;;;;;;;:::i;:::-;;;2925:10:270;2913:23;;;2895:42;;2883:2;2868:18;11850:98:71;2751:192:270;12367:87:71;;;;;;;;;;;;;:::i;1484:93::-;;;;;;;;;;;;;:::i;:::-;;;3120:4:270;3108:17;;;3090:36;;3078:2;3063:18;1484:93:71;2948:184:270;11172:220:71;;;;;;;;;;-1:-1:-1;11172:220:71;;;;;:::i;:::-;;:::i;:::-;;;;3648:6:270;3681:15;;;3663:34;;3733:15;;;3728:2;3713:18;;3706:43;3785:15;;;;3765:18;;;3758:43;;;;3849:14;3837:27;3832:2;3817:18;;3810:55;3914:10;3902:23;;;3896:3;3881:19;;3874:52;3625:3;3610:19;11172:220:71;3389:543:270;2868:89:71;;;;;;;;;;-1:-1:-1;615:14:95;611:23;;598:37;594:2;590:46;2868:89:71;1484:93;10689:107;;;;;;;;;;;;;:::i;3333:108::-;;;;;;;;;;-1:-1:-1;3333:108:71;;;;;:::i;9635:91::-;;;;;;;;;;;;;:::i;1535:43:70:-;;;;;;;;;;;;;;;11623:109:71;;;;;;;;;;;;;:::i;:::-;;;4111:6:270;4099:19;;;4081:38;;4069:2;4054:18;11623:109:71;3937:188:270;8866:105:71;;;;;;;;;;;;;:::i;:::-;;;4304:66:270;4292:79;;;4274:98;;4262:2;4247:18;8866:105:71;4130:248:270;6454:131:71;;;;;;;;;;-1:-1:-1;6454:131:71;;;;;:::i;:::-;;:::i;12792:147::-;;;;;;;;;;-1:-1:-1;12792:147:71;;;;;:::i;:::-;;:::i;7011:104::-;;;;;;;;;;-1:-1:-1;7011:104:71;;;;;:::i;:::-;;:::i;4247:109::-;;;;;;;;;;;;;:::i;1260:37:70:-;;;;;;;;;;;;;;;13481:88:71;;;;;;;;;;-1:-1:-1;13481:88:71;;;;;:::i;:::-;;:::i;11398:104::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4586:128::-;;;;;;;;;;-1:-1:-1;4586:128:71;;;;;:::i;:::-;;:::i;1683:119::-;;;;;;;;;;-1:-1:-1;1683:119:71;;;;;:::i;:::-;;:::i;6133:103::-;;;;;;;;;;;;;:::i;1634:43:70:-;;;;;;;;;;;;;;;12460:101:71;;;;;;;;;;-1:-1:-1;12460:101:71;;;;;:::i;8594:79::-;;;;;;;;;;;;;:::i;1738:49:70:-;;;;;;;;;;;;;;;7510:188:71;;;;;;;;;;-1:-1:-1;7510:188:71;;;;;:::i;:::-;;:::i;:::-;;;;7824:25:270;;;7880:2;7865:18;;7858:34;;;;7797:18;7510:188:71;7650:248:270;10579:104:71;;;;;;;;;;;;;:::i;7121:80::-;;;;;;;;;;;;;:::i;10247:100::-;;;;;;;;;;-1:-1:-1;4941:24:75;;;;::::1;;;10247:100:71::0;1484:93;8181:178;;;;;;;;;;-1:-1:-1;8181:178:71;;;;;:::i;:::-;;:::i;1958:138::-;;;;;;;;;;-1:-1:-1;1958:138:71;;;;;:::i;:::-;;:::i;6727:161::-;;;;;;;;;;-1:-1:-1;6727:161:71;;;;;:::i;:::-;;:::i;6014:113::-;;;;;;;;;;-1:-1:-1;6014:113:71;;;;;:::i;:::-;;:::i;1168:42:70:-;;;;;;;;;;;;;;;13271:96:71;;;;;;;;;;-1:-1:-1;13271:96:71;;;;;:::i;6894:111::-;;;;;;;;;;-1:-1:-1;6894:111:71;;;;;:::i;:::-;;:::i;11047:119::-;;;;;;;;;;-1:-1:-1;11047:119:71;;;;;:::i;:::-;;:::i;8679:181::-;;;;;;;;;;-1:-1:-1;8679:181:71;;;;;:::i;:::-;;:::i;4851:144::-;;;;;;;;;;-1:-1:-1;4851:144:71;;;;;:::i;:::-;;:::i;1842:42:70:-;;;;;;;;;;;;;;;7704:168:71;;;;;;;;;;-1:-1:-1;7704:168:71;;;;;:::i;:::-;;:::i;884:91::-;;;;;;;;;;-1:-1:-1;884:91:71;;;;;:::i;:::-;;:::i;3198:129::-;;;;;;;;;;-1:-1:-1;3198:129:71;;;;;:::i;:::-;;:::i;8365:222::-;;;;;;;;;;-1:-1:-1;8365:222:71;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;2411:148::-;;;;;;;;;;-1:-1:-1;2411:148:71;;;;;:::i;:::-;;:::i;11738:106::-;;;;;;;;;;;;;:::i;:::-;;;;11823:42:270;11811:55;;;11793:74;;11915:10;11903:23;;;11898:2;11883:18;;11876:51;11766:18;11738:106:71;11621:312:270;12670:116:71;;;;;;;;;;-1:-1:-1;12670:116:71;;;;;:::i;:::-;;:::i;5895:113::-;;;;;;;;;;-1:-1:-1;5895:113:71;;;;;:::i;:::-;;:::i;13373:102::-;;;;;;;;;;-1:-1:-1;13373:102:71;;;;;:::i;6354:93::-;;;;;;;;;;;;;:::i;1808:143::-;;;;;;;;;;-1:-1:-1;1808:143:71;;;;;:::i;:::-;;:::i;9402:130::-;;;;;;;;;;-1:-1:-1;9402:130:71;;;;;:::i;:::-;;:::i;1347:37:70:-;;;;;;;;;;;;;;;9280:116:71;;;;;;;;;;;;;:::i;4362:121::-;;;;;;;;;;;;;:::i;2963:94::-;3046:7;3023:12;3815:28:70;3836:6;3815:20;:28::i;:::-;2963:94:71;;:::o;1284:93::-;1360:13;1337:12;3815:28:70;3836:6;3815:20;:28::i;3063:129:71:-;3142:7;3160:29;3182:6;3160:21;:29::i;:::-;3153:36;3063:129;-1:-1:-1;;3063:129:71:o;6242:106::-;6337:7;6310:16;3815:28:70;3836:6;3815:20;:28::i;2274:131:71:-;2357:4;2372:30;2386:7;2395:6;2372:13;:30::i;:::-;2365:37;2274:131;-1:-1:-1;;;2274:131:71:o;3902:112::-;4003:7;3980:12;3815:28:70;3836:6;3815:20;:28::i;:::-;3902:112:71;;;;:::o;1583:94::-;1666:7;1643:12;3815:28:70;3836:6;3815:20;:28::i;10802:119:71:-;10883:16;10901;10855:17;3815:28:70;3836:6;3815:20;:28::i;:::-;10802:119:71;;;:::o;4843:488:70:-;4898:10;4920:4;4898:27;4894:56;;4934:16;;;;;;;;;;;;;;4894:56;4996:23;5000:14;4996:23;5052:4;5016:2;5045:1;5032:25;5045:1;;5124:4;5045:1;5117;5104:15;5097:5;5084:51;5070:65;;5169:16;5045:1;;5148:38;5206:6;5225:38;;;;5296:16;5045:1;5286:27;5225:38;5244:16;5045:1;5234:27;5199:116;;;4843:488::o;2102:166:71:-;2214:4;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;2229:36:71::1;2248:4;2254:2;2258:6;2229:18;:36::i;:::-;2222:43;;4443:113:70::0;;;4521:24;:22;:24::i;11850:98:71:-;11938:6;11910:17;3815:28:70;3836:6;3815:20;:28::i;12367:87:71:-;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;12433:17:71::1;3463:24:70;3480:6;3463:16;:24::i;:::-;4489:1;12367:87:71:o:0;4443:113:70:-;4521:24;:22;:24::i;:::-;12367:87:71:o;1484:93::-;1542:5;1558:16;:14;:16::i;:::-;1551:23;;1484:93;:::o;11172:220::-;11274:16;11292:21;11315:28;11345:22;11369:19;11246:17;3815:28:70;3836:6;3815:20;:28::i;:::-;11172:220:71;;;;;;;;:::o;9635:91::-;9698:24;3463::70;3480:6;3463:16;:24::i;8866:105:71:-;8927:6;8944:24;:22;:24::i;6454:131::-;6574:7;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;6547:16:71::1;3463:24:70;3480:6;3463:16;:24::i;:::-;4489:1;4443:113:::0;;;4521:24;:22;:24::i;12792:147:71:-;12918:17;3463:24:70;3480:6;3463:16;:24::i;:::-;12792:147:71;;;;;:::o;7011:104::-;7095:16;3463:24:70;3480:6;3463:16;:24::i;:::-;7011:104:71;;;;:::o;4247:109::-;4312:7;4330:23;:21;:23::i;13481:88::-;13548:17;3463:24:70;3480:6;3463:16;:24::i;11398:104:71:-;11482:16;11454:17;3815:28:70;3836:6;3815:20;:28::i;4586:128:71:-;4703:7;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;4680:12:71::1;3463:24:70;3480:6;3463:16;:24::i;1683:119:71:-:0;1757:7;1775:24;1791:7;1775:15;:24::i;6133:103::-;6195:7;6213:20;:18;:20::i;8594:79::-;8651:18;3463:24:70;3480:6;3463:16;:24::i;7510:188:71:-;7660:16;7678;7631:18;3815:28:70;3836:6;3815:20;:28::i;:::-;7510:188:71;;;;;;;:::o;7121:80::-;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;7181:16:71::1;3463:24:70;3480:6;3463:16;:24::i;8181:178:71:-:0;8308:23;8333:22;8279:18;3815:28:70;3836:6;3815:20;:28::i;:::-;8181:178:71;;;;;;:::o;1958:138::-;2052:4;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;2067:26:71::1;2082:2;2086:6;2067:14;:26::i;:::-;2060:33;;4443:113:70::0;;6727:161:71;6856:14;;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;6829:16:71::1;3463:24:70;3480:6;3463:16;:24::i;:::-;4489:1;4443:113:::0;;;4521:24;:22;:24::i;:::-;6727:161:71;;;;;:::o;6014:113::-;6116:7;6089:16;3815:28:70;3836:6;3815:20;:28::i;6894:111:71:-;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;6985:16:71::1;3463:24:70;3480:6;3463:16;:24::i;:::-;4489:1;5199:116:::0;;4843:488::o;4443:113::-;4521:24;:22;:24::i;11047:119:71:-;11156:6;11128:17;3815:28:70;3836:6;3815:20;:28::i;8679:181:71:-;8794:6;8811:46;8836:7;8845:11;;8811:24;:46::i;:::-;8804:53;8679:181;-1:-1:-1;;;;8679:181:71:o;4851:144::-;4984:7;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;4961:12:71::1;3463:24:70;3480:6;3463:16;:24::i;:::-;4489:1;4443:113:::0;;7704:168:71;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;7850:18:71::1;3463:24:70;3480:6;3463:16;:24::i;:::-;4489:1;4443:113:::0;;;4521:24;:22;:24::i;884:91:71:-;954:17;3463:24:70;3480:6;3463:16;:24::i;3198:129:71:-;3277:7;3295:29;3317:6;3295:21;:29::i;8365:222::-;8496:28;8526:33;8561:22;8467:18;3815:28:70;3836:6;3815:20;:28::i;:::-;8365:222:71;;;;;;:::o;2411:148::-;2510:4;4447:26:70;4469:3;4447:26;:10;:26;4443:113;;2525:31:71::1;2547:4;2553:2;2525:21;:31::i;12670:116::-:0;12765:17;3463:24:70;3480:6;3463:16;:24::i;5895:113:71:-;5966:7;5984:21;5997:7;5984:12;:21::i;1808:143::-;1898:7;1916:32;1932:6;1940:7;1916:15;:32::i;9402:130::-;9524:4;9489:24;3815:28:70;3836:6;3815:20;:28::i;9280:116:71:-;9385:7;9350:24;3815:28:70;3836:6;3815:20;:28::i;4362:121:71:-;4433:7;4451:29;:27;:29::i;5735:1331:70:-;6102:66;6099:1;6092:77;6230:21;6214:14;6210:42;6579:8;6556:20;6552:2;6548:29;6541:47;6611:6;6608:1;6601:17;6651:20;6648:1;6644:2;6631:41;6868:1;6865;6860:2;6838:20;6834:29;6831:1;6820:9;6813:5;6802:68;6788:82;;6904:16;6901:1;6898;6883:38;6941:6;6960:38;;;;7031:16;7028:1;7021:27;1209:223:80;2371:12:83;:29;1296:7:80;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;1315:28:80::1;1346:11;:9;:11::i;:::-;1315:42;;1374:51;:42;1405:10;1374:17;:6;:15;:17::i;:::-;:30;;::::0;::::1;:42::i;:::-;:49;;::::0;497:104:100;1374:51:80::1;1367:58;;;3143:1:83;1209:223:80::0;;;:::o;2790:216:79:-;2159:12:83;:29;2877:4:79;;2159:29:83;;;;;2155:56;;;2197:14;;;;;;;;;;;;;;2155:56;2222:12;:36;;;;;;;;:29;2911:17:79::1;:15;:17::i;:::-;2893:35;;2939:38;2952:7;2961;2970:6;2939:12;:38::i;:::-;-1:-1:-1::0;;2279:12:83;:37;;;;;;-1:-1:-1;2995:4:79::1;::::0;2790:216;-1:-1:-1;2790:216:79:o;2459:298::-;2159:12:83;:29;2560:4:79;;2159:29:83;;;;;2155:56;;;2197:14;;;;;;;;;;;;;;2155:56;2222:12;:36;;;;;;;;2576:33:79::1;2604:4:::0;2576:27:::1;:33::i;:::-;2623:15;2642:32;1618:6:86;2669:4:79;2642:13;:32::i;:::-;2620:54;;;2692:58;2713:7;2722:4;2728:2;2732:17;:6;:15;:17::i;:::-;2692:20;:58::i;:::-;2279:12:83::0;:37;;;;;;2685:65:79;2459:298;-1:-1:-1;;;;;2459:298:79:o;7072:1406:70:-;7124:12;7147:3;7124:27;;7230:21;7214:14;7210:42;7276:66;7273:1;7266:77;7388:9;7385:1;7378:20;7463:8;7459:2;7452:20;7534:11;7530:2;7523:23;7608:3;7603;7596:16;7718:18;7713:3;7706:31;7813:18;7810:1;7805:3;7792:40;8109:1;8088:18;8083:3;8079:28;8072:39;8228:1;8225;8218:2;8214:7;8209:2;8189:18;8185:27;8181:41;8176:3;8172:51;8169:1;8156:11;8150:4;8143:5;8138:92;8124:106;;8265:16;8262:1;8259;8244:38;8302:6;8321:38;;;;8415:2;8397:16;8393:25;8389:2;8382:37;5337:392;5439:14;5436:1;5433;5420:34;5531:1;5528;5512:14;5509:1;5501:6;5494:5;5481:52;5567:16;5564:1;5561;5546:38;5604:6;5623:38;;;;5694:16;5691:1;5684:27;912:311:79;1102:35:::1;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;::::0;::::1;::::0;;1076:62;;-1:-1:-1;;615:14:95;611:23;;598:37;594:2;590:46;;-1:-1:-1;;;;590:46:95;;1076:62:79::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1040:98;;;;1155:7;:28;;;;;1181:2;1166:4;:11;:17;;1155:28;:61;;1214:2;1155:61;;;1197:4;1186:25;;;;;;;;;;;;:::i;:::-;1148:68;;;;;2085:1:83;912:311:79::0;:::o;3132:2219:78:-;3210:17;773:10:87::1;:26;795:3;773:26;;;::::0;:56:::1;;;804:3;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;803:26;773:56;769:115;;;852:21;;;;;;;;;;;;;;769:115;3488:28:78::2;3519:13;:11;:13::i;:::-;3488:44;;3542:23;3568:31;3588:10;3568:19;:31::i;:::-;3542:57;;3610:43;3625:10;3637:15;3610:14;:43::i;:::-;3971:10;:30;;;3967:1233;;;4085:5;4052:30;::::0;::::2;:38:::0;;;4017:12:::2;:73:::0;;;::::2;::::0;;-1:-1:-1;4127:13:78;::::2;::::0;;::::2;::::0;4179:16;;;::::2;;::::0;;4210:46:::2;;4270:15;4288:45;:36;:10;:23;;;:34;;;:36::i;:45::-;4270:63;;4362:10;:20;;;4352:7;:30;:55;;;;;4396:11;4386:7;:21;4352:55;4348:89;;;4416:21;;;;;;;;;;;;;;4348:89;4452:18;4473:35;4497:11:::0;4473:19:::2;::::0;::::2;:35;:::i;:::-;4452:56;;4966:14;5010:47;:38;:10;:23;;;:36;;;:38::i;:47::-;4983:15;::::0;::::2;::::0;:22:::2;;:74;;;;:::i;:::-;4966:91;;5085:10;:20;;;5076:6;:29;:52;;;;;5118:10;5109:6;:19;5076:52;5072:86;;;5137:21;;;;;;;;;;;;;;5072:86;1041:18:106::0;5173:8:78::2;1041:18:106::0;4003:1197:78::2;;;;;;3967:1233;5210:75;5227:10;:20;;;2016:7:86;5280:3:78;5210:16;:75::i;:::-;-1:-1:-1::0;5309:35:78;;3132:2219;-1:-1:-1;;3132:2219:78:o;4276:142:80:-;2371:12:83;:29;4349:7:80;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;4375:36:80::1;:11;:9;:11::i;:::-;:27;;::::0;:34:::1;;::::0;497:104:100;1423:164:79;2371:12:83;:29;1505:7:79;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;1531:27:79::1;::::0;::::1;;::::0;;;:18;:27:::1;::::0;;;;:49:::1;::::0;:40:::1;::::0;:38:::1;:40::i;1873:139:74:-:0;2371:12:83;:29;1943:7:74;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;1969:36:74::1;1993:11;:9;:11::i;:::-;1969:23;:36::i;1835:253:79:-:0;2159:12:83;:29;1918:4:79;;2159:29:83;;;;;2155:56;;;2197:14;;;;;;;;;;;;;;2155:56;2222:12;:36;;;;;;;;:29;1956:47:79::1;1618:6:86;2254:4:83::0;1956:13:79::1;:47::i;:::-;1934:69;;;2020:61;2041:7;2050;2059:2;2063:17;:6;:15;:17::i;2020:61::-;2279:12:83::0;:37;;;;;;2013:68:79;1835:253;-1:-1:-1;;;;1835:253:79:o;2696:330:78:-;2876:17;773:10:87::1;:26;795:3;773:26;;;::::0;:56:::1;;;804:3;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;803:26;773:56;769:115;;;852:21;;;;;;;;;;;;;;769:115;2909:49:78::2;2924:11;:9;:11::i;:::-;2937:7;2946:11;;2909:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;2909:14:78::2;::::0;-1:-1:-1;;;2909:49:78:i:2;:::-;-1:-1:-1::0;2982:37:78;;2696:330;-1:-1:-1;;;2696:330:78:o;1467:223:80:-;2371:12:83;:29;1554:7:80;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;1573:28:80::1;1604:11;:9;:11::i;:::-;1573:42;;1632:51;:42;1663:10;1632:17;:6;:15;:17::i;:::-;:30;;::::0;::::1;:42::i;2121:305:79:-:0;2159:12:83;:29;2209:4:79;;2159:29:83;;;;;2155:56;;;2197:14;;;;;;;;;;;;;;2155:56;2222:12;:36;;;;;;;;2225:33:79::1;2253:4:::0;2225:27:::1;:33::i;:::-;2272:15;2291:32;1618:6:86;2318:4:79;2291:13;:32::i;:::-;2381:24;::::0;::::1;;::::0;;;:18;:24:::1;::::0;;;;2269:54;;-1:-1:-1;2341:78:79::1;::::0;-1:-1:-1;2269:54:79;;2371:4;;2377:2;;2381:37:::1;::::0;:35:::1;:37::i;1467:170:74:-:0;2371:12:83;:29;1546:7:74;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;1572:58:74::1;:49;:36;1587:11;:9;:11::i;:::-;1600:7;1572:14;:36::i;:::-;:47;;;:49::i;1620:182:79:-:0;2371:12:83;:29;1718:7:79;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;-1:-1:-1;1744:26:79::1;::::0;;::::1;;::::0;;;:18;:26:::1;::::0;;;;;;;:51;;;::::1;::::0;;:12:::1;:42:::0;;::::1;:51:::0;;;;;;1620:182::o;4451:225:80:-;2371:12:83;:29;4530:7:80;;2371:29:83;;;;;2367:767;;;2437:23;;;;2954:10;:24;;;;;:102;;-1:-1:-1;2984:10:83;3006:4;2984:27;:71;;;;-1:-1:-1;1069:51:95;1073:14;1069:51;1056:65;1052:2;1048:74;3015:40:83;;;;2984:71;2982:74;2954:102;2950:174;;;3095:14;;;;;;;;;;;;;;2950:174;2402:732;2367:767;4549:28:80::1;4580:11;:9;:11::i;:::-;4549:42;;4609:60;:51;4649:10;4609;:26;;;:39;;;;:51;;;;:::i;:60::-;4602:67;;;4451:225:::0;:::o;1249:125:85:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1341:26:85;1356:10;1341:14;:26::i;1478:197:107:-;1535:6;355:17:86;1557:24:107;;1553:70;;;1590:33;;;;;;;;;;;;;;695:319:105;785:6;804:19;825;848:46;883:10;848:34;:46::i;:::-;803:91;;-1:-1:-1;803:91:105;-1:-1:-1;935:62:105;803:91;;953:13;;;:29;:43;;;;;:::i;:::-;;935:17;:62::i;:::-;928:69;695:319;-1:-1:-1;;;;;695:319:105:o;1772:280:87:-;1830:7;1853:26;1875:3;1853:26;:10;:26;1849:170;;1926:43;;;;;1896:25;1926:43;;;342:74:270;;;1896:25:87;1926:3;:31;;;;;315:18:270;;1926:43:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;1895:74:87;1772:280;-1:-1:-1;;1772:280:87:o;1849:170::-;-1:-1:-1;2035:10:87;;1772:280::o;3881:241:82:-;3985:5;3974:16;;:7;:16;;;3970:29;;3881:241;;;:::o;3970:29::-;4009:25;;;;;;;;:18;:25;;;;;;;;:50;;;;;;:12;:41;;;:50;;;;;;:59;;;4083:32;;160:25:270;;;4083:32:82;;133:18:270;4083:32:82;;;;;;;;3881:241;;;:::o;3514:168:79:-;3592:25;;;;;:56;;-1:-1:-1;3621:27:79;;;1423:1:86;3621:27:79;3592:56;3588:87;;;3657:18;;;;;;;;;;;;;;3442:1260:83;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3631:13:83;:11;:13::i;:::-;3618:26;-1:-1:-1;3664:64:83;2695:176:86;3688:34:83;;:39;3664:23;:64::i;:::-;3654:74;;3739:50;3748:10;:20;;;3770:9;3781:7;3739:8;:50::i;:::-;3799:88;3822:37;;;1423:1:86;3822:37:83;:64;;3872:14;3799:22;:88::i;3822:64::-;3862:7;3799:22;:88::i;:::-;4368:10;:30;;;4367:31;:140;;;;;4444:17;4420:10;:20;;;:41;:86;;;;;4489:17;4465:10;:20;;;:41;4420:86;4418:89;4367:140;4350:346;;;4600:4;4567:30;;;:37;4532:12;:72;;;;;;;;4631:15;;;;4648:23;;;;4618:67;;4631:15;4648:36;;:34;;;:36::i;:::-;4618:8;;:67;983:16:106;;1041:18;983:16;1009:22;;;;;;;;;983:16;;;;1009:22;;;;;1041:18;;;;;899:167;3012:283:79;3117:4;3145:2;3137:10;;:4;:10;;;3133:39;;3156:16;;;;;;;;;;;;;;3133:39;3183:40;3201:4;3207:7;3216:6;3183:17;:40::i;:::-;3233:33;3249:4;3255:2;3259:6;3233:15;:33::i;:::-;-1:-1:-1;3284:4:79;3012:283;;;;;;:::o;689:517:85:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;782:26:85;797:10;782:14;:26::i;:::-;778:422;;;869:40;;;;824:12;:85;;;;;;;;;;;;;;;;954:26;;;;923:28;:57;;;;;;;;;;;;;1022:22;;;;1086:23;;;;1058:51;;;;995:49;;1058:51;995:24;1058:51;824:85;1159:30;;;1124:32;:65;689:517;:::o;4785:900:84:-;4927:30;;4870:7;;4927:30;;;;4993:25;;;;;5033:17;;5029:617;;5067:12;5081:17;5102:3;:8;;5219:4;5226:24;:10;:15;;;:22;;568:26:100;;;497:104;5226:24:84;5252:45;:36;:10;:23;;;:34;;;:36::i;:45::-;5128:188;;14467:42:270;14455:55;;;5128:188:84;;;14437:74:270;14527:18;;;14520:34;;;;14570:18;;;14563:34;14410:18;;5128:188:84;;;;;;;;;;;;;;;;;;;;;;;;5102:228;;;5128:188;5102:228;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5066:264;;;;5349:7;:28;;;;;5375:2;5360:4;:11;:17;;5349:28;5345:291;;;5426:4;5415:27;;;;;;;;;;;;:::i;:::-;5397:45;;1036:21:86;5464:15:84;:43;5460:92;;;1036:21:86;5509:43:84;;5460:92;5570:25;:51;;;;;;;;;;;;5345:291;5052:594;;5663:15;4785:900;-1:-1:-1;;;4785:900:84:o;6191:364:83:-;6307:13;;;;6282:266;;6307:20;;6343:36;:27;:1;:14;;;:25;;;:27::i;:36::-;6393:17;;;;:24;;6433:6;;;;:13;;6462:21;;;;6282:266;;;15112:25:270;;;15168:2;15153:18;;15146:34;;;;15196:18;;;15189:34;;;;15254:2;15239:18;;15232:34;15297:3;15282:19;;15275:35;15341:3;15326:19;;15319:35;;;6523:15:83;15385:3:270;15370:19;;15363:35;15099:3;15084:19;6282:266:83;;;;;;;6191:364;;:::o;629:204:104:-;685:6;719;707:24;;730:1;707:24;703:51;;-1:-1:-1;752:1:104;;629:204;-1:-1:-1;629:204:104:o;703:51::-;772:54;790:35;817:6;790:35;;:14;:35::i;:::-;772:17;:54::i;839:223::-;897:6;931;919:24;;942:1;919:24;915:51;;-1:-1:-1;964:1:104;;839:223;-1:-1:-1;839:223:104:o;915:51::-;984:71;1002:52;247:2:86;1002:52:104;;;;984:17;:71::i;5534:195:83:-;5642:29;:18;;;;;5661:9;;5642:18;:29;:::i;:::-;5638:42;;;5534:195;;;:::o;5638:42::-;5690:32;5715:6;5690:24;:32::i;1650:125:108:-;1758:9;;1719:6;;1193:66;2886:41;1744:24;2775:161;5691:882:84;5842:30;;5785:7;;5842:30;;;;5908:25;;;;;5948:17;;;;;:49;;;5969:28;:26;:28::i;:::-;5944:590;;;6014:12;6028:17;6049:3;:14;;6176:4;6183:24;:10;:15;;;:22;;568:26:100;;;497:104;6183:24:84;6209:45;:36;:10;:23;;;:34;;;:36::i;:45::-;6081:192;;14467:42:270;14455:55;;;6081:192:84;;;14437:74:270;14527:18;;;14520:34;;;;14570:18;;;14563:34;14410:18;;6081:192:84;;;;;;;;;;;;;;;;;;;;;;;;6049:238;;;6081:192;6049:238;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6013:274;;;;6306:7;:28;;;;;6332:2;6317:4;:11;:17;;6306:28;6302:222;;;6383:4;6372:27;;;;;;;;;;;;:::i;:::-;6354:45;;1036:21:86;6421:15:84;:43;6417:92;;;-1:-1:-1;1036:21:86;;6551:15:84;-1:-1:-1;;;;;5691:882:84:o;1509:666:91:-;1670:26;1685:10;1670:14;:26::i;:::-;1719:27;;;1707:9;1719:27;;;:18;:27;;;;;1597:9:108;1304:3;1574:61;;;;1766:26:91;;1785:7;1509:666;;;:::o;1766:26::-;1802:22;1827:51;1845:10;1857:7;1866:4;1872:5;1827:17;:51::i;:::-;1802:76;;1889:23;1927:9;1922:209;1942:11;:18;1938:1;:22;1922:209;;;2000:62;2019:10;2031:7;2040:11;2052:1;2040:14;;;;;;;;:::i;:::-;;;;;;;2056:5;2000:18;:62::i;:::-;1981:81;;;;:::i;:::-;;;2098:14;2080:15;:32;2076:45;;;2114:7;;;;1509:666;;;:::o;2076:45::-;1962:3;;1922:209;;;;2148:20;;;;;;;;;;;;;;719:177:100;809:6;834:55;852:36;869:6;877:10;852:16;:36::i;901:198:84:-;1054:27;;;995:4;1054:27;;;:18;:27;;;;;1597:9:108;1018:74:84;;1033:10;;1054:27;;1304:3:108;1574:61;;;1018:14:84;:74::i;1649:4561:85:-;615:14:95;756:23;;;743:37;594:2;735:46;;;1836:24:85;;;1798:87;680:23:95;;;667:37;659:46;;1817:17:85;;;1798:87;611:23:95;;;;598:37;590:46;;1798:87:85;;1965:12;:42;;;;1922:40;;;:85;;;;2035:17;;;;;2017:15;;;:35;-1:-1:-1;;2085:32:85;;:22;;;;;:30;:32::i;:::-;2062:20;;;:55;2150:12;:22;:32;;:22;;;;;:30;:32::i;:::-;2127:20;;;:55;2215:12;:22;;;;;;;;2192:20;;;:45;2280:32;;;;;;2247:65;;:30;;;:65;2348:24;;;;;;2323:22;;;:49;2408:25;;;;;;-1:-1:-1;2382:23:85;;:51;2473:28;;;;;-1:-1:-1;2444:26:85;;:57;2536:24;;;;2511:22;;;:49;2604:32;;-1:-1:-1;2571:30:85;;:65;-1:-1:-1;2739:40:85;;;-1:-1:-1;;2721:58:85;;;;:15;:58;:::i;:::-;2704:75;-1:-1:-1;2793:10:85;;2789:3415;;2960:24;;;3094:30;;;3164:23;;;;2827:4;;-1:-1:-1;2960:24:85;;;;;;3021:25;;;;;;3094:30;3164;;2933:24;;;3315:44;3340:4;3325:19;;;;3346:6;;3315:9;:44::i;:::-;3277:82;;;;3478:8;3473:277;;3550:10;3525:22;:35;3510:50;;3627:10;3612:12;:25;;;;;:::i;:::-;;3586:22;:51;3582:150;;3705:4;3690:12;:19;3665:44;;3582:150;3801:22;3783:15;:40;3768:55;;3879:22;3864:12;:37;;;;;:::i;:::-;;3845:15;:56;3841:166;;3958:10;:30;;;3943:12;:45;;;;;:::i;:::-;;3925:63;;3841:166;-1:-1:-1;;;4064:26:85;;;;4138:22;;;;4222:23;;;;4064:33;;;;;4138:29;;;;4035:26;;4300:54;;:21;4258:20;;;4222:30;;4204:50;;:15;:50;:::i;:::-;4203:77;;;;:::i;:::-;:152;;;;:::i;:::-;4183:172;-1:-1:-1;4374:14:85;;4370:1077;;5156:22;5208:39;5231:15;5208:22;:39::i;:::-;5181:15;;;;:22;;:66;;;;:::i;:::-;5156:91;-1:-1:-1;5317:26:85;5334:9;5156:91;5317:26;:::i;:::-;5282:31;5299:14;5282;:31;:::i;:::-;:62;;;;:::i;:::-;5401:22;;;;5265:79;;-1:-1:-1;5401:29:85;;5384:48;;:14;:48;:::i;:::-;5362:70;;;;:::i;:::-;;;4390:1057;4370:1077;546:57:86;5632:39:85;;5628:566;;5717:24;:15;:22;:24::i;:::-;5691:50;;:23;;;:50;5759:30;;;:55;;;5882:15;5832:66;;:40;;;:66;5939:22;;;;:29;;5921:14;:49;;:86;;;;-1:-1:-1;355:17:86;5974:33:85;;;5921:86;5917:263;;;6060:29;:18;:27;:29::i;:::-;6031:58;;:26;;;:58;6136:25;:14;:23;:25::i;:::-;6111:50;;:22;;;:50;5917:263;2805:3399;;;;;;;1737:4473;1649:4561;;;:::o;566:411:94:-;669:19;690;556:3;806:45;:36;:10;:23;;;:34;;;:36::i;:45::-;779:15;;;;:22;;:72;:97;749:127;;556:3;904:31;:10;:22;;;:29;;568:26:100;;;497:104;904:31:94;:56;890:70;;566:411;;;:::o;1258:476:87:-;1344:7;1370:10;:26;1392:3;1370:26;;1363:34;;;;:::i;:::-;1467:25;1494:22;1532:3;:31;;;1564:15;:44;;1606:1;1564:44;;;1590:4;1564:44;1532:77;;;;;;;;;;372:42:270;360:55;;;1532:77:87;;;342:74:270;315:18;;1532:77:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1466:143;;;;1624:15;:37;;;;;1644:17;1643:18;1624:37;1620:72;;;1670:22;;;;;;;;;;;;;;5269:179:83;5369:29;:18;;;;;5388:9;;5369:18;:29;:::i;:::-;5365:42;;;5269:179;;;:::o;5365:42::-;5417:24;5434:6;5417:16;:24::i;3137:343:87:-;3220:30;;;;;3213:38;;;;:::i;:::-;3313:28;;;3309:165;;3357:3;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3309:165;3417:46;;;;;:37;360:55:270;;;3417:46:87;;;342:74:270;3417:3:87;:37;;;;315:18:270;;3417:46:87;;;;;;;;;;;;;;;;;;;4222:551:82;4327:13;;;658:24:105;4327:35:82;;;;4355:7;4346:16;;:5;:16;;;4327:35;4323:48;;;4222:551;;;:::o;4323:48::-;4407:25;;;;4380:24;4407:25;;;:18;:25;;;;;;;;4463:29;;;;;4407:12;4463:20;;:29;;;;;;4519:17;4506:30;;4502:265;;4568:13;;;4556:9;:27;4552:65;;;4592:25;;;;;;;;;;;;;;4552:65;4672:13;;;4715:29;;;;;;;:20;;;:29;;;;;4659:28;;4715:41;;;;4313:460;;4222:551;;;:::o;2612:1245::-;2709:16;;;2705:50;;2734:21;;;;;;;;;;;;;;2705:50;2771:13;;;658:24:105;2766:1034:82;;2857:24;;;2830;2857;;;:18;:24;;;;;;2830;2957:36;2857:24;1915:9:108;1193:66;2886:41;;;973:66;3041:52;;;3040:58;;;1781:234;2957:36:82;2896:97;;-1:-1:-1;2896:97:82;-1:-1:-1;2492:35:105;;;;;;;;3007:60:82;;;3044:23;;;;;;;;;;;;;;3007:60;3082:21;3106:28;1772:8:105;;;3106:28:82;;;1756:26:105;2668:9:108;;2748:12;2741:19;1193:66;2721:14;;:40;2689:73;;2721:14;-1:-1:-1;3206:27:82;3202:163;;;3253:33;:14;:33;;3287:4;3293:21;;;3318:31;:29;:31::i;:::-;3253:97;;;;;;;;;;16598:42:270;16586:55;;;3253:97:82;;;16568:74:270;16658:18;;;16651:34;;;;16728:14;16721:22;16701:18;;;16694:50;16541:18;;3253:97:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3202:163;3412:22;;;;;;;:18;:22;;;;;1915:9:108;;3412:22:82;;-1:-1:-1;1193:66:108;2886:41;;;973:66;3041:52;;;3040:58;;;3579:22:82;2886:41:108;3595:6:82;3579:22;:::i;:::-;2668:9:108;;2748:12;2741:19;1193:66;2721:14;;:40;2689:73;;2721:14;-1:-1:-1;3663:25:82;3659:131;;;3708:33;:14;:33;;3742:2;3746:19;;;3708:67;;;;;;;;;;16598:42:270;16586:55;;;3708:67:82;;;16568:74:270;16658:18;;;16651:34;3769:5:82;16701:18:270;;;16694:50;16541:18;;3708:67:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3659:131;2788:1012;;;;;;;2766:1034;3815:35;;;;;;;;3834:13;;;3815:35;;160:25:270;;;148:2;133:18;3815:35:82;14:177:270;1933:186:104;1999:7;247:2:86;2077:1:104;2026:48;2039:34;2026:9;:48;:::i;:::-;:52;;;;:::i;:::-;2025:87;;;1933:186;-1:-1:-1;;1933:186:104:o;542:134:102:-;635:28;634:35;;;;542:134::o;6073:112:83:-;2159:12;:29;;;;;;2155:56;;;2197:14;;;;;;;;;;;;;;2155:56;2222:12;:36;;;;;;;;6154:24:::1;6171:6:::0;6154:16:::1;:24::i;:::-;-1:-1:-1::0;2279:12:83;:37;;;;;;6073:112::o;4484:136:87:-;4568:45;;;;;4607:4;4568:45;;;342:74:270;4545:4:87;;4568:3;:30;;;;;315:18:270;;4568:45:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4684:155:91:-;4774:17;;;;4766:40;;4762:70;;4815:17;;;;;;;;;;;;;;2922:883;3088:13;3162:18;3183:63;:54;:41;3198:10;3210:7;3219:4;3183:14;:41::i;:63::-;3162:84;;3261:10;3275:1;3261:15;3257:29;;3285:1;3278:8;;;;;3257:29;3330:10;:24;;;3301:53;;3309:10;:16;;;3301:53;;;3297:502;;3378:10;3370:18;;3297:502;;;3423:11;3419:370;;;3497:17;;;;3544:16;;3563:24;;;;;3497:91;;;;;;;;16957:25:270;;;3497:26:91;17079:15:270;;;17059:18;;;17052:43;17131:15;;;17111:18;;;17104:43;3497:26:91;;;;;16930:18:270;;3497:91:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3489:99;;3419:370;;;3682:17;;;;3730:16;;3749:24;;;;;3682:92;;;;;;;;16957:25:270;;;3682:27:91;17079:15:270;;;17059:18;;;17052:43;17131:15;;;17111:18;;;17104:43;3682:27:91;;;;;16930:18:270;;3682:92:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3670:104;-1:-1:-1;;3419:370:91;3107:698;2922:883;;;;;;:::o;3811:867::-;3987:13;4016:16;4035:31;4042:10;4054:11;4035:6;:31::i;:::-;4016:50;-1:-1:-1;4080:10:91;;;4076:26;;4101:1;4094:8;;;;;4076:26;4131:37;;;;;:28;360:55:270;;;4131:37:91;;;342:74:270;4113:15:91;;4131:28;;;;;;315:18:270;;4131:37:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4113:55;;4182:7;4193:1;4182:12;4178:26;;4203:1;4196:8;;;;;;4178:26;4215:30;4260:11;4256:344;;;4343:17;;;;4391:24;;;;;4343:73;;;;;;;;16957:25:270;;;4343:26:91;17079:15:270;;;17059:18;;;17052:43;17131:15;;;17111:18;;;17104:43;4343:26:91;;;;;16930:18:270;;4343:73:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4318:98;;4256:344;;;4515:17;;;;4564:24;;;;;4515:74;;;;;;;;16957:25:270;;;4515:27:91;17079:15:270;;;17059:18;;;17052:43;17131:15;;;17111:18;;;17104:43;4515:27:91;;;;;16930:18:270;;4515:74:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;4487:102:91;-1:-1:-1;4256:344:91;1158:3:86;4617:39:91;:54;4642:12;;4617:22;:39;:::i;:::-;:54;;;;:::i;:::-;4610:61;3811:867;-1:-1:-1;;;;;;;;3811:867:91:o;902:305:100:-;996:7;1016:19;1037;1060:46;1095:10;1060:34;:46::i;:::-;1015:91;;-1:-1:-1;1015:91:100;-1:-1:-1;1015:91:100;;1147:13;;;:29;:43;;;;;:::i;:::-;;;902:305;-1:-1:-1;;;;;902:305:100:o;454:441:84:-;559:4;634:11;;;630:38;;-1:-1:-1;666:1:84;649:19;;630:38;808:30;;;;840:27;;;;;;;:18;:27;;;;;:47;;;796:92;;:11;;;;;:92::i;686:401:99:-;742:7;761:42;;;818:14;;;814:44;;-1:-1:-1;841:17:99;;686:401;-1:-1:-1;;686:401:99:o;814:44::-;1067:3;1042:2;1030:14;;1023:2;:22;1062:1;1049:14;;;1023:41;:47;;686:401;-1:-1:-1;;;686:401:99:o;613:2879:96:-;688:9;;797:1;811:261;;;;1118:9;;;1144:122;;;;1376:1;1371:6;;1111:284;;1144:122;1242:6;1237:11;;1111:284;;1494:6;1491:1;1487:14;1627:1;1624;1620:9;1615:14;;1519:1943;1648:1;1519:1943;;;1932:1;1927:3;1923:11;1920:106;;;1973:1;1961:13;;1999:5;;1920:106;2105:1;2102;2098:9;2204:4;2200:2;2196:13;2299:2;2290:7;2287:15;2284:110;;;2341:1;2329:13;;2367:5;;;;2284:110;2469:20;;;;-1:-1:-1;;2551:9:96;;;2548:896;;;2646:1;2643;2639:9;2747:1;2743;2739:2;2735:10;2732:17;2722:275;;2852:1;2845:9;2835:136;;2902:1;2890:13;;2936:5;;;2835:136;3102:4;3098:2;3094:13;3205:2;3196:7;3193:15;3190:122;;;3251:1;3239:13;;3281:5;;;;3190:122;3402:20;;;;-1:-1:-1;;2548:896:96;1754:1;1751;1747:9;1742:14;;1519:1943;;;1523:124;790:2686;;811:261;843:1;861:92;;;;1039:1;1034:6;;836:222;;861:92;929:6;924:11;;836:222;;790:2686;613:2879;;;;;;:::o;1884:200:107:-;1939:4;546:57:86;1959:29:107;;1955:79;;;1997:37;;;;;;;;;;;;;;5735:332:83;5816:23;;;;;5850:58;;5887:21;;;;;;;;;;;;;;5850:58;5920:12;5934:17;5955:10;:15;;5988:8;;5998:6;5971:34;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;5955:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5919:87;;;;6022:7;6017:43;;6031:29;6055:4;6031:23;:29::i;4626:129:87:-;4690:4;4713:3;:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1805:149:105;1858:6;1879:72;1897:53;1925:25;;;;;1897;;:53;:::i;357:177:90:-;473:34;;;442:12;473:34;;;:22;:34;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:54;;515:11;;473:41;:54;:::i;1384:183:104:-;1471:4;1494:66;1552:7;1510:39;1539:10;1510:26;;;:39;:::i;:::-;:49;;;;:::i;:::-;1494:15;:66::i;327:237:97:-;397:13;;:17;393:126;;487:6;481:13;472:6;468:2;464:15;457:38;393:126;536:21;;;;;;;;;;;;;;1353:1024:103;1433:12;1462:11;1457:64;;-1:-1:-1;1496:14:103;;1489:21;;1457:64;1554:4;:20;;;1535:39;;:15;:39;;:92;;;-1:-1:-1;1578:19:103;;;;1601:26;;;;1002:10:101;;;;986;;:28;;1578:49:103;1531:149;;;-1:-1:-1;1650:19:103;;;;1643:26;;1531:149;1690:29;1722:37;:4;:26;;;:35;;759:4:101;654:117;1722:37:103;1690:69;;;;1794:28;1825:30;:4;:19;;;:28;;759:4:101;654:117;1825:30:103;1794:61;;;;1869:21;1916:15;1893:4;:20;;;:38;;;1869:62;;2168:4;:17;;;2103:82;;2152:13;2128:20;2104:21;:44;2103:62;:82;;;;;:::i;:::-;;2064:121;;;;;1353:1024;-1:-1:-1;;;;;1353:1024:103:o;427:250:270:-;512:1;522:113;536:6;533:1;530:13;522:113;;;612:11;;;606:18;593:11;;;586:39;558:2;551:10;522:113;;;-1:-1:-1;;669:1:270;651:16;;644:27;427:250::o;682:455::-;831:2;820:9;813:21;794:4;863:6;857:13;906:6;901:2;890:9;886:18;879:34;922:79;994:6;989:2;978:9;974:18;969:2;961:6;957:15;922:79;:::i;:::-;1053:2;1041:15;1058:66;1037:88;1022:104;;;;1128:2;1018:113;;682:455;-1:-1:-1;;682:455:270:o;1142:180::-;1201:6;1254:2;1242:9;1233:7;1229:23;1225:32;1222:52;;;1270:1;1267;1260:12;1222:52;-1:-1:-1;1293:23:270;;1142:180;-1:-1:-1;1142:180:270:o;1327:154::-;1413:42;1406:5;1402:54;1395:5;1392:65;1382:93;;1471:1;1468;1461:12;1486:315;1554:6;1562;1615:2;1603:9;1594:7;1590:23;1586:32;1583:52;;;1631:1;1628;1621:12;1583:52;1670:9;1657:23;1689:31;1714:5;1689:31;:::i;:::-;1739:5;1791:2;1776:18;;;;1763:32;;-1:-1:-1;;;1486:315:270:o;2290:456::-;2367:6;2375;2383;2436:2;2424:9;2415:7;2411:23;2407:32;2404:52;;;2452:1;2449;2442:12;2404:52;2491:9;2478:23;2510:31;2535:5;2510:31;:::i;:::-;2560:5;-1:-1:-1;2617:2:270;2602:18;;2589:32;2630:33;2589:32;2630:33;:::i;:::-;2290:456;;2682:7;;-1:-1:-1;;;2736:2:270;2721:18;;;;2708:32;;2290:456::o;3137:247::-;3196:6;3249:2;3237:9;3228:7;3224:23;3220:32;3217:52;;;3265:1;3262;3255:12;3217:52;3304:9;3291:23;3323:31;3348:5;3323:31;:::i;4383:315::-;4451:6;4459;4512:2;4500:9;4491:7;4487:23;4483:32;4480:52;;;4528:1;4525;4518:12;4480:52;4564:9;4551:23;4541:33;;4624:2;4613:9;4609:18;4596:32;4637:31;4662:5;4637:31;:::i;:::-;4687:5;4677:15;;;4383:315;;;;;:::o;4703:159::-;4770:20;;4830:6;4819:18;;4809:29;;4799:57;;4852:1;4849;4842:12;4867:163;4934:20;;4994:10;4983:22;;4973:33;;4963:61;;5020:1;5017;5010:12;5035:464;5118:6;5126;5134;5142;5195:3;5183:9;5174:7;5170:23;5166:33;5163:53;;;5212:1;5209;5202:12;5163:53;5251:9;5238:23;5270:31;5295:5;5270:31;:::i;:::-;5320:5;-1:-1:-1;5344:37:270;5377:2;5362:18;;5344:37;:::i;:::-;5334:47;;5400:37;5433:2;5422:9;5418:18;5400:37;:::i;:::-;5390:47;;5456:37;5489:2;5478:9;5474:18;5456:37;:::i;:::-;5446:47;;5035:464;;;;;;;:::o;5504:659::-;5583:6;5591;5599;5652:2;5640:9;5631:7;5627:23;5623:32;5620:52;;;5668:1;5665;5658:12;5620:52;5704:9;5691:23;5681:33;;5765:2;5754:9;5750:18;5737:32;5788:18;5829:2;5821:6;5818:14;5815:34;;;5845:1;5842;5835:12;5815:34;5883:6;5872:9;5868:22;5858:32;;5928:7;5921:4;5917:2;5913:13;5909:27;5899:55;;5950:1;5947;5940:12;5899:55;5990:2;5977:16;6016:2;6008:6;6005:14;6002:34;;;6032:1;6029;6022:12;6002:34;6077:7;6072:2;6063:6;6059:2;6055:15;6051:24;6048:37;6045:57;;;6098:1;6095;6088:12;6045:57;6129:2;6125;6121:11;6111:21;;6151:6;6141:16;;;;;5504:659;;;;;:::o;6168:184::-;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6318:28;6336:9;6318:28;:::i;6357:488::-;6410:3;6448:5;6442:12;6475:6;6470:3;6463:19;6501:4;6530;6525:3;6521:14;6514:21;;6569:4;6562:5;6558:16;6592:1;6602:218;6616:6;6613:1;6610:13;6602:218;;;6681:13;;6696:42;6677:62;6665:75;;6760:12;;;;6795:15;;;;6638:1;6631:9;6602:218;;;-1:-1:-1;6836:3:270;;6357:488;-1:-1:-1;;;;;6357:488:270:o;6850:261::-;7029:2;7018:9;7011:21;6992:4;7049:56;7101:2;7090:9;7086:18;7078:6;7049:56;:::i;7116:529::-;7193:6;7201;7209;7262:2;7250:9;7241:7;7237:23;7233:32;7230:52;;;7278:1;7275;7268:12;7230:52;7317:9;7304:23;7336:31;7361:5;7336:31;:::i;:::-;7386:5;-1:-1:-1;7443:2:270;7428:18;;7415:32;7456:33;7415:32;7456:33;:::i;:::-;7508:7;-1:-1:-1;7567:2:270;7552:18;;7539:32;7580:33;7539:32;7580:33;:::i;:::-;7632:7;7622:17;;;7116:529;;;;;:::o;7903:118::-;7989:5;7982:13;7975:21;7968:5;7965:32;7955:60;;8011:1;8008;8001:12;8026:382;8091:6;8099;8152:2;8140:9;8131:7;8127:23;8123:32;8120:52;;;8168:1;8165;8158:12;8120:52;8207:9;8194:23;8226:31;8251:5;8226:31;:::i;:::-;8276:5;-1:-1:-1;8333:2:270;8318:18;;8305:32;8346:30;8305:32;8346:30;:::i;8413:184::-;8471:6;8524:2;8512:9;8503:7;8499:23;8495:32;8492:52;;;8540:1;8537;8530:12;8492:52;8563:28;8581:9;8563:28;:::i;8602:750::-;8697:6;8705;8713;8766:2;8754:9;8745:7;8741:23;8737:32;8734:52;;;8782:1;8779;8772:12;8734:52;8821:9;8808:23;8840:31;8865:5;8840:31;:::i;:::-;8890:5;-1:-1:-1;8946:2:270;8931:18;;8918:32;8969:18;8999:14;;;8996:34;;;9026:1;9023;9016:12;8996:34;9064:6;9053:9;9049:22;9039:32;;9109:7;9102:4;9098:2;9094:13;9090:27;9080:55;;9131:1;9128;9121:12;9080:55;9171:2;9158:16;9197:2;9189:6;9186:14;9183:34;;;9213:1;9210;9203:12;9183:34;9266:7;9261:2;9251:6;9248:1;9244:14;9240:2;9236:23;9232:32;9229:45;9226:65;;;9287:1;9284;9277:12;9357:456;9434:6;9442;9450;9503:2;9491:9;9482:7;9478:23;9474:32;9471:52;;;9519:1;9516;9509:12;9471:52;9555:9;9542:23;9532:33;;9615:2;9604:9;9600:18;9587:32;9628:31;9653:5;9628:31;:::i;9818:525::-;9904:6;9912;9920;9928;9981:3;9969:9;9960:7;9956:23;9952:33;9949:53;;;9998:1;9995;9988:12;9949:53;10037:9;10024:23;10056:31;10081:5;10056:31;:::i;:::-;10106:5;-1:-1:-1;10163:2:270;10148:18;;10135:32;10176:33;10135:32;10176:33;:::i;:::-;9818:525;;10228:7;;-1:-1:-1;;;;10282:2:270;10267:18;;10254:32;;10333:2;10318:18;10305:32;;9818:525::o;10348:875::-;10633:2;10622:9;10615:21;10596:4;10659:56;10711:2;10700:9;10696:18;10688:6;10659:56;:::i;:::-;10772:22;;;10734:2;10752:18;;;10745:50;;;;10844:13;;10866:22;;;10942:15;;;;10904;;;10975:1;10985:169;10999:6;10996:1;10993:13;10985:169;;;11060:13;;11048:26;;11129:15;;;;11094:12;;;;11021:1;11014:9;10985:169;;;10989:3;;11171;11163:11;;;;;11210:6;11205:2;11194:9;11190:18;11183:34;10348:875;;;;;;:::o;11228:388::-;11296:6;11304;11357:2;11345:9;11336:7;11332:23;11328:32;11325:52;;;11373:1;11370;11363:12;11325:52;11412:9;11399:23;11431:31;11456:5;11431:31;:::i;:::-;11481:5;-1:-1:-1;11538:2:270;11523:18;;11510:32;11551:33;11510:32;11551:33;:::i;11938:319::-;12005:6;12013;12066:2;12054:9;12045:7;12041:23;12037:32;12034:52;;;12082:1;12079;12072:12;12034:52;12121:9;12108:23;12140:31;12165:5;12140:31;:::i;:::-;12190:5;-1:-1:-1;12214:37:270;12247:2;12232:18;;12214:37;:::i;:::-;12204:47;;11938:319;;;;;:::o;12262:256::-;12328:6;12336;12389:2;12377:9;12368:7;12364:23;12360:32;12357:52;;;12405:1;12402;12395:12;12357:52;12428:28;12446:9;12428:28;:::i;:::-;12418:38;;12475:37;12508:2;12497:9;12493:18;12475:37;:::i;12523:287::-;12652:3;12690:6;12684:13;12706:66;12765:6;12760:3;12753:4;12745:6;12741:17;12706:66;:::i;:::-;12788:16;;;;;12523:287;-1:-1:-1;;12523:287:270:o;12815:273::-;12883:6;12936:2;12924:9;12915:7;12911:23;12907:32;12904:52;;;12952:1;12949;12942:12;12904:52;12984:9;12978:16;13034:4;13027:5;13023:16;13016:5;13013:27;13003:55;;13054:1;13051;13044:12;13093:245;13160:6;13213:2;13201:9;13192:7;13188:23;13184:32;13181:52;;;13229:1;13226;13219:12;13181:52;13261:9;13255:16;13280:28;13302:5;13280:28;:::i;13343:184::-;13395:77;13392:1;13385:88;13492:4;13489:1;13482:15;13516:4;13513:1;13506:15;13532:125;13597:9;;;13618:10;;;13615:36;;;13631:18;;:::i;13662:184::-;13714:77;13711:1;13704:88;13811:4;13808:1;13801:15;13835:4;13832:1;13825:15;13851:379;13927:6;13935;13988:2;13976:9;13967:7;13963:23;13959:32;13956:52;;;14004:1;14001;13994:12;13956:52;14036:9;14030:16;14055:31;14080:5;14055:31;:::i;:::-;14155:2;14140:18;;14134:25;14105:5;;-1:-1:-1;14168:30:270;14134:25;14168:30;:::i;14608:184::-;14678:6;14731:2;14719:9;14710:7;14706:23;14702:32;14699:52;;;14747:1;14744;14737:12;14699:52;-1:-1:-1;14770:16:270;;14608:184;-1:-1:-1;14608:184:270:o;15409:::-;15461:77;15458:1;15451:88;15558:4;15555:1;15548:15;15582:4;15579:1;15572:15;15598:128;15665:9;;;15686:11;;;15683:37;;;15700:18;;:::i;15731:168::-;15804:9;;;15835;;15852:15;;;15846:22;;15832:37;15822:71;;15873:18;;:::i;15904:274::-;15944:1;15970;15960:189;;16005:77;16002:1;15995:88;16106:4;16103:1;16096:15;16134:4;16131:1;16124:15;15960:189;-1:-1:-1;16163:9:270;;15904:274::o;16183:184::-;16235:77;16232:1;16225:88;16332:4;16329:1;16322:15;16356:4;16353:1;16346:15;17158:245;17237:6;17245;17298:2;17286:9;17277:7;17273:23;17269:32;17266:52;;;17314:1;17311;17304:12;17266:52;-1:-1:-1;;17337:16:270;;17393:2;17378:18;;;17372:25;17337:16;;17372:25;;-1:-1:-1;17158:245:270:o;17408:395::-;17619:6;17611;17606:3;17593:33;17689:2;17685:15;;;;17702:66;17681:88;17645:16;;17670:100;;;17794:2;17786:11;;17408:395;-1:-1:-1;17408:395:270:o","linkReferences":{},"immutableReferences":{"17434":[{"start":3175,"length":32},{"start":6058,"length":32}],"17437":[{"start":2566,"length":32},{"start":3961,"length":32},{"start":4130,"length":32}],"17440":[{"start":3836,"length":32},{"start":3913,"length":32},{"start":4081,"length":32},{"start":5093,"length":32},{"start":5893,"length":32}],"17443":[{"start":1818,"length":32},{"start":4020,"length":32},{"start":4783,"length":32},{"start":4888,"length":32},{"start":5310,"length":32},{"start":5546,"length":32},{"start":5610,"length":32},{"start":5713,"length":32}],"17446":[{"start":2294,"length":32},{"start":5198,"length":32},{"start":6002,"length":32}],"17449":[{"start":2763,"length":32},{"start":5154,"length":32},{"start":5354,"length":32},{"start":6114,"length":32}],"17452":[{"start":2860,"length":32},{"start":4670,"length":32},{"start":6300,"length":32},{"start":6343,"length":32}],"17455":[{"start":3376,"length":32},{"start":4174,"length":32},{"start":4441,"length":32},{"start":4544,"length":32},{"start":4618,"length":32},{"start":4839,"length":32},{"start":4945,"length":32},{"start":4989,"length":32},{"start":5769,"length":32},{"start":6236,"length":32}],"24788":[{"start":17614,"length":32},{"start":18009,"length":32}],"26617":[{"start":4374,"length":32},{"start":4504,"length":32},{"start":4743,"length":32},{"start":5053,"length":32},{"start":5270,"length":32},{"start":5426,"length":32},{"start":5506,"length":32},{"start":5673,"length":32},{"start":5853,"length":32},{"start":5962,"length":32},{"start":6186,"length":32},{"start":7264,"length":32},{"start":7724,"length":32},{"start":7766,"length":32},{"start":8441,"length":32},{"start":9528,"length":32},{"start":9570,"length":32},{"start":11479,"length":32},{"start":11566,"length":32},{"start":16187,"length":32},{"start":16236,"length":32},{"start":16652,"length":32},{"start":16838,"length":32},{"start":18608,"length":32},{"start":20666,"length":32}]}},"methodIdentifiers":{"EVC()":"a70354a1","LTVBorrow(address)":"bf58094d","LTVFull(address)":"33708d0c","LTVLiquidation(address)":"af5aaeeb","LTVList()":"6a16ef84","MODULE_BALANCE_FORWARDER()":"883e3875","MODULE_BORROWING()":"14c054bc","MODULE_GOVERNANCE()":"b4cd541b","MODULE_INITIALIZE()":"ad80ad0b","MODULE_LIQUIDATION()":"42895567","MODULE_RISKMANAGER()":"7d5f2e4e","MODULE_TOKEN()":"5fa23055","MODULE_VAULT()":"e2f206e5","accountLiquidity(address,bool)":"a824bf67","accountLiquidityFull(address,bool)":"c7b0e3a3","accumulatedFees()":"587f5ed7","accumulatedFeesAssets()":"f6e50f58","allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","asset()":"38d52e0f","balanceForwarderEnabled(address)":"e15c82ec","balanceOf(address)":"70a08231","balanceTrackerAddress()":"ece6a7fa","borrow(uint256,address)":"4b3fd148","caps()":"18e22d98","cash()":"961be391","checkAccountStatus(address,address[])":"b168c58f","checkLiquidation(address,address,address)":"88aa6f12","checkVaultStatus()":"4b3d1223","configFlags()":"2b38a367","convertFees()":"2b5335c3","convertToAssets(uint256)":"07a2d13a","convertToShares(uint256)":"c6e6f592","creator()":"02d05d3f","dToken()":"d9d7858a","debtOf(address)":"d283e75f","debtOfExact(address)":"ab49b7f1","decimals()":"313ce567","deposit(uint256,address)":"6e553f65","disableBalanceForwarder()":"41233a98","disableController()":"869e50c7","enableBalanceForwarder()":"64b1cdd6","feeReceiver()":"b3f00674","flashLoan(uint256,bytes)":"5296a431","governorAdmin()":"6ce98c29","hookConfig()":"cf349b7d","initialize(address)":"c4d66de8","interestAccumulator()":"087a6007","interestFee()":"a75df498","interestRate()":"7c3a00fd","interestRateModel()":"f3fdb15a","liquidate(address,address,uint256,uint256)":"c1342574","liquidationCoolOffTime()":"4abdb959","maxDeposit(address)":"402d267d","maxLiquidationDiscount()":"4f7e43df","maxMint(address)":"c63d75b6","maxRedeem(address)":"d905777e","maxWithdraw(address)":"ce96cb77","mint(uint256,address)":"94bf804d","name()":"06fdde03","oracle()":"7dc0d1d0","permit2Address()":"c5224983","previewDeposit(uint256)":"ef8b30f7","previewMint(uint256)":"b3d7f6b9","previewRedeem(uint256)":"4cdad506","previewWithdraw(uint256)":"0a28a477","protocolConfigAddress()":"539bd5bf","protocolFeeReceiver()":"39a51be5","protocolFeeShare()":"960b26a2","pullDebt(uint256,address)":"aebde56b","redeem(uint256,address,address)":"ba087652","repay(uint256,address)":"acb70815","repayWithShares(uint256,address)":"a9c8eb7e","setCaps(uint16,uint16)":"d87f780f","setConfigFlags(uint32)":"ada3d56f","setFeeReceiver(address)":"efdcd974","setGovernorAdmin(address)":"82ebd674","setHookConfig(address,uint32)":"d1a3a308","setInterestFee(uint16)":"60cb90ef","setInterestRateModel(address)":"8bcd4016","setLTV(address,uint16,uint16,uint32)":"4bca3d5b","setLiquidationCoolOffTime(uint16)":"af06d3cf","setMaxLiquidationDiscount(uint16)":"b4113ba7","skim(uint256,address)":"8d56c639","symbol()":"95d89b41","totalAssets()":"01e1d114","totalBorrows()":"47bd3718","totalBorrowsExact()":"e388be7b","totalSupply()":"18160ddd","touch()":"a55526db","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd","transferFromMax(address,address)":"cbfdd7e1","unitOfAccount()":"3e833364","viewDelegate()":"1fe8b953","withdraw(uint256,address,address)":"b460af94"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"evc\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"protocolConfig\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sequenceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"balanceTracker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"permit2\",\"type\":\"address\"}],\"internalType\":\"struct Base.Integrations\",\"name\":\"integrations\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"initialize\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"borrowing\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"liquidation\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"riskManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"balanceForwarder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"governance\",\"type\":\"address\"}],\"internalType\":\"struct Dispatch.DeployedModules\",\"name\":\"modules\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"E_AccountLiquidity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_AmountTooLargeToEncode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadAssetReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadBorrowCap\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadCollateral\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadMaxLiquidationDiscount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadSharesOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadSharesReceiver\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BadSupplyCap\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_BorrowCapExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_CheckUnauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_CollateralDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ConfigAmountTooLargeToEncode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ControllerDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_DebtAmountTooLargeToEncode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_EmptyError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ExcessiveRepayAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_FlashLoanNotRepaid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_Initialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_InsufficientAssets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_InsufficientCash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_InsufficientDebt\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_InvalidLTVAsset\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_LTVBorrow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_LTVLiquidation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_LiquidationCoolOff\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_MinYield\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_NoLiability\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_NoPriceOracle\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_NotController\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_NotHookTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_OperationDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_OutstandingDebt\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ProxyMetadata\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_Reentrancy\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_RepayTooMuch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_SelfLiquidation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_SelfTransfer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_SupplyCapExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_TransientState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ViolatorLiquidityDeferred\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ZeroAssets\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"E_ZeroShares\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"BalanceForwarderStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"Borrow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"protocolReceiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"governorReceiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"protocolShares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"governorShares\",\"type\":\"uint256\"}],\"name\":\"ConvertFees\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"DebtSocialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"dToken\",\"type\":\"address\"}],\"name\":\"EVaultCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newSupplyCap\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newBorrowCap\",\"type\":\"uint16\"}],\"name\":\"GovSetCaps\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"newConfigFlags\",\"type\":\"uint32\"}],\"name\":\"GovSetConfigFlags\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newFeeReceiver\",\"type\":\"address\"}],\"name\":\"GovSetFeeReceiver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newGovernorAdmin\",\"type\":\"address\"}],\"name\":\"GovSetGovernorAdmin\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newHookTarget\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"newHookedOps\",\"type\":\"uint32\"}],\"name\":\"GovSetHookConfig\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newFee\",\"type\":\"uint16\"}],\"name\":\"GovSetInterestFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newInterestRateModel\",\"type\":\"address\"}],\"name\":\"GovSetInterestRateModel\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"borrowLTV\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"liquidationLTV\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"initialLiquidationLTV\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"targetTimestamp\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rampDuration\",\"type\":\"uint32\"}],\"name\":\"GovSetLTV\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newCoolOffTime\",\"type\":\"uint16\"}],\"name\":\"GovSetLiquidationCoolOffTime\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newDiscount\",\"type\":\"uint16\"}],\"name\":\"GovSetMaxLiquidationDiscount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"InterestAccrued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"liquidator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"violator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"repayAssets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"yieldBalance\",\"type\":\"uint256\"}],\"name\":\"Liquidate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"PullDebt\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"Repay\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalShares\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalBorrows\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accumulatedFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cash\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"interestAccumulator\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"interestRate\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"VaultStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"EVC\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"}],\"name\":\"LTVBorrow\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"}],\"name\":\"LTVFull\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"borrowLTV\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"liquidationLTV\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"initialLiquidationLTV\",\"type\":\"uint16\"},{\"internalType\":\"uint48\",\"name\":\"targetTimestamp\",\"type\":\"uint48\"},{\"internalType\":\"uint32\",\"name\":\"rampDuration\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"}],\"name\":\"LTVLiquidation\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LTVList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_BALANCE_FORWARDER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_BORROWING\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_GOVERNANCE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_INITIALIZE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_LIQUIDATION\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_RISKMANAGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MODULE_VAULT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"liquidation\",\"type\":\"bool\"}],\"name\":\"accountLiquidity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralValue\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"liabilityValue\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"liquidation\",\"type\":\"bool\"}],\"name\":\"accountLiquidityFull\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"collaterals\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"collateralValues\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"liabilityValue\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accumulatedFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accumulatedFeesAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceForwarderEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balanceTrackerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"borrow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"caps\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"supplyCap\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"borrowCap\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"collaterals\",\"type\":\"address[]\"}],\"name\":\"checkAccountStatus\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"liquidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"violator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"}],\"name\":\"checkLiquidation\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"maxRepay\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxYield\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"checkVaultStatus\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"configFlags\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"convertFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"convertToAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"convertToShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"creator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"debtOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"debtOfExact\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableBalanceForwarder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableBalanceForwarder\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"flashLoan\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governorAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"hookConfig\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyCreator\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interestAccumulator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interestFee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interestRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interestRateModel\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"violator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"repayAssets\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minYieldBalance\",\"type\":\"uint256\"}],\"name\":\"liquidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidationCoolOffTime\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"maxDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxLiquidationDiscount\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"maxMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"maxRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"maxWithdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"permit2Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"previewDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"previewMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"previewRedeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assets\",\"type\":\"uint256\"}],\"name\":\"previewWithdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"protocolConfigAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"protocolFeeReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"protocolFeeShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"pullDebt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"repay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"repayWithShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"supplyCap\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"borrowCap\",\"type\":\"uint16\"}],\"name\":\"setCaps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"newConfigFlags\",\"type\":\"uint32\"}],\"name\":\"setConfigFlags\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newFeeReceiver\",\"type\":\"address\"}],\"name\":\"setFeeReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newGovernorAdmin\",\"type\":\"address\"}],\"name\":\"setGovernorAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newHookTarget\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"newHookedOps\",\"type\":\"uint32\"}],\"name\":\"setHookConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newFee\",\"type\":\"uint16\"}],\"name\":\"setInterestFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newModel\",\"type\":\"address\"}],\"name\":\"setInterestRateModel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"borrowLTV\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"liquidationLTV\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"rampDuration\",\"type\":\"uint32\"}],\"name\":\"setLTV\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newCoolOffTime\",\"type\":\"uint16\"}],\"name\":\"setLiquidationCoolOffTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newDiscount\",\"type\":\"uint16\"}],\"name\":\"setMaxLiquidationDiscount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"skim\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalAssets\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBorrows\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBorrowsExact\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"touch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferFromMax\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unitOfAccount\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"viewDelegate\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Euler Labs (https://www.eulerlabs.com/)\",\"custom:security-contact\":\"security@euler.xyz\",\"details\":\"The responsibility of this contract is call routing. Select functions are embedded, while most are delegated to the modules\",\"events\":{\"Approval(address,address,uint256)\":{\"params\":{\"owner\":\"Address granting approval to spend tokens\",\"spender\":\"Address receiving approval to spend tokens\",\"value\":\"Amount of tokens approved to spend\"}},\"BalanceForwarderStatus(address,bool)\":{\"params\":{\"account\":\"Address which enabled or disabled balance tracking\",\"status\":\"True if balance tracking was enabled, false otherwise\"}},\"Borrow(address,uint256)\":{\"params\":{\"account\":\"Address adding liability\",\"assets\":\"Amount of debt added in assets\"}},\"ConvertFees(address,address,address,uint256,uint256)\":{\"params\":{\"governorReceiver\":\"Address receiving the governor's share of the fees\",\"governorShares\":\"Amount of shares transferred to the governor receiver\",\"protocolReceiver\":\"Address receiving the protocol's share of the fees\",\"protocolShares\":\"Amount of shares transferred to the protocol receiver\",\"sender\":\"Address initializing the conversion\"}},\"DebtSocialized(address,uint256)\":{\"params\":{\"account\":\"Address holding an unhealthy borrow\",\"assets\":\"Amount of debt socialized among all of the share holders\"}},\"Deposit(address,address,uint256,uint256)\":{\"params\":{\"assets\":\"Amount of assets deposited\",\"owner\":\"Address holding the assets\",\"sender\":\"Address initiating the deposit\",\"shares\":\"Amount of shares minted as receipt for the deposit\"}},\"EVaultCreated(address,address,address)\":{\"params\":{\"asset\":\"The underlying asset of the vault\",\"creator\":\"Address designated as the vault's creator\",\"dToken\":\"Address of the sidecar debt token\"}},\"GovSetCaps(uint16,uint16)\":{\"params\":{\"newBorrowCap\":\"New borrow cap in AmountCap format\",\"newSupplyCap\":\"New supply cap in AmountCap format\"}},\"GovSetConfigFlags(uint32)\":{\"params\":{\"newConfigFlags\":\"New configuration flags. See Constants.sol for a list of configuration flags\"}},\"GovSetFeeReceiver(address)\":{\"params\":{\"newFeeReceiver\":\"Address of the new fee receiver\"}},\"GovSetGovernorAdmin(address)\":{\"params\":{\"newGovernorAdmin\":\"Address of the new governor\"}},\"GovSetHookConfig(address,uint32)\":{\"params\":{\"newHookTarget\":\"Address of the new hook target contract\",\"newHookedOps\":\"A bitfield of operations to be hooked. See Constants.sol for a list of operations\"}},\"GovSetInterestFee(uint16)\":{\"params\":{\"newFee\":\"New interest fee as percentage in 1e4 scale\"}},\"GovSetInterestRateModel(address)\":{\"params\":{\"newInterestRateModel\":\"Address of the new IRM\"}},\"GovSetLTV(address,uint16,uint16,uint16,uint48,uint32)\":{\"params\":{\"borrowLTV\":\"The new LTV for the collateral, used to determine health of the account during regular operations, in 1e4 scale\",\"collateral\":\"Address of the collateral\",\"initialLiquidationLTV\":\"The previous liquidation LTV at the moment a new configuration was set\",\"liquidationLTV\":\"The new LTV for the collateral, used to determine health of the account during liquidations, in 1e4 scale\",\"rampDuration\":\"If the LTV is lowered, duration in seconds, during which the liquidation LTV will be merging with `targetLTV`\",\"targetTimestamp\":\"If the LTV is lowered, the timestamp when the ramped liquidation LTV will merge with the `targetLTV`\"}},\"GovSetLiquidationCoolOffTime(uint16)\":{\"params\":{\"newCoolOffTime\":\"The new liquidation cool off time in seconds\"}},\"GovSetMaxLiquidationDiscount(uint16)\":{\"params\":{\"newDiscount\":\"The new maximum liquidation discount in 1e4 scale\"}},\"InterestAccrued(address,uint256)\":{\"params\":{\"account\":\"Address being charged interest\",\"assets\":\"Amount of debt added in assets\"}},\"Liquidate(address,address,address,uint256,uint256)\":{\"params\":{\"collateral\":\"Address of the asset seized\",\"liquidator\":\"Address executing the liquidation\",\"repayAssets\":\"Amount of debt in assets transferred from violator to liquidator\",\"violator\":\"Address holding an unhealthy borrow\",\"yieldBalance\":\"Amount of collateral asset's balance transferred from violator to liquidator\"}},\"PullDebt(address,address,uint256)\":{\"params\":{\"assets\":\"Amount of debt transferred in assets\",\"from\":\"Account from which the debt is taken\",\"to\":\"Account taking on the debt\"}},\"Repay(address,uint256)\":{\"params\":{\"account\":\"Address repaying the debt\",\"assets\":\"Amount of debt removed in assets\"}},\"Transfer(address,address,uint256)\":{\"params\":{\"from\":\"Sender address\",\"to\":\"Receiver address\",\"value\":\"Tokens sent\"}},\"VaultStatus(uint256,uint256,uint256,uint256,uint256,uint256,uint256)\":{\"params\":{\"accumulatedFees\":\"Interest fees accrued in the accumulator\",\"cash\":\"The amount of assets held by the vault directly\",\"interestAccumulator\":\"Current interest accumulator in ray\",\"interestRate\":\"Current interest rate, which will be applied during the next fee accrual\",\"timestamp\":\"Current block's timestamp\",\"totalBorrows\":\"Sum of all borrows in assets\",\"totalShares\":\"Sum of all shares\"}},\"Withdraw(address,address,address,uint256,uint256)\":{\"params\":{\"assets\":\"Amount of assets sent to the receiver\",\"owner\":\"Address holding the shares\",\"receiver\":\"Address receiving the assets\",\"sender\":\"Address initiating the withdrawal\",\"shares\":\"Amount of shares burned\"}}},\"kind\":\"dev\",\"methods\":{\"EVC()\":{\"returns\":{\"_0\":\"The EVC address\"}},\"LTVBorrow(address)\":{\"params\":{\"collateral\":\"The address of the collateral to query\"},\"returns\":{\"_0\":\"Borrowing LTV in 1e4 scale\"}},\"LTVFull(address)\":{\"params\":{\"collateral\":\"Collateral asset\"},\"returns\":{\"borrowLTV\":\"The current value of borrow LTV for originating positions\",\"initialLiquidationLTV\":\"The initial value of the liquidation LTV, when the ramp began\",\"liquidationLTV\":\"The value of fully converged liquidation LTV\",\"rampDuration\":\"The time it takes for the liquidation LTV to converge from the initial value to the fully converged value\",\"targetTimestamp\":\"The timestamp when the liquidation LTV is considered fully converged\"}},\"LTVLiquidation(address)\":{\"params\":{\"collateral\":\"The address of the collateral to query\"},\"returns\":{\"_0\":\"Liquidation LTV in 1e4 scale\"}},\"LTVList()\":{\"details\":\"Returned assets could have the ltv disabled (set to zero)\",\"returns\":{\"_0\":\"List of asset collaterals\"}},\"accountLiquidity(address,bool)\":{\"params\":{\"account\":\"Account holding debt in this vault\",\"liquidation\":\"Flag to indicate if the calculation should be performed in liquidation vs account status check mode, where different LTV values might apply.\"},\"returns\":{\"collateralValue\":\"Total risk adjusted value of all collaterals in unit of account\",\"liabilityValue\":\"Value of debt in unit of account\"}},\"accountLiquidityFull(address,bool)\":{\"params\":{\"account\":\"Account holding debt in this vault\",\"liquidation\":\"Flag to indicate if the calculation should be performed in liquidation vs account status check mode, where different LTV values might apply.\"},\"returns\":{\"collateralValues\":\"Array of risk adjusted collateral values corresponding to items in collaterals array. In unit of account\",\"collaterals\":\"Array of collaterals enabled\",\"liabilityValue\":\"Value of debt in unit of account\"}},\"accumulatedFees()\":{\"returns\":{\"_0\":\"The accumulated fees in shares\"}},\"accumulatedFeesAssets()\":{\"returns\":{\"_0\":\"The accumulated fees in asset units\"}},\"allowance(address,address)\":{\"params\":{\"holder\":\"The account holding the eTokens\",\"spender\":\"Trusted address\"},\"returns\":{\"_0\":\"The allowance from holder for spender\"}},\"approve(address,uint256)\":{\"params\":{\"amount\":\"Use max uint for \\\"infinite\\\" allowance\",\"spender\":\"Trusted address\"},\"returns\":{\"_0\":\"True if approval succeeded\"}},\"asset()\":{\"returns\":{\"_0\":\"The vault's underlying asset\"}},\"balanceForwarderEnabled(address)\":{\"params\":{\"account\":\"Address to query\"},\"returns\":{\"_0\":\"True if balance forwarder is enabled\"}},\"balanceOf(address)\":{\"params\":{\"account\":\"Address to query\"},\"returns\":{\"_0\":\"The balance of the account\"}},\"balanceTrackerAddress()\":{\"returns\":{\"_0\":\"The balance tracker address\"}},\"borrow(uint256,address)\":{\"params\":{\"amount\":\"Amount of assets to borrow (use max uint256 for all available tokens)\",\"receiver\":\"Account receiving the borrowed tokens\"},\"returns\":{\"_0\":\"Amount of assets borrowed\"}},\"caps()\":{\"returns\":{\"borrowCap\":\"The borrow cap in AmountCap format\",\"supplyCap\":\"The supply cap in AmountCap format\"}},\"cash()\":{\"returns\":{\"_0\":\"The amount of assets the vault tracks as current direct holdings\"}},\"checkAccountStatus(address,address[])\":{\"details\":\"The function doesn't have a reentrancy lock, because onlyEVCChecks provides equivalent behaviour. It ensures that the caller is the EVC, in 'checks in progress' state. In this state EVC will not accept any calls. Since all the functions which modify vault state use callThroughEVC modifier, they are effectively blocked while the function executes. There are non-view functions without `callThroughEVC` modifier (`flashLoan`, `disableController`), but they don't change the vault's storage.\",\"params\":{\"account\":\"The address of the account to be checked\"},\"returns\":{\"_0\":\"Must return the bytes4 magic value 0xb168c58f (which is a selector of this function) when account status is valid, or revert otherwise.\"}},\"checkLiquidation(address,address,address)\":{\"details\":\"The function will not revert if the account is healthy and return (0, 0)\",\"params\":{\"collateral\":\"Collateral which is to be seized\",\"liquidator\":\"Address that will initiate the liquidation\",\"violator\":\"Address that may be in collateral violation\"},\"returns\":{\"maxRepay\":\"Max amount of debt that can be repaid, in asset units\",\"maxYield\":\"Yield in collateral corresponding to max allowed amount of debt to be repaid, in collateral balance (shares for vaults)\"}},\"checkVaultStatus()\":{\"details\":\"See comment about reentrancy for `checkAccountStatus`\",\"returns\":{\"_0\":\"Must return the bytes4 magic value 0x4b3d1223 (which is a selector of this function) when account status is valid, or revert otherwise.\"}},\"configFlags()\":{\"returns\":{\"_0\":\"Bitmask with config flags enabled\"}},\"convertToAssets(uint256)\":{\"params\":{\"shares\":\"Amount of shares to convert\"},\"returns\":{\"_0\":\"The amount of assets\"}},\"convertToShares(uint256)\":{\"params\":{\"assets\":\"Amount of assets to convert\"},\"returns\":{\"_0\":\"The amount of shares\"}},\"creator()\":{\"returns\":{\"_0\":\"The address of the creator\"}},\"dToken()\":{\"returns\":{\"_0\":\"The address of the DToken\"}},\"debtOf(address)\":{\"params\":{\"account\":\"Address to query\"},\"returns\":{\"_0\":\"The debt of the account in asset units\"}},\"debtOfExact(address)\":{\"params\":{\"account\":\"Address to query\"},\"returns\":{\"_0\":\"The debt of the account in internal precision\"}},\"decimals()\":{\"returns\":{\"_0\":\"The decimals of the eToken\"}},\"deposit(uint256,address)\":{\"details\":\"Deposit will round down the amount of assets that are converted to shares. To prevent losses consider using mint instead.\",\"params\":{\"amount\":\"Amount of assets to deposit (use max uint256 for full underlying token balance)\",\"receiver\":\"An account to receive the shares\"},\"returns\":{\"_0\":\"Amount of shares minted\"}},\"disableBalanceForwarder()\":{\"details\":\"Only the authenticated account can disable balance forwarding for itselfShould call the IBalanceTracker hook with the account's balance of 0\"},\"enableBalanceForwarder()\":{\"details\":\"Only the authenticated account can enable balance forwarding for itselfShould call the IBalanceTracker hook with the current account's balance\"},\"feeReceiver()\":{\"returns\":{\"_0\":\"The fee receiver address\"}},\"flashLoan(uint256,bytes)\":{\"params\":{\"amount\":\"In asset units\",\"data\":\"Passed through to the onFlashLoan() callback, so contracts don't need to store transient data in storage\"}},\"governorAdmin()\":{\"returns\":{\"_0\":\"The governor address\"}},\"hookConfig()\":{\"returns\":{\"_0\":\"Address of the hook target contract\",\"_1\":\"Bitmask with operations that should call the hooks. See Constants.sol for a list of operations\"}},\"initialize(address)\":{\"params\":{\"proxyCreator\":\"Account which created the proxy or should be the initial governor\"}},\"interestAccumulator()\":{\"returns\":{\"_0\":\"An opaque accumulator that increases as interest is accrued\"}},\"interestFee()\":{\"returns\":{\"_0\":\"Amount of interest that is redirected as a fee, as a fraction scaled by 1e4\"}},\"interestRate()\":{\"returns\":{\"_0\":\"The interest rate in yield-per-second, scaled by 10**27\"}},\"interestRateModel()\":{\"returns\":{\"_0\":\"Address of the interest rate contract or address zero to indicate 0% interest\"}},\"liquidate(address,address,uint256,uint256)\":{\"details\":\"If `repayAssets` is set to max uint256 it is assumed the caller will perform their own slippage checks to make sure they are not taking on too much debt. This option is mainly meant for smart contract liquidators\",\"params\":{\"collateral\":\"Collateral which is to be seized\",\"minYieldBalance\":\"The minimum acceptable amount of collateral to be transferred from violator to sender, in collateral balance units (shares for vaults). Meant as slippage check together with `repayAssets`\",\"repayAssets\":\"The amount of underlying debt to be transferred from violator to sender, in asset units (use max uint256 to repay the maximum possible amount). Meant as slippage check together with `minYieldBalance`\",\"violator\":\"Address that may be in collateral violation\"}},\"liquidationCoolOffTime()\":{\"returns\":{\"_0\":\"The liquidation cool off time in seconds\"}},\"maxDeposit(address)\":{\"params\":{\"account\":\"Address to query\"},\"returns\":{\"_0\":\"The max amount of assets the account can deposit\"}},\"maxLiquidationDiscount()\":{\"details\":\"The default value, which is zero, is deliberately bad, as it means there would be no incentive to liquidate unhealthy users. The vault creator must take care to properly select the limit, given the underlying and collaterals used.\",\"returns\":{\"_0\":\"The maximum liquidation discount in 1e4 scale\"}},\"maxMint(address)\":{\"params\":{\"account\":\"Address to query\"},\"returns\":{\"_0\":\"The max amount of shares the account can mint\"}},\"maxRedeem(address)\":{\"params\":{\"owner\":\"Account holding the shares\"},\"returns\":{\"_0\":\"The maximum amount of shares the owner is allowed to redeem\"}},\"maxWithdraw(address)\":{\"params\":{\"owner\":\"Account holding the shares\"},\"returns\":{\"_0\":\"The maximum amount of assets the owner is allowed to withdraw\"}},\"mint(uint256,address)\":{\"params\":{\"amount\":\"Amount of shares to be minted\",\"receiver\":\"An account to receive the shares\"},\"returns\":{\"_0\":\"Amount of assets deposited\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the eToken\"}},\"oracle()\":{\"returns\":{\"_0\":\"The address of the oracle\"}},\"permit2Address()\":{\"returns\":{\"_0\":\"The address of the Permit2 contract\"}},\"previewDeposit(uint256)\":{\"params\":{\"assets\":\"Amount of assets deposited\"},\"returns\":{\"_0\":\"Amount of shares received\"}},\"previewMint(uint256)\":{\"params\":{\"shares\":\"Amount of shares to be minted\"},\"returns\":{\"_0\":\"Required amount of assets\"}},\"previewRedeem(uint256)\":{\"params\":{\"shares\":\"Amount of shares redeemed\"},\"returns\":{\"_0\":\"Amount of assets transferred\"}},\"previewWithdraw(uint256)\":{\"params\":{\"assets\":\"Amount of assets withdrawn\"},\"returns\":{\"_0\":\"Amount of shares burned\"}},\"protocolConfigAddress()\":{\"returns\":{\"_0\":\"The protocol config address\"}},\"protocolFeeShare()\":{\"returns\":{\"_0\":\"A percentage share of fees accrued belonging to the protocol, in 1e4 scale\"}},\"pullDebt(uint256,address)\":{\"details\":\"Due to internal debt precision accounting, the liability reported on either or both accounts after calling `pullDebt` may not match the `amount` requested precisely\",\"params\":{\"amount\":\"Amount of debt in asset units (use max uint256 for all the account's debt)\",\"from\":\"Account to pull the debt from\"}},\"redeem(uint256,address,address)\":{\"params\":{\"amount\":\"Amount of shares to burn (use max uint256 to burn full owner balance)\",\"owner\":\"Account holding the shares to burn.\",\"receiver\":\"Account to receive the withdrawn assets\"},\"returns\":{\"_0\":\"Amount of assets transferred\"}},\"repay(uint256,address)\":{\"params\":{\"amount\":\"Amount of debt to repay in assets (use max uint256 for full debt)\",\"receiver\":\"Account holding the debt to be repaid\"},\"returns\":{\"_0\":\"Amount of assets repaid\"}},\"repayWithShares(uint256,address)\":{\"details\":\"Equivalent to withdrawing and repaying, but no assets are needed to be present in the vaultContrary to a regular `repay`, if account is unhealthy, the repay amount must bring the account back to health, or the operation will revert during account status check\",\"params\":{\"amount\":\"In asset units (use max uint256 to repay the debt in full or up to the available deposit)\",\"receiver\":\"Account to remove debt from by burning sender's shares\"},\"returns\":{\"debt\":\"Amount of debt removed in assets\",\"shares\":\"Amount of shares burned\"}},\"setCaps(uint16,uint16)\":{\"params\":{\"borrowCap\":\"The new borrow cap in AmountCap fromat\",\"supplyCap\":\"The new supply cap in AmountCap fromat\"}},\"setConfigFlags(uint32)\":{\"params\":{\"newConfigFlags\":\"Bitmask with the new config flags\"}},\"setFeeReceiver(address)\":{\"params\":{\"newFeeReceiver\":\"The new fee receiver address\"}},\"setGovernorAdmin(address)\":{\"details\":\"Set to zero address to renounce privileges and make the vault non-governed\",\"params\":{\"newGovernorAdmin\":\"The new governor address\"}},\"setHookConfig(address,uint32)\":{\"details\":\"All operations are initially disabled in a newly created vault. The vault creator must set their own configuration to make the vault usable\",\"params\":{\"newHookTarget\":\"The new hook target address. Use address(0) to simply disable hooked operations\",\"newHookedOps\":\"Bitmask with the new hooked operations\"}},\"setInterestRateModel(address)\":{\"details\":\"If the new model reverts, perhaps due to governor error, the vault will silently use a zero interest rate. Governor should make sure the new interest rates are computed as expected.\",\"params\":{\"newModel\":\"The new IRM address\"}},\"setLTV(address,uint16,uint16,uint32)\":{\"details\":\"When the collateral asset is no longer deemed suitable to sustain debt, its LTV setting can be set to 0. Setting a zero liquidation LTV also enforces a zero borrowing LTV (`newBorrowLTV <= newLiquidationLTV`). In such cases, the collateral becomes immediately ineffective for new borrows. However, for liquidation purposes, the LTV can be ramped down over a period of time (`rampDuration`). This ramping helps users avoid hard liquidations with maximum discounts and gives them a chance to close their positions in an orderly fashion. The choice of `rampDuration` depends on market conditions assessed by the governor. They may decide to forgo the ramp entirely by setting the duration to zero, presumably in light of extreme market conditions, where ramping would pose a threat to the vault's solvency. In any case, when the liquidation LTV reaches its target of 0, this asset will no longer support the debt, but it will still be possible to liquidate it at a discount and use the proceeds to repay an unhealthy loan. Setting the LTV to zero will not be sufficient if the collateral is found to be unsafe to call liquidation on, either due to a bug or a code upgrade that allows its transfer function to make arbitrary external calls. In such cases, pausing the vault and conducting an orderly wind-down is recommended.\",\"params\":{\"borrowLTV\":\"New borrow LTV, for assessing account's health during account status checks, in 1e4 scale\",\"collateral\":\"Address of collateral to set LTV for\",\"liquidationLTV\":\"New liquidation LTV after ramp ends in 1e4 scale\",\"rampDuration\":\"Ramp duration in seconds\"}},\"setLiquidationCoolOffTime(uint16)\":{\"details\":\"Setting cool off time to zero allows liquidating the account in the same block as the last successful account status check\",\"params\":{\"newCoolOffTime\":\"The new liquidation cool off time in seconds\"}},\"setMaxLiquidationDiscount(uint16)\":{\"details\":\"If the discount is zero (the default), the liquidators will not be incentivized to liquidate unhealthy accounts\",\"params\":{\"newDiscount\":\"New maximum liquidation discount in 1e4 scale\"}},\"skim(uint256,address)\":{\"details\":\"Could be used as an alternative deposit flow in certain scenarios. E.g. swap directly to the vault, call `skim` to claim deposit.\",\"params\":{\"amount\":\"Amount of assets to claim (use max uint256 to claim all available assets)\",\"receiver\":\"An account to receive the shares\"},\"returns\":{\"_0\":\"Amount of shares minted\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the eToken\"}},\"totalAssets()\":{\"returns\":{\"_0\":\"The total amount of assets\"}},\"totalBorrows()\":{\"returns\":{\"_0\":\"The total borrows in asset units\"}},\"totalBorrowsExact()\":{\"returns\":{\"_0\":\"The total borrows in internal debt precision\"}},\"totalSupply()\":{\"returns\":{\"_0\":\"The total supply of the eToken\"}},\"transfer(address,uint256)\":{\"params\":{\"amount\":\"In shares.\",\"to\":\"Recipient account\"},\"returns\":{\"_0\":\"True if transfer succeeded\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"amount\":\"In shares\",\"from\":\"This address must've approved the to address\",\"to\":\"Recipient account\"},\"returns\":{\"_0\":\"True if transfer succeeded\"}},\"transferFromMax(address,address)\":{\"params\":{\"from\":\"This address must've approved the to address\",\"to\":\"Recipient account\"},\"returns\":{\"_0\":\"True if transfer succeeded\"}},\"unitOfAccount()\":{\"returns\":{\"_0\":\"The address of the reference asset\"}},\"withdraw(uint256,address,address)\":{\"params\":{\"amount\":\"Amount of assets to withdraw\",\"owner\":\"Account holding the shares to burn\",\"receiver\":\"Account to receive the withdrawn assets\"},\"returns\":{\"_0\":\"Amount of shares burned\"}}},\"title\":\"EVault\",\"version\":1},\"userdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"notice\":\"Set an ERC20 approval\"},\"BalanceForwarderStatus(address,bool)\":{\"notice\":\"Enable or disable balance tracking for the account\"},\"Borrow(address,uint256)\":{\"notice\":\"Increase account's debt\"},\"ConvertFees(address,address,address,uint256,uint256)\":{\"notice\":\"Split the accumulated fees between the governor and the protocol\"},\"DebtSocialized(address,uint256)\":{\"notice\":\"Socialize debt after liquidating all of the unhealthy account's collateral\"},\"Deposit(address,address,uint256,uint256)\":{\"notice\":\"Deposit assets into an ERC4626 vault\"},\"EVaultCreated(address,address,address)\":{\"notice\":\"New EVault is initialized\"},\"GovSetCaps(uint16,uint16)\":{\"notice\":\"Set new caps\"},\"GovSetConfigFlags(uint32)\":{\"notice\":\"Set new configuration flags\"},\"GovSetFeeReceiver(address)\":{\"notice\":\"Set a fee receiver address\"},\"GovSetGovernorAdmin(address)\":{\"notice\":\"Set a governor address for the EVault\"},\"GovSetHookConfig(address,uint32)\":{\"notice\":\"Set new hooks configuration\"},\"GovSetInterestFee(uint16)\":{\"notice\":\"Set new interest fee\"},\"GovSetInterestRateModel(address)\":{\"notice\":\"Set an interest rate model contract address\"},\"GovSetLTV(address,uint16,uint16,uint16,uint48,uint32)\":{\"notice\":\"Set new LTV configuration for a collateral\"},\"GovSetLiquidationCoolOffTime(uint16)\":{\"notice\":\"Set a new liquidation cool off time, which must elapse after successful account status check, before account can be liquidated\"},\"GovSetMaxLiquidationDiscount(uint16)\":{\"notice\":\"Set a maximum liquidation discount\"},\"InterestAccrued(address,uint256)\":{\"notice\":\"Account's debt was increased due to interest\"},\"Liquidate(address,address,address,uint256,uint256)\":{\"notice\":\"Liquidate unhealthy account\"},\"PullDebt(address,address,uint256)\":{\"notice\":\"Take on debt from another account\"},\"Repay(address,uint256)\":{\"notice\":\"Decrease account's debt\"},\"Transfer(address,address,uint256)\":{\"notice\":\"Transfer an ERC20 token balance\"},\"VaultStatus(uint256,uint256,uint256,uint256,uint256,uint256,uint256)\":{\"notice\":\"Log the current vault status\"},\"Withdraw(address,address,address,uint256,uint256)\":{\"notice\":\"Withdraw from an ERC4626 vault\"}},\"kind\":\"user\",\"methods\":{\"EVC()\":{\"notice\":\"Address of EthereumVaultConnector contract\"},\"LTVBorrow(address)\":{\"notice\":\"Retrieves the borrow LTV of the collateral, which is used to determine if the account is healthy during account status checks.\"},\"LTVFull(address)\":{\"notice\":\"Retrieves LTV configuration for the collateral\"},\"LTVLiquidation(address)\":{\"notice\":\"Retrieves the current liquidation LTV, which is used to determine if the account is eligible for liquidation\"},\"LTVList()\":{\"notice\":\"Retrieves a list of collaterals with configured LTVs\"},\"MODULE_BALANCE_FORWARDER()\":{\"notice\":\"Address of the BalanceForwarder module\"},\"MODULE_BORROWING()\":{\"notice\":\"Address of the Borrowing module\"},\"MODULE_GOVERNANCE()\":{\"notice\":\"Address of the Governance module\"},\"MODULE_INITIALIZE()\":{\"notice\":\"Address of the Initialize module\"},\"MODULE_LIQUIDATION()\":{\"notice\":\"Address of the Liquidation module\"},\"MODULE_RISKMANAGER()\":{\"notice\":\"Address of the RiskManager module\"},\"MODULE_TOKEN()\":{\"notice\":\"Address of the Token module\"},\"MODULE_VAULT()\":{\"notice\":\"Address of the Vault module\"},\"accountLiquidity(address,bool)\":{\"notice\":\"Retrieve account's total liquidity\"},\"accountLiquidityFull(address,bool)\":{\"notice\":\"Retrieve account's liquidity per collateral\"},\"accumulatedFees()\":{\"notice\":\"Balance of the fees accumulator, in shares\"},\"accumulatedFeesAssets()\":{\"notice\":\"Balance of the fees accumulator, in underlying units\"},\"allowance(address,address)\":{\"notice\":\"Retrieve the current allowance\"},\"approve(address,uint256)\":{\"notice\":\"Allow spender to access an amount of your eTokens\"},\"asset()\":{\"notice\":\"Vault's underlying asset\"},\"balanceForwarderEnabled(address)\":{\"notice\":\"Retrieves boolean indicating if the account opted in to forward balance changes to the rewards contract\"},\"balanceOf(address)\":{\"notice\":\"Balance of a particular account, in eTokens\"},\"balanceTrackerAddress()\":{\"notice\":\"Retrieve the address of rewards contract, tracking changes in account's balances\"},\"borrow(uint256,address)\":{\"notice\":\"Transfer underlying tokens from the vault to the sender, and increase sender's debt\"},\"caps()\":{\"notice\":\"Retrieves supply and borrow caps in AmountCap format\"},\"cash()\":{\"notice\":\"Balance of vault assets as tracked by deposits/withdrawals and borrows/repays\"},\"checkAccountStatus(address,address[])\":{\"notice\":\"Checks the status of an account and reverts if account is not healthy\"},\"checkLiquidation(address,address,address)\":{\"notice\":\"Checks to see if a liquidation would be profitable, without actually doing anything\"},\"checkVaultStatus()\":{\"notice\":\"Checks the status of the vault and reverts if caps are exceeded\"},\"configFlags()\":{\"notice\":\"Retrieves a bitmask indicating enabled config flags\"},\"convertFees()\":{\"notice\":\"Splits accrued fees balance according to protocol fee share and transfers shares to the governor fee receiver and protocol fee receiver\"},\"convertToAssets(uint256)\":{\"notice\":\"Calculate amount of assets corresponding to the requested shares amount\"},\"convertToShares(uint256)\":{\"notice\":\"Calculate amount of shares corresponding to the requested assets amount\"},\"creator()\":{\"notice\":\"Address of the original vault creator\"},\"dToken()\":{\"notice\":\"Returns an address of the sidecar DToken\"},\"debtOf(address)\":{\"notice\":\"Debt owed by a particular account, in underlying units\"},\"debtOfExact(address)\":{\"notice\":\"Debt owed by a particular account, in underlying units scaled up by shifting INTERNAL_DEBT_PRECISION_SHIFT bits\"},\"decimals()\":{\"notice\":\"Decimals, the same as the asset's or 18 if the asset doesn't implement `decimals()`\"},\"deposit(uint256,address)\":{\"notice\":\"Transfer requested amount of underlying tokens from sender to the vault pool in return for shares\"},\"disableBalanceForwarder()\":{\"notice\":\"Disables balance forwarding for the authenticated account\"},\"disableController()\":{\"notice\":\"Release control of the account on EVC if no outstanding debt is present\"},\"enableBalanceForwarder()\":{\"notice\":\"Enables balance forwarding for the authenticated account\"},\"feeReceiver()\":{\"notice\":\"Retrieves address of the governance fee receiver\"},\"flashLoan(uint256,bytes)\":{\"notice\":\"Request a flash-loan. A onFlashLoan() callback in msg.sender will be invoked, which must repay the loan to the main Euler address prior to returning.\"},\"governorAdmin()\":{\"notice\":\"Retrieves the address of the governor\"},\"hookConfig()\":{\"notice\":\"Retrieves a hook target and a bitmask indicating which operations call the hook target\"},\"initialize(address)\":{\"notice\":\"Initialization of the newly deployed proxy contract\"},\"interestAccumulator()\":{\"notice\":\"Retrieves the current interest rate accumulator for an asset\"},\"interestFee()\":{\"notice\":\"Retrieves the interest fee in effect for the vault\"},\"interestRate()\":{\"notice\":\"Retrieves the current interest rate for an asset\"},\"interestRateModel()\":{\"notice\":\"Looks up an asset's currently configured interest rate model\"},\"liquidate(address,address,uint256,uint256)\":{\"notice\":\"Attempts to perform a liquidation\"},\"liquidationCoolOffTime()\":{\"notice\":\"Retrieves liquidation cool-off time, which must elapse after successful account status check before account can be liquidated\"},\"maxDeposit(address)\":{\"notice\":\"Fetch the maximum amount of assets a user can deposit\"},\"maxLiquidationDiscount()\":{\"notice\":\"Retrieves the maximum liquidation discount\"},\"maxMint(address)\":{\"notice\":\"Fetch the maximum amount of shares a user can mint\"},\"maxRedeem(address)\":{\"notice\":\"Fetch the maximum amount of shares a user is allowed to redeem for assets\"},\"maxWithdraw(address)\":{\"notice\":\"Fetch the maximum amount of assets a user is allowed to withdraw\"},\"mint(uint256,address)\":{\"notice\":\"Transfer underlying tokens from sender to the vault pool in return for requested amount of shares\"},\"name()\":{\"notice\":\"Vault share token (eToken) name, ie \\\"Euler Vault: DAI\\\"\"},\"oracle()\":{\"notice\":\"Retrieves the address of the oracle contract\"},\"permit2Address()\":{\"notice\":\"Retrieves the Permit2 contract address\"},\"previewDeposit(uint256)\":{\"notice\":\"Calculate an amount of shares that would be created by depositing assets\"},\"previewMint(uint256)\":{\"notice\":\"Calculate an amount of assets that would be required to mint requested amount of shares\"},\"previewRedeem(uint256)\":{\"notice\":\"Calculate the amount of assets that will be transferred when redeeming requested amount of shares\"},\"previewWithdraw(uint256)\":{\"notice\":\"Calculate the amount of shares that will be burned when withdrawing requested amount of assets\"},\"protocolConfigAddress()\":{\"notice\":\"Retrieves the ProtocolConfig address\"},\"protocolFeeReceiver()\":{\"notice\":\"Retrieves the address which will receive protocol's feesThe protocol fee receiver address\"},\"protocolFeeShare()\":{\"notice\":\"Retrieves the protocol fee share\"},\"pullDebt(uint256,address)\":{\"notice\":\"Take over debt from another account\"},\"redeem(uint256,address,address)\":{\"notice\":\"Burn requested shares and transfer corresponding underlying tokens from the vault to the receiver\"},\"repay(uint256,address)\":{\"notice\":\"Transfer underlying tokens from the sender to the vault, and decrease receiver's debt\"},\"repayWithShares(uint256,address)\":{\"notice\":\"Pay off liability with shares (\\\"self-repay\\\")\"},\"setCaps(uint16,uint16)\":{\"notice\":\"Set new supply and borrow caps in AmountCap format\"},\"setConfigFlags(uint32)\":{\"notice\":\"Set new bitmap indicating which config flags should be enabled. Flags are defined in Constants.sol\"},\"setFeeReceiver(address)\":{\"notice\":\"Set a new governor fee receiver address\"},\"setGovernorAdmin(address)\":{\"notice\":\"Set a new governor address\"},\"setHookConfig(address,uint32)\":{\"notice\":\"Set a new hook target and a new bitmap indicating which operations should call the hook target. Operations are defined in Constants.sol.\"},\"setInterestRateModel(address)\":{\"notice\":\"Set a new interest rate model contract\"},\"setLTV(address,uint16,uint16,uint32)\":{\"notice\":\"Set a new LTV config\"},\"setLiquidationCoolOffTime(uint16)\":{\"notice\":\"Set a new liquidation cool off time, which must elapse after successful account status check before account can be liquidated\"},\"setMaxLiquidationDiscount(uint16)\":{\"notice\":\"Set a new maximum liquidation discount\"},\"skim(uint256,address)\":{\"notice\":\"Creates shares for the receiver, from excess asset balances of the vault (not accounted for in `cash`)\"},\"symbol()\":{\"notice\":\"Vault share token (eToken) symbol, ie \\\"eDAI\\\"\"},\"totalAssets()\":{\"notice\":\"Total amount of managed assets, cash and borrows\"},\"totalBorrows()\":{\"notice\":\"Sum of all outstanding debts, in underlying units (increases as interest is accrued)\"},\"totalBorrowsExact()\":{\"notice\":\"Sum of all outstanding debts, in underlying units scaled up by shifting INTERNAL_DEBT_PRECISION_SHIFT bits\"},\"totalSupply()\":{\"notice\":\"Sum of all eToken balances\"},\"touch()\":{\"notice\":\"Updates interest accumulator and totalBorrows, credits reserves, re-targets interest rate, and logs vault status\"},\"transfer(address,uint256)\":{\"notice\":\"Transfer eTokens to another address\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfer eTokens from one address to another\"},\"transferFromMax(address,address)\":{\"notice\":\"Transfer the full eToken balance of an address to another\"},\"unitOfAccount()\":{\"notice\":\"Retrieves a reference asset used for liquidity calculations\"},\"withdraw(uint256,address,address)\":{\"notice\":\"Transfer requested amount of underlying tokens from the vault and decrease account's shares balance\"}},\"notice\":\"This contract implements an EVC enabled lending vault\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/euler-vault-kit/src/EVault/EVault.sol\":\"EVault\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/\",\":@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/\",\":@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/\",\":@solady/=lib/euler-price-oracle/lib/solady/src/\",\":@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/\",\":@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/\",\":axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/\",\":axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":ethereum-vault-connector/=lib/ethereum-vault-connector/src/\",\":euler-price-oracle-test/=lib/euler-price-oracle/test/\",\":euler-price-oracle/=lib/euler-price-oracle/src/\",\":euler-vault-kit/=lib/euler-vault-kit/src/\",\":evc/=lib/ethereum-vault-connector/src/\",\":evk-test/=lib/euler-vault-kit/test/\",\":evk/=lib/euler-vault-kit/src/\",\":fee-flow/=lib/fee-flow/src/\",\":forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/\",\":permit2/=lib/euler-vault-kit/lib/permit2/\",\":pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":redstone-oracles-monorepo/=lib/euler-price-oracle/lib/\",\":reward-streams/=lib/reward-streams/src/\",\":solady/=lib/euler-price-oracle/lib/solady/src/\",\":solmate/=lib/fee-flow/lib/solmate/src/\",\":v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/\",\":v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/\"]},\"sources\":{\"lib/ethereum-vault-connector/src/interfaces/IEthereumVaultConnector.sol\":{\"keccak256\":\"0x2d7b4cf0a3346feada4b7bc2c661c89fa60a485f498f374078a934cd4ece7c7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e8c832fdc952913ffeec92cdbf06266b427c66d87ad1b5d027c73b22fc4fc82d\",\"dweb:/ipfs/QmPEcrWAR85tMKBFQDnTZxgXPVENRU2B6MBgzgRBhbV8oP\"]},\"lib/ethereum-vault-connector/src/interfaces/IVault.sol\":{\"keccak256\":\"0xb04fe66deccf8baa3e5c850f2ecf32e948393d7a42e78b59b037141b205edf42\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://11acaad66e9a42deec1f9328abe9f2662bfb109568baa20a79317ae707b94016\",\"dweb:/ipfs/QmQbAtvrk9cqXJJZgMRjdxrMDXiZPz37m6PGZYEpbtN8to\"]},\"lib/euler-vault-kit/src/EVault/DToken.sol\":{\"keccak256\":\"0xede53299e72a2138a06e0aba6c5b76fcef959832a24b5b4a231bf54cc533f733\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0ffcfb7d6f89e725f7e4770c5ce16569461523371d5a55914336b45d17558798\",\"dweb:/ipfs/QmVEhjgxCsVoQAMKEMSmBR8XAM9ZwyS13TmtwbEpJ3Byj5\"]},\"lib/euler-vault-kit/src/EVault/Dispatch.sol\":{\"keccak256\":\"0xa42cec3ad6bdf05da5ea964453346b1302495fb77c404fb4961b978da511589d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2c6059c4617e6b6f0fa41283a262afbd63b7594cb89dd915287e4bb305ab8055\",\"dweb:/ipfs/QmXe9qv2T9YavhdzNGDWGxtHw9z7WuxQQ1r5nWpJiyfted\"]},\"lib/euler-vault-kit/src/EVault/EVault.sol\":{\"keccak256\":\"0xb25edcceef5970d97bafec4b34a6f99a473c505ed5cf554d99aab4b7010eef70\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://72b6455cb8d21d93f0fc68395f0e62e3de4781780c833c43634d9f8249d17cee\",\"dweb:/ipfs/QmPHmkAdotKrF6vyYMVk7ndp2k9W1XJZUSDRKC89PZVzvv\"]},\"lib/euler-vault-kit/src/EVault/IEVault.sol\":{\"keccak256\":\"0x1e41f0fe57683c65b27afa6b725ee2c68128b540f682bba93e2dc135522ac6b3\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://86bb1872eb9073214b853663fb136157bea709bbcf626bb0a2bb2748a43f941d\",\"dweb:/ipfs/QmSWQPjHBBahLM3AsoVjHHYEBiBj8WbkQqCQLPNUJVMX1k\"]},\"lib/euler-vault-kit/src/EVault/modules/BalanceForwarder.sol\":{\"keccak256\":\"0xcd38158478dcb61780326cc5d67f27487adaed08a0a1922e7f0e6ab4e67e656b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c435261c091ccd7820ebb0433d0730d0845b41033ef57db61e0d16e3ee31f7c7\",\"dweb:/ipfs/Qmea7sYiZetjmDN99frFLLnXWjMuezGy2XyNcEzrBJ5E5q\"]},\"lib/euler-vault-kit/src/EVault/modules/Borrowing.sol\":{\"keccak256\":\"0x11d69bc8fe31d7eff3fca3c12ad458560e4ec845431ec1f1a777306cae316563\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b93d0a4e5c198970361e1da84b6f53672863f79590a1f1f8714abf3d0d04eecb\",\"dweb:/ipfs/QmQ9CySqmJpLd5CTMwqh7n4dqzS5YX9Tx78xdhwEC1zazK\"]},\"lib/euler-vault-kit/src/EVault/modules/Governance.sol\":{\"keccak256\":\"0xcdee32c086bf55fac9c0cba6a80da1de650b316eb617f5e244f4810738b324ef\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://6bd98e36ef599ddbfa32c1822a7ce79eaf35bc5d351bc36243bae21aac63b930\",\"dweb:/ipfs/Qmf2uGhQehDQCZCbPueyw6P3xLzFioGfsks5VWjbAYW1Az\"]},\"lib/euler-vault-kit/src/EVault/modules/Initialize.sol\":{\"keccak256\":\"0x465cd6c9a4107bbe0bcc3f7caec84eef824f2978b7abc2b3cb123f7a52042970\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://fb431ec2765e55385444c0f4d8e22b02136ce9aa10bb482306d0a0f0fc42cdb8\",\"dweb:/ipfs/QmSPDWkQXPTia6XisJwiQqV3V9FzzNT8NMVjEm2HYt62iM\"]},\"lib/euler-vault-kit/src/EVault/modules/Liquidation.sol\":{\"keccak256\":\"0xde4b76d0b5e191eeb1f8e5951cafc632e8159e9dcf07e72de523fe7ad94a003e\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://e99cda652a739ce70d067681c4f167c05d5679e6152208e09786270b5ed3904b\",\"dweb:/ipfs/QmXcfhDU1hhnLNjEvrz4ZBx33G2jage6JDf1yNbsUeXe52\"]},\"lib/euler-vault-kit/src/EVault/modules/RiskManager.sol\":{\"keccak256\":\"0x4b244e29a33546c1ec96ece0772b4df6082574a588ac7d688f180df129a28e1f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://2f471f3cc323809bd8dde9e5b7e6ab3fd73fd0dab1c51e6cab6b1e6840ec98b9\",\"dweb:/ipfs/QmZsttEuAvqUf3GN6UYEpyYrqm5c6jofL3HddJMyAuueU1\"]},\"lib/euler-vault-kit/src/EVault/modules/Token.sol\":{\"keccak256\":\"0x3f2176bada53b1b1ff79453bfdddeed023a3de7679c5550eb4373b7752292459\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ecde60cff6a858bd20286e8f8c6b62af96ac907151cf73111e001dea37ca0771\",\"dweb:/ipfs/QmQ3MVMmdFbHsdPDmEpXQBDzEPBvTQP57YwPn4oyYjR97r\"]},\"lib/euler-vault-kit/src/EVault/modules/Vault.sol\":{\"keccak256\":\"0x33da510c95866ddef92c9092a4fd5acfcf58baf4b53704dfb33718f7d67a0312\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1275bf9ca9ee870ed1d2ad2fc4e85ffd8daa728a1edd550b696db36ff56474fb\",\"dweb:/ipfs/QmXY9ZThsM1GUPX81thvPYxU3WiCuR2VMyhtL2RfVGXpoF\"]},\"lib/euler-vault-kit/src/EVault/shared/AssetTransfers.sol\":{\"keccak256\":\"0x67502822f02eb0964790d94fcf2c31e28faa6366a83b21fd3ebe121bbb96f971\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://16952aede414f5f3b2f9584927e6f1c77c0b7f072520ab074223767bcddd3e5f\",\"dweb:/ipfs/QmT8AUxozPTrAh6BCZf9pwSZqy1eu3SnWmwDdd72uMsTND\"]},\"lib/euler-vault-kit/src/EVault/shared/BalanceUtils.sol\":{\"keccak256\":\"0x1a76b6178b6d2e8db9b757ac1aeddda6ecd8552721b400d1383148f2ea63355b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c10be81a47ab3ce8a9b2f6e02625c146dc63218e1bf5c90b6b111f118c1b010e\",\"dweb:/ipfs/QmSwd1VGo4jiaWGBR9FTg45DoUN6biwV8Q2MDjmitA1T9q\"]},\"lib/euler-vault-kit/src/EVault/shared/Base.sol\":{\"keccak256\":\"0xf49eebd148a79afc5834f48e6c6388b017b763d4fa79b14e796072127ee39e3a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2385807b5b508ef506c1756bd595087fbc3764d5930fc27e191ff712c2465cf1\",\"dweb:/ipfs/QmcnbDCwqdwy75df6RLoeAK8tu6YFSFCMxrVjFsoSn5VKx\"]},\"lib/euler-vault-kit/src/EVault/shared/BorrowUtils.sol\":{\"keccak256\":\"0xecb340bc803ef6736f071da286b2390ccc4cc2e515519d524ef61786f9c5ec4a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://85d605a34fce37fed8094d4ec555ea5e745714fe2d3ab1711a09cb24bde474a7\",\"dweb:/ipfs/QmfBFGSvCq7FuTm7cHBZdeRbnvi43ysT9JLbAqMXCeLuuj\"]},\"lib/euler-vault-kit/src/EVault/shared/Cache.sol\":{\"keccak256\":\"0x45da1d4bb59b42c8cefa3c9a754ad98c192433a378d5d885b711bb86fad46d1f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://60661c395ba77473243c88b1c207639f25c1960a2b9a02aec59b24790ddd73d3\",\"dweb:/ipfs/QmaV3AQ9paVij1zj96WFv3ZJLLKYAfxLXVbSKky8kU1MsV\"]},\"lib/euler-vault-kit/src/EVault/shared/Constants.sol\":{\"keccak256\":\"0x2ebe53774841efddede73dedd186db34e4e25ee0eaf501eefb84e050d92302c3\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6e1744f0a718796c8c0bd59e83a8f3da940f34793ef3369b9e4a042a24015957\",\"dweb:/ipfs/QmYrR2K3CVGhPQqF8JKy48vMBkaQMZccgxiCcs5CTkRmH3\"]},\"lib/euler-vault-kit/src/EVault/shared/EVCClient.sol\":{\"keccak256\":\"0xb18450832c0b5f823cab92079a3c9de277a961b168a9780fcc640b1bc44df777\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b0a03b9e3bfe730d358881ea10c652cbfec5385e62fb0b1e304266a6c60a3f3f\",\"dweb:/ipfs/QmcABReCmZ4NSv3GxdSVidRDGPLaTcp16Ut7cyj6nzJdsN\"]},\"lib/euler-vault-kit/src/EVault/shared/Errors.sol\":{\"keccak256\":\"0x602f18548a2cb917337095faab9afd839e36e2cd0f3710013d0a2499082d85a0\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://58682c0712a0e2da378aee586edcedcf73e2f05fe255bb6b9867e30695292502\",\"dweb:/ipfs/QmX8ytBHPnwiTdTxK26uSxwEPKpTH8BvLie8n956pP4JTv\"]},\"lib/euler-vault-kit/src/EVault/shared/Events.sol\":{\"keccak256\":\"0xe9231f76167eac66a84ead5b01cac576e14e7467324549d388abaca78dc4129f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://cc5b9a0bbed87dccac4fb0b3a905a20340eeb85417f20117d0ba5ef6d249ac31\",\"dweb:/ipfs/QmU9G1HdmjnFDJmGTDo5pUuyMkLRLrCbkxtXTXovRp9viM\"]},\"lib/euler-vault-kit/src/EVault/shared/LTVUtils.sol\":{\"keccak256\":\"0x6b65fe6aaa09fa6854500d15b5ae7dd198a3ed5b4c99c946663e6bbe62d698b1\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://f3d59b410880ecbee00941c36229b6798491cb8b38c1833f5d33cb52d903c3a8\",\"dweb:/ipfs/QmfFi9q11sMsbrVMxUoTetfH3vddiKb4qY3LdyjSnDJKat\"]},\"lib/euler-vault-kit/src/EVault/shared/LiquidityUtils.sol\":{\"keccak256\":\"0x5bd8c92995ce568ccbf46f0143474315b473787b4d683cc9d0e7d2d85ba2158e\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://ef10c53f32b39f30b1a938a8cb2079b7a8e7627ea45379380f7085f6f7505c0b\",\"dweb:/ipfs/QmbrfYNWpG4h2gCTBmhKNbtdyp93NxHDXGjiRaVYFs7C4V\"]},\"lib/euler-vault-kit/src/EVault/shared/Storage.sol\":{\"keccak256\":\"0x5b300bb6dd674f281bdf93283f02562bcb97be065bbf891f4b52bb6a2b63f4b6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://8b8949e0f1f77241c15159ac16c47d1a70bf1fbd050eaddfd9bfa280b0975527\",\"dweb:/ipfs/QmbEkaafzdVZeaqKMNJDPMNBJTCSpDM67MSfGR5AACfEnW\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/AddressUtils.sol\":{\"keccak256\":\"0xc4ce1ac0ad62cf32abd8b9b8165b5d61bcdceeb09dd5a8648d2ad2c451689453\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6bf478cd7e48d49157ff0396c4116e11e496ac5a71c5f37dd141718c5e6acb86\",\"dweb:/ipfs/QmeUr5r8hkoXPYDMkfqCBknJoCRxgKYT56b8vADWf4RPrP\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/ConversionHelpers.sol\":{\"keccak256\":\"0x8f271a57682c0f7d6d8e2f4af37315c270894a1aa7a8fd4268dfadb57c8274d3\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://cc39dcb068a36dd4ca82880188c46372f09d63eb6c7534dd30097e096c9630b0\",\"dweb:/ipfs/QmSMetVnvVyH9tu7b94wcqkVYjpYtwpjruVjE6ceyDDQrH\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/ProxyUtils.sol\":{\"keccak256\":\"0xd6190456c6ee3ada01c913541eb4cb8e9606bfe55d86b852579bfce6196e609b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://1d4eb7e33697789fe2ad2fa5021dd63d2e65e7b6a5d64306b120acede680ff42\",\"dweb:/ipfs/QmdEAsDDu9fNaK51pDtvu35FF2sJmt1ZvKYtszgKW6dSoU\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/RPow.sol\":{\"keccak256\":\"0xb471fd40087fc710f7a53eb3b559fa446b8cdc3f866644b0d5575995cec614c2\",\"license\":\"AGPL-3.0-or-later\",\"urls\":[\"bzz-raw://e54ae3486d6f7dcd8bc18251231836750d57e2c66e8f47836c19e2eedd9d45a8\",\"dweb:/ipfs/QmXNUPLE42A4Eiw3wrgPVWV9Qp7buvu4nzWNVdNUQ2MHGm\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/RevertBytes.sol\":{\"keccak256\":\"0xd1bbbe5f2c443deff18cde63690ea1066be5205f3a11cff0e1bba100148a5fa4\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://7a2aafc01d8d7bfbd0aef2e33ed9c1f130e95d363b923a74d81d4cf5b101f00c\",\"dweb:/ipfs/QmQthkn3w1gfkMqPW3RtCZ3tTh8AFfHXwi2VFas7pgqCJw\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/SafeERC20Lib.sol\":{\"keccak256\":\"0x42b52132b80940b636a6ffa7a34d0a2378e47ec3640fdf27cd2656c72d343bba\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://44d9e83a256143c89cf55fbd69d65058809fcd8dcc52824483c7aa89d4f677c9\",\"dweb:/ipfs/QmeBmfHVcNbVfdqgFsqSP6dvQGTcQkmbf48Kq7q9NWEAbN\"]},\"lib/euler-vault-kit/src/EVault/shared/types/AmountCap.sol\":{\"keccak256\":\"0xcca0200f2207362a8248a3a3201779aabb3e657bc51587d890e6b80a24c15e51\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://7504a76f12318bdd82610d423cb694ed1e1a8a3e7b651be235129a2db565da75\",\"dweb:/ipfs/QmczmWNBo33FH2nzsQoB6FT6xd6cRHzPBZEgAZ8Jfsf1XT\"]},\"lib/euler-vault-kit/src/EVault/shared/types/Assets.sol\":{\"keccak256\":\"0xf9010712880d194eb4e85b1d4e410131fffa0451e1553388248d404e79f55d1f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://82f5f20ac28d9fea97aacd88a78b6b3631c608b61f7881e1fb1f606738cad128\",\"dweb:/ipfs/Qmb1mmGH29dXE3AzuhVXu8gBWCYxQuFEaUzeh2qq7tN8L4\"]},\"lib/euler-vault-kit/src/EVault/shared/types/ConfigAmount.sol\":{\"keccak256\":\"0x7a324a3606c848af9b327c078f1cbfef0f10d0d1f76d74796ec0d5f5b1ef8e50\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e34d3cc285174d219676fbe00c3257ea75bd3f9d41408347d78ef8df9ccffa64\",\"dweb:/ipfs/QmVmrhrtMyDtxAvTKfiZzzUqkPEuPR37nksKNMKuLukjwM\"]},\"lib/euler-vault-kit/src/EVault/shared/types/Flags.sol\":{\"keccak256\":\"0x5be65a9c99bc059baaf0ed4bc5849a108423878d7f0dbb4c92b20ff0e32c55ae\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b1dab07de7c66d82b305bd0139da383923ba97df28ea3b3d6b78974a4b43d376\",\"dweb:/ipfs/QmdzHixVQbrDDhj3CHFKRAVcWtuHQNMCxxV6wHPDhNpiTG\"]},\"lib/euler-vault-kit/src/EVault/shared/types/LTVConfig.sol\":{\"keccak256\":\"0x6b982c951201f6cfd5372dcc3fdfcd69e8350d4f072470e712949609603603e3\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e5303e17a31862ca8a309e5e13337c525f854af3ecdbea3e540faa66ad711794\",\"dweb:/ipfs/QmQ2nezdfizAyjaVnLTE8rRJh7ZoeW4o9kdfAb5QV18q4B\"]},\"lib/euler-vault-kit/src/EVault/shared/types/Owed.sol\":{\"keccak256\":\"0xc4ad5946088588bf95ae9504aa27840d57ca4e425625b781132b1c5e7b41a4db\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://951df5b6b6152a4ccfdda72488132884a6c588940419011ac78f4c99eb94a63a\",\"dweb:/ipfs/QmQzCfVoC2SCh1eAwygiGo64grmCPmtyDKrcqsMCNC6vo6\"]},\"lib/euler-vault-kit/src/EVault/shared/types/Shares.sol\":{\"keccak256\":\"0xdf8079de1d68cef14f3991e306e10c44524bc4c84e603c988574893ab8017b7a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6a4ccf3e71173fbbc558ba0e3ad833863f0f480ad8d0b2e2ee090677ebb8ce1e\",\"dweb:/ipfs/QmbNcj87DnDHwqy1B7wxZnXSXjCDe4vV1xMXLiEqQT96Kc\"]},\"lib/euler-vault-kit/src/EVault/shared/types/Snapshot.sol\":{\"keccak256\":\"0x6dab8d29ea25d03e24e64c6d533d76cf27dcc6f890233950caed6b6bf70e5cf7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://553a80ec7a64e83f85a830501b2d74b529871cda53189fcec01a42b2a04871d1\",\"dweb:/ipfs/QmcLFwccG1PJ5A7bVatFBgwzvwTLTFXzkqxfPZjwWqAmSt\"]},\"lib/euler-vault-kit/src/EVault/shared/types/Types.sol\":{\"keccak256\":\"0xd72e1411c41b39a6f6e24ea97fe5eb590ec6e157ee7e5ad460181a3c915eb5b5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b63f3218ca7fa2e8f4ad251d58f36e62d2f2cea4ea6b3881d9e8b10efa06947e\",\"dweb:/ipfs/Qmac4Rh1qoAVbAUFAvKz5dyHKXTMG5gSNWKq89BUdToYd1\"]},\"lib/euler-vault-kit/src/EVault/shared/types/UserStorage.sol\":{\"keccak256\":\"0x5df5ffd48a87efe5b1caaf4d7d0c38fc620c3484031e91d1c4263064251980ef\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://3f937c133ee8fb4d2c2ba7f0d153ce219751e4db2bd53de69f0015601eeafe16\",\"dweb:/ipfs/QmTzhuxThBzfa7Q3u1pguJUBBLCUsvKjgc6MdVvRFrV7yX\"]},\"lib/euler-vault-kit/src/EVault/shared/types/VaultCache.sol\":{\"keccak256\":\"0xd0edea1589280112d224de0273a2e06f19bc1b76e170143a3214ce8a71684f90\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2a9135ba748414edb60e181a189ef7467e2ec1a44e938071f2e60a1ae61f147b\",\"dweb:/ipfs/QmRvPaYs7PAW8v1Z4WxRpDWJqMiJgRbX3n4oN1TP1JDXEx\"]},\"lib/euler-vault-kit/src/EVault/shared/types/VaultStorage.sol\":{\"keccak256\":\"0x45b9738b8e34d4e97d55b4af04e7e73aa2278206aedfeec7725e3743ccfba661\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d44342349aee41392051063be80ebc2115946610ce08330ea77dfbc2d46d9187\",\"dweb:/ipfs/QmUekMwWev6czRWjKiiybqLKJJQE9FBgwKkxkGLkpG8dYJ\"]},\"lib/euler-vault-kit/src/InterestRateModels/IIRM.sol\":{\"keccak256\":\"0x9e8636dfb4e9053e8ea935f6bc22faa72d17a61cfb0761ebcdb0ac2d9aa16214\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a82f1d12a6134a247be36817f33b826fcf74ba1ccdebc720677def1ffee2eb5b\",\"dweb:/ipfs/QmRMA1zZz1gaTFbfwBUVxsYaVd75kjrG92kqEJ2cpVXiJn\"]},\"lib/euler-vault-kit/src/ProtocolConfig/IProtocolConfig.sol\":{\"keccak256\":\"0x9c8772332de7b47cd451bca15106ca4355a12d5124bcefe8e2d12df96fe0d4b2\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://71d21806b7a7cfdaf26f15aa60b6438b47abe614329f1a23f466c5ac54e5e0e3\",\"dweb:/ipfs/QmQASzJD1MBr1uNB1katLJYbFQXALU3X6wLJvdQJbXwfLv\"]},\"lib/euler-vault-kit/src/interfaces/IBalanceTracker.sol\":{\"keccak256\":\"0xce8bd7df42d4ea27cbef3ca1b067c77e5a2f1da4ecae58ad4597c9577a254d45\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b350e342d2e80390b13b117bbca9503c90b075013e9e27130f30786426109aa0\",\"dweb:/ipfs/QmWznuHbMgDLStYpwAnzKne6yQigrPTdjp1yejY26qM6qv\"]},\"lib/euler-vault-kit/src/interfaces/IFlashLoan.sol\":{\"keccak256\":\"0x1a2ec7da850f870d7631c92befb0f027ee76764c2c45a380823b81ea4e3f3710\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d3e2b33a32ed82d35b76b3d5ea63a520faaf8c11a94f195798d6427053b81a81\",\"dweb:/ipfs/QmeL4HaB7kafAfcBXzi5zWUegp7CTqsqtxYDKUrvQVcd3Z\"]},\"lib/euler-vault-kit/src/interfaces/IHookTarget.sol\":{\"keccak256\":\"0xd8d4342fbd185e1cd14321597a2962b141d3f6f4769c25fe483c9765565dba37\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://7c686e5585fb3715857d4c64f07fea97a2ee7fa855fada3e0c62a36c62b1273c\",\"dweb:/ipfs/Qma4ecAsSraF9ofWVeZ3WMaDp7my4L7m3KLDooQWWsdTg2\"]},\"lib/euler-vault-kit/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0x8912bf9dc4aa7dab8013f1168c06023c95d8b9128015fec04a38442fd3b2310c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0de039b3b5056e95349b04ddc59ef2827a56d41493cf4e0b511ad1148eebe73f\",\"dweb:/ipfs/QmWZRJXL2omhdtnEZ87zR5u8vMDjq84uNKHNGZ2R4Nmq4r\"]},\"lib/euler-vault-kit/src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0x02de3d909198483870304a8ab528773e4f4e00e63e88beef403dbb0f2f0ca17a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://538e5d523e49c7dfc8af365b207ec9adb8c19ab183d9cf7194dbe3e0feb0b832\",\"dweb:/ipfs/QmWp7EqG5xeGD9BLbz2s5xuq8x5GnXeP9fdr5uf1iAp8oc\"]},\"lib/euler-vault-kit/src/interfaces/ISequenceRegistry.sol\":{\"keccak256\":\"0x0b1d69979db5e6b3418a95bd4ddead8d8f1af5fb68b3f666d6da9f0b0121b312\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://02b1e2d5edbd6eed07b4e5cb2cd76f4ef95050a18221e69261b7cadc75a65a19\",\"dweb:/ipfs/QmXRpmQ7D4hGV6ca9WCXAAtABn3rw354W5csnWh68RskkD\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"struct Base.Integrations","name":"integrations","type":"tuple","components":[{"internalType":"address","name":"evc","type":"address"},{"internalType":"address","name":"protocolConfig","type":"address"},{"internalType":"address","name":"sequenceRegistry","type":"address"},{"internalType":"address","name":"balanceTracker","type":"address"},{"internalType":"address","name":"permit2","type":"address"}]},{"internalType":"struct Dispatch.DeployedModules","name":"modules","type":"tuple","components":[{"internalType":"address","name":"initialize","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"borrowing","type":"address"},{"internalType":"address","name":"liquidation","type":"address"},{"internalType":"address","name":"riskManager","type":"address"},{"internalType":"address","name":"balanceForwarder","type":"address"},{"internalType":"address","name":"governance","type":"address"}]}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"E_AccountLiquidity"},{"inputs":[],"type":"error","name":"E_AmountTooLargeToEncode"},{"inputs":[],"type":"error","name":"E_BadAddress"},{"inputs":[],"type":"error","name":"E_BadAssetReceiver"},{"inputs":[],"type":"error","name":"E_BadBorrowCap"},{"inputs":[],"type":"error","name":"E_BadCollateral"},{"inputs":[],"type":"error","name":"E_BadFee"},{"inputs":[],"type":"error","name":"E_BadMaxLiquidationDiscount"},{"inputs":[],"type":"error","name":"E_BadSharesOwner"},{"inputs":[],"type":"error","name":"E_BadSharesReceiver"},{"inputs":[],"type":"error","name":"E_BadSupplyCap"},{"inputs":[],"type":"error","name":"E_BorrowCapExceeded"},{"inputs":[],"type":"error","name":"E_CheckUnauthorized"},{"inputs":[],"type":"error","name":"E_CollateralDisabled"},{"inputs":[],"type":"error","name":"E_ConfigAmountTooLargeToEncode"},{"inputs":[],"type":"error","name":"E_ControllerDisabled"},{"inputs":[],"type":"error","name":"E_DebtAmountTooLargeToEncode"},{"inputs":[],"type":"error","name":"E_EmptyError"},{"inputs":[],"type":"error","name":"E_ExcessiveRepayAmount"},{"inputs":[],"type":"error","name":"E_FlashLoanNotRepaid"},{"inputs":[],"type":"error","name":"E_Initialized"},{"inputs":[],"type":"error","name":"E_InsufficientAllowance"},{"inputs":[],"type":"error","name":"E_InsufficientAssets"},{"inputs":[],"type":"error","name":"E_InsufficientBalance"},{"inputs":[],"type":"error","name":"E_InsufficientCash"},{"inputs":[],"type":"error","name":"E_InsufficientDebt"},{"inputs":[],"type":"error","name":"E_InvalidLTVAsset"},{"inputs":[],"type":"error","name":"E_LTVBorrow"},{"inputs":[],"type":"error","name":"E_LTVLiquidation"},{"inputs":[],"type":"error","name":"E_LiquidationCoolOff"},{"inputs":[],"type":"error","name":"E_MinYield"},{"inputs":[],"type":"error","name":"E_NoLiability"},{"inputs":[],"type":"error","name":"E_NoPriceOracle"},{"inputs":[],"type":"error","name":"E_NotController"},{"inputs":[],"type":"error","name":"E_NotHookTarget"},{"inputs":[],"type":"error","name":"E_NotSupported"},{"inputs":[],"type":"error","name":"E_OperationDisabled"},{"inputs":[],"type":"error","name":"E_OutstandingDebt"},{"inputs":[],"type":"error","name":"E_ProxyMetadata"},{"inputs":[],"type":"error","name":"E_Reentrancy"},{"inputs":[],"type":"error","name":"E_RepayTooMuch"},{"inputs":[],"type":"error","name":"E_SelfLiquidation"},{"inputs":[],"type":"error","name":"E_SelfTransfer"},{"inputs":[],"type":"error","name":"E_SupplyCapExceeded"},{"inputs":[],"type":"error","name":"E_TransientState"},{"inputs":[],"type":"error","name":"E_Unauthorized"},{"inputs":[],"type":"error","name":"E_ViolatorLiquidityDeferred"},{"inputs":[],"type":"error","name":"E_ZeroAssets"},{"inputs":[],"type":"error","name":"E_ZeroShares"},{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"bool","name":"status","type":"bool","indexed":false}],"type":"event","name":"BalanceForwarderStatus","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false}],"type":"event","name":"Borrow","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"address","name":"protocolReceiver","type":"address","indexed":true},{"internalType":"address","name":"governorReceiver","type":"address","indexed":true},{"internalType":"uint256","name":"protocolShares","type":"uint256","indexed":false},{"internalType":"uint256","name":"governorShares","type":"uint256","indexed":false}],"type":"event","name":"ConvertFees","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false}],"type":"event","name":"DebtSocialized","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"Deposit","anonymous":false},{"inputs":[{"internalType":"address","name":"creator","type":"address","indexed":true},{"internalType":"address","name":"asset","type":"address","indexed":true},{"internalType":"address","name":"dToken","type":"address","indexed":false}],"type":"event","name":"EVaultCreated","anonymous":false},{"inputs":[{"internalType":"uint16","name":"newSupplyCap","type":"uint16","indexed":false},{"internalType":"uint16","name":"newBorrowCap","type":"uint16","indexed":false}],"type":"event","name":"GovSetCaps","anonymous":false},{"inputs":[{"internalType":"uint32","name":"newConfigFlags","type":"uint32","indexed":false}],"type":"event","name":"GovSetConfigFlags","anonymous":false},{"inputs":[{"internalType":"address","name":"newFeeReceiver","type":"address","indexed":true}],"type":"event","name":"GovSetFeeReceiver","anonymous":false},{"inputs":[{"internalType":"address","name":"newGovernorAdmin","type":"address","indexed":true}],"type":"event","name":"GovSetGovernorAdmin","anonymous":false},{"inputs":[{"internalType":"address","name":"newHookTarget","type":"address","indexed":true},{"internalType":"uint32","name":"newHookedOps","type":"uint32","indexed":false}],"type":"event","name":"GovSetHookConfig","anonymous":false},{"inputs":[{"internalType":"uint16","name":"newFee","type":"uint16","indexed":false}],"type":"event","name":"GovSetInterestFee","anonymous":false},{"inputs":[{"internalType":"address","name":"newInterestRateModel","type":"address","indexed":false}],"type":"event","name":"GovSetInterestRateModel","anonymous":false},{"inputs":[{"internalType":"address","name":"collateral","type":"address","indexed":true},{"internalType":"uint16","name":"borrowLTV","type":"uint16","indexed":false},{"internalType":"uint16","name":"liquidationLTV","type":"uint16","indexed":false},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16","indexed":false},{"internalType":"uint48","name":"targetTimestamp","type":"uint48","indexed":false},{"internalType":"uint32","name":"rampDuration","type":"uint32","indexed":false}],"type":"event","name":"GovSetLTV","anonymous":false},{"inputs":[{"internalType":"uint16","name":"newCoolOffTime","type":"uint16","indexed":false}],"type":"event","name":"GovSetLiquidationCoolOffTime","anonymous":false},{"inputs":[{"internalType":"uint16","name":"newDiscount","type":"uint16","indexed":false}],"type":"event","name":"GovSetMaxLiquidationDiscount","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false}],"type":"event","name":"InterestAccrued","anonymous":false},{"inputs":[{"internalType":"address","name":"liquidator","type":"address","indexed":true},{"internalType":"address","name":"violator","type":"address","indexed":true},{"internalType":"address","name":"collateral","type":"address","indexed":false},{"internalType":"uint256","name":"repayAssets","type":"uint256","indexed":false},{"internalType":"uint256","name":"yieldBalance","type":"uint256","indexed":false}],"type":"event","name":"Liquidate","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false}],"type":"event","name":"PullDebt","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false}],"type":"event","name":"Repay","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"uint256","name":"totalShares","type":"uint256","indexed":false},{"internalType":"uint256","name":"totalBorrows","type":"uint256","indexed":false},{"internalType":"uint256","name":"accumulatedFees","type":"uint256","indexed":false},{"internalType":"uint256","name":"cash","type":"uint256","indexed":false},{"internalType":"uint256","name":"interestAccumulator","type":"uint256","indexed":false},{"internalType":"uint256","name":"interestRate","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"VaultStatus","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":true},{"internalType":"address","name":"receiver","type":"address","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"uint256","name":"assets","type":"uint256","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"Withdraw","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"EVC","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function","name":"LTVBorrow","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function","name":"LTVFull","outputs":[{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"}]},{"inputs":[{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function","name":"LTVLiquidation","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"LTVList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_BALANCE_FORWARDER","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_BORROWING","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_GOVERNANCE","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_INITIALIZE","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_LIQUIDATION","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_RISKMANAGER","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"MODULE_VAULT","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"liquidation","type":"bool"}],"stateMutability":"view","type":"function","name":"accountLiquidity","outputs":[{"internalType":"uint256","name":"collateralValue","type":"uint256"},{"internalType":"uint256","name":"liabilityValue","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"liquidation","type":"bool"}],"stateMutability":"view","type":"function","name":"accountLiquidityFull","outputs":[{"internalType":"address[]","name":"collaterals","type":"address[]"},{"internalType":"uint256[]","name":"collateralValues","type":"uint256[]"},{"internalType":"uint256","name":"liabilityValue","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"accumulatedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"accumulatedFeesAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"balanceForwarderEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"balanceTrackerAddress","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"caps","outputs":[{"internalType":"uint16","name":"supplyCap","type":"uint16"},{"internalType":"uint16","name":"borrowCap","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"cash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"collaterals","type":"address[]"}],"stateMutability":"view","type":"function","name":"checkAccountStatus","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}]},{"inputs":[{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"violator","type":"address"},{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function","name":"checkLiquidation","outputs":[{"internalType":"uint256","name":"maxRepay","type":"uint256"},{"internalType":"uint256","name":"maxYield","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"checkVaultStatus","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"configFlags","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"convertFees"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function","name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function","name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"dToken","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"debtOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"debtOfExact","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"disableBalanceForwarder"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"disableController"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"enableBalanceForwarder"},{"inputs":[],"stateMutability":"view","type":"function","name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"flashLoan"},{"inputs":[],"stateMutability":"view","type":"function","name":"governorAdmin","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"hookConfig","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"address","name":"proxyCreator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"interestAccumulator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"interestFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"interestRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"interestRateModel","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"violator","type":"address"},{"internalType":"address","name":"collateral","type":"address"},{"internalType":"uint256","name":"repayAssets","type":"uint256"},{"internalType":"uint256","name":"minYieldBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"liquidate"},{"inputs":[],"stateMutability":"view","type":"function","name":"liquidationCoolOffTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"maxLiquidationDiscount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function","name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"permit2Address","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function","name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"protocolConfigAddress","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"protocolFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"protocolFeeShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"from","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"pullDebt"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"repay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"repayWithShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"}]},{"inputs":[{"internalType":"uint16","name":"supplyCap","type":"uint16"},{"internalType":"uint16","name":"borrowCap","type":"uint16"}],"stateMutability":"nonpayable","type":"function","name":"setCaps"},{"inputs":[{"internalType":"uint32","name":"newConfigFlags","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"setConfigFlags"},{"inputs":[{"internalType":"address","name":"newFeeReceiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setFeeReceiver"},{"inputs":[{"internalType":"address","name":"newGovernorAdmin","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setGovernorAdmin"},{"inputs":[{"internalType":"address","name":"newHookTarget","type":"address"},{"internalType":"uint32","name":"newHookedOps","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"setHookConfig"},{"inputs":[{"internalType":"uint16","name":"newFee","type":"uint16"}],"stateMutability":"nonpayable","type":"function","name":"setInterestFee"},{"inputs":[{"internalType":"address","name":"newModel","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setInterestRateModel"},{"inputs":[{"internalType":"address","name":"collateral","type":"address"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint32","name":"rampDuration","type":"uint32"}],"stateMutability":"nonpayable","type":"function","name":"setLTV"},{"inputs":[{"internalType":"uint16","name":"newCoolOffTime","type":"uint16"}],"stateMutability":"nonpayable","type":"function","name":"setLiquidationCoolOffTime"},{"inputs":[{"internalType":"uint16","name":"newDiscount","type":"uint16"}],"stateMutability":"nonpayable","type":"function","name":"setMaxLiquidationDiscount"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"skim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBorrows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBorrowsExact","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"touch"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferFromMax","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"unitOfAccount","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"viewDelegate"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{"EVC()":{"returns":{"_0":"The EVC address"}},"LTVBorrow(address)":{"params":{"collateral":"The address of the collateral to query"},"returns":{"_0":"Borrowing LTV in 1e4 scale"}},"LTVFull(address)":{"params":{"collateral":"Collateral asset"},"returns":{"borrowLTV":"The current value of borrow LTV for originating positions","initialLiquidationLTV":"The initial value of the liquidation LTV, when the ramp began","liquidationLTV":"The value of fully converged liquidation LTV","rampDuration":"The time it takes for the liquidation LTV to converge from the initial value to the fully converged value","targetTimestamp":"The timestamp when the liquidation LTV is considered fully converged"}},"LTVLiquidation(address)":{"params":{"collateral":"The address of the collateral to query"},"returns":{"_0":"Liquidation LTV in 1e4 scale"}},"LTVList()":{"details":"Returned assets could have the ltv disabled (set to zero)","returns":{"_0":"List of asset collaterals"}},"accountLiquidity(address,bool)":{"params":{"account":"Account holding debt in this vault","liquidation":"Flag to indicate if the calculation should be performed in liquidation vs account status check mode, where different LTV values might apply."},"returns":{"collateralValue":"Total risk adjusted value of all collaterals in unit of account","liabilityValue":"Value of debt in unit of account"}},"accountLiquidityFull(address,bool)":{"params":{"account":"Account holding debt in this vault","liquidation":"Flag to indicate if the calculation should be performed in liquidation vs account status check mode, where different LTV values might apply."},"returns":{"collateralValues":"Array of risk adjusted collateral values corresponding to items in collaterals array. In unit of account","collaterals":"Array of collaterals enabled","liabilityValue":"Value of debt in unit of account"}},"accumulatedFees()":{"returns":{"_0":"The accumulated fees in shares"}},"accumulatedFeesAssets()":{"returns":{"_0":"The accumulated fees in asset units"}},"allowance(address,address)":{"params":{"holder":"The account holding the eTokens","spender":"Trusted address"},"returns":{"_0":"The allowance from holder for spender"}},"approve(address,uint256)":{"params":{"amount":"Use max uint for \"infinite\" allowance","spender":"Trusted address"},"returns":{"_0":"True if approval succeeded"}},"asset()":{"returns":{"_0":"The vault's underlying asset"}},"balanceForwarderEnabled(address)":{"params":{"account":"Address to query"},"returns":{"_0":"True if balance forwarder is enabled"}},"balanceOf(address)":{"params":{"account":"Address to query"},"returns":{"_0":"The balance of the account"}},"balanceTrackerAddress()":{"returns":{"_0":"The balance tracker address"}},"borrow(uint256,address)":{"params":{"amount":"Amount of assets to borrow (use max uint256 for all available tokens)","receiver":"Account receiving the borrowed tokens"},"returns":{"_0":"Amount of assets borrowed"}},"caps()":{"returns":{"borrowCap":"The borrow cap in AmountCap format","supplyCap":"The supply cap in AmountCap format"}},"cash()":{"returns":{"_0":"The amount of assets the vault tracks as current direct holdings"}},"checkAccountStatus(address,address[])":{"details":"The function doesn't have a reentrancy lock, because onlyEVCChecks provides equivalent behaviour. It ensures that the caller is the EVC, in 'checks in progress' state. In this state EVC will not accept any calls. Since all the functions which modify vault state use callThroughEVC modifier, they are effectively blocked while the function executes. There are non-view functions without `callThroughEVC` modifier (`flashLoan`, `disableController`), but they don't change the vault's storage.","params":{"account":"The address of the account to be checked"},"returns":{"_0":"Must return the bytes4 magic value 0xb168c58f (which is a selector of this function) when account status is valid, or revert otherwise."}},"checkLiquidation(address,address,address)":{"details":"The function will not revert if the account is healthy and return (0, 0)","params":{"collateral":"Collateral which is to be seized","liquidator":"Address that will initiate the liquidation","violator":"Address that may be in collateral violation"},"returns":{"maxRepay":"Max amount of debt that can be repaid, in asset units","maxYield":"Yield in collateral corresponding to max allowed amount of debt to be repaid, in collateral balance (shares for vaults)"}},"checkVaultStatus()":{"details":"See comment about reentrancy for `checkAccountStatus`","returns":{"_0":"Must return the bytes4 magic value 0x4b3d1223 (which is a selector of this function) when account status is valid, or revert otherwise."}},"configFlags()":{"returns":{"_0":"Bitmask with config flags enabled"}},"convertToAssets(uint256)":{"params":{"shares":"Amount of shares to convert"},"returns":{"_0":"The amount of assets"}},"convertToShares(uint256)":{"params":{"assets":"Amount of assets to convert"},"returns":{"_0":"The amount of shares"}},"creator()":{"returns":{"_0":"The address of the creator"}},"dToken()":{"returns":{"_0":"The address of the DToken"}},"debtOf(address)":{"params":{"account":"Address to query"},"returns":{"_0":"The debt of the account in asset units"}},"debtOfExact(address)":{"params":{"account":"Address to query"},"returns":{"_0":"The debt of the account in internal precision"}},"decimals()":{"returns":{"_0":"The decimals of the eToken"}},"deposit(uint256,address)":{"details":"Deposit will round down the amount of assets that are converted to shares. To prevent losses consider using mint instead.","params":{"amount":"Amount of assets to deposit (use max uint256 for full underlying token balance)","receiver":"An account to receive the shares"},"returns":{"_0":"Amount of shares minted"}},"disableBalanceForwarder()":{"details":"Only the authenticated account can disable balance forwarding for itselfShould call the IBalanceTracker hook with the account's balance of 0"},"enableBalanceForwarder()":{"details":"Only the authenticated account can enable balance forwarding for itselfShould call the IBalanceTracker hook with the current account's balance"},"feeReceiver()":{"returns":{"_0":"The fee receiver address"}},"flashLoan(uint256,bytes)":{"params":{"amount":"In asset units","data":"Passed through to the onFlashLoan() callback, so contracts don't need to store transient data in storage"}},"governorAdmin()":{"returns":{"_0":"The governor address"}},"hookConfig()":{"returns":{"_0":"Address of the hook target contract","_1":"Bitmask with operations that should call the hooks. See Constants.sol for a list of operations"}},"initialize(address)":{"params":{"proxyCreator":"Account which created the proxy or should be the initial governor"}},"interestAccumulator()":{"returns":{"_0":"An opaque accumulator that increases as interest is accrued"}},"interestFee()":{"returns":{"_0":"Amount of interest that is redirected as a fee, as a fraction scaled by 1e4"}},"interestRate()":{"returns":{"_0":"The interest rate in yield-per-second, scaled by 10**27"}},"interestRateModel()":{"returns":{"_0":"Address of the interest rate contract or address zero to indicate 0% interest"}},"liquidate(address,address,uint256,uint256)":{"details":"If `repayAssets` is set to max uint256 it is assumed the caller will perform their own slippage checks to make sure they are not taking on too much debt. This option is mainly meant for smart contract liquidators","params":{"collateral":"Collateral which is to be seized","minYieldBalance":"The minimum acceptable amount of collateral to be transferred from violator to sender, in collateral balance units (shares for vaults). Meant as slippage check together with `repayAssets`","repayAssets":"The amount of underlying debt to be transferred from violator to sender, in asset units (use max uint256 to repay the maximum possible amount). Meant as slippage check together with `minYieldBalance`","violator":"Address that may be in collateral violation"}},"liquidationCoolOffTime()":{"returns":{"_0":"The liquidation cool off time in seconds"}},"maxDeposit(address)":{"params":{"account":"Address to query"},"returns":{"_0":"The max amount of assets the account can deposit"}},"maxLiquidationDiscount()":{"details":"The default value, which is zero, is deliberately bad, as it means there would be no incentive to liquidate unhealthy users. The vault creator must take care to properly select the limit, given the underlying and collaterals used.","returns":{"_0":"The maximum liquidation discount in 1e4 scale"}},"maxMint(address)":{"params":{"account":"Address to query"},"returns":{"_0":"The max amount of shares the account can mint"}},"maxRedeem(address)":{"params":{"owner":"Account holding the shares"},"returns":{"_0":"The maximum amount of shares the owner is allowed to redeem"}},"maxWithdraw(address)":{"params":{"owner":"Account holding the shares"},"returns":{"_0":"The maximum amount of assets the owner is allowed to withdraw"}},"mint(uint256,address)":{"params":{"amount":"Amount of shares to be minted","receiver":"An account to receive the shares"},"returns":{"_0":"Amount of assets deposited"}},"name()":{"returns":{"_0":"The name of the eToken"}},"oracle()":{"returns":{"_0":"The address of the oracle"}},"permit2Address()":{"returns":{"_0":"The address of the Permit2 contract"}},"previewDeposit(uint256)":{"params":{"assets":"Amount of assets deposited"},"returns":{"_0":"Amount of shares received"}},"previewMint(uint256)":{"params":{"shares":"Amount of shares to be minted"},"returns":{"_0":"Required amount of assets"}},"previewRedeem(uint256)":{"params":{"shares":"Amount of shares redeemed"},"returns":{"_0":"Amount of assets transferred"}},"previewWithdraw(uint256)":{"params":{"assets":"Amount of assets withdrawn"},"returns":{"_0":"Amount of shares burned"}},"protocolConfigAddress()":{"returns":{"_0":"The protocol config address"}},"protocolFeeShare()":{"returns":{"_0":"A percentage share of fees accrued belonging to the protocol, in 1e4 scale"}},"pullDebt(uint256,address)":{"details":"Due to internal debt precision accounting, the liability reported on either or both accounts after calling `pullDebt` may not match the `amount` requested precisely","params":{"amount":"Amount of debt in asset units (use max uint256 for all the account's debt)","from":"Account to pull the debt from"}},"redeem(uint256,address,address)":{"params":{"amount":"Amount of shares to burn (use max uint256 to burn full owner balance)","owner":"Account holding the shares to burn.","receiver":"Account to receive the withdrawn assets"},"returns":{"_0":"Amount of assets transferred"}},"repay(uint256,address)":{"params":{"amount":"Amount of debt to repay in assets (use max uint256 for full debt)","receiver":"Account holding the debt to be repaid"},"returns":{"_0":"Amount of assets repaid"}},"repayWithShares(uint256,address)":{"details":"Equivalent to withdrawing and repaying, but no assets are needed to be present in the vaultContrary to a regular `repay`, if account is unhealthy, the repay amount must bring the account back to health, or the operation will revert during account status check","params":{"amount":"In asset units (use max uint256 to repay the debt in full or up to the available deposit)","receiver":"Account to remove debt from by burning sender's shares"},"returns":{"debt":"Amount of debt removed in assets","shares":"Amount of shares burned"}},"setCaps(uint16,uint16)":{"params":{"borrowCap":"The new borrow cap in AmountCap fromat","supplyCap":"The new supply cap in AmountCap fromat"}},"setConfigFlags(uint32)":{"params":{"newConfigFlags":"Bitmask with the new config flags"}},"setFeeReceiver(address)":{"params":{"newFeeReceiver":"The new fee receiver address"}},"setGovernorAdmin(address)":{"details":"Set to zero address to renounce privileges and make the vault non-governed","params":{"newGovernorAdmin":"The new governor address"}},"setHookConfig(address,uint32)":{"details":"All operations are initially disabled in a newly created vault. The vault creator must set their own configuration to make the vault usable","params":{"newHookTarget":"The new hook target address. Use address(0) to simply disable hooked operations","newHookedOps":"Bitmask with the new hooked operations"}},"setInterestRateModel(address)":{"details":"If the new model reverts, perhaps due to governor error, the vault will silently use a zero interest rate. Governor should make sure the new interest rates are computed as expected.","params":{"newModel":"The new IRM address"}},"setLTV(address,uint16,uint16,uint32)":{"details":"When the collateral asset is no longer deemed suitable to sustain debt, its LTV setting can be set to 0. Setting a zero liquidation LTV also enforces a zero borrowing LTV (`newBorrowLTV <= newLiquidationLTV`). In such cases, the collateral becomes immediately ineffective for new borrows. However, for liquidation purposes, the LTV can be ramped down over a period of time (`rampDuration`). This ramping helps users avoid hard liquidations with maximum discounts and gives them a chance to close their positions in an orderly fashion. The choice of `rampDuration` depends on market conditions assessed by the governor. They may decide to forgo the ramp entirely by setting the duration to zero, presumably in light of extreme market conditions, where ramping would pose a threat to the vault's solvency. In any case, when the liquidation LTV reaches its target of 0, this asset will no longer support the debt, but it will still be possible to liquidate it at a discount and use the proceeds to repay an unhealthy loan. Setting the LTV to zero will not be sufficient if the collateral is found to be unsafe to call liquidation on, either due to a bug or a code upgrade that allows its transfer function to make arbitrary external calls. In such cases, pausing the vault and conducting an orderly wind-down is recommended.","params":{"borrowLTV":"New borrow LTV, for assessing account's health during account status checks, in 1e4 scale","collateral":"Address of collateral to set LTV for","liquidationLTV":"New liquidation LTV after ramp ends in 1e4 scale","rampDuration":"Ramp duration in seconds"}},"setLiquidationCoolOffTime(uint16)":{"details":"Setting cool off time to zero allows liquidating the account in the same block as the last successful account status check","params":{"newCoolOffTime":"The new liquidation cool off time in seconds"}},"setMaxLiquidationDiscount(uint16)":{"details":"If the discount is zero (the default), the liquidators will not be incentivized to liquidate unhealthy accounts","params":{"newDiscount":"New maximum liquidation discount in 1e4 scale"}},"skim(uint256,address)":{"details":"Could be used as an alternative deposit flow in certain scenarios. E.g. swap directly to the vault, call `skim` to claim deposit.","params":{"amount":"Amount of assets to claim (use max uint256 to claim all available assets)","receiver":"An account to receive the shares"},"returns":{"_0":"Amount of shares minted"}},"symbol()":{"returns":{"_0":"The symbol of the eToken"}},"totalAssets()":{"returns":{"_0":"The total amount of assets"}},"totalBorrows()":{"returns":{"_0":"The total borrows in asset units"}},"totalBorrowsExact()":{"returns":{"_0":"The total borrows in internal debt precision"}},"totalSupply()":{"returns":{"_0":"The total supply of the eToken"}},"transfer(address,uint256)":{"params":{"amount":"In shares.","to":"Recipient account"},"returns":{"_0":"True if transfer succeeded"}},"transferFrom(address,address,uint256)":{"params":{"amount":"In shares","from":"This address must've approved the to address","to":"Recipient account"},"returns":{"_0":"True if transfer succeeded"}},"transferFromMax(address,address)":{"params":{"from":"This address must've approved the to address","to":"Recipient account"},"returns":{"_0":"True if transfer succeeded"}},"unitOfAccount()":{"returns":{"_0":"The address of the reference asset"}},"withdraw(uint256,address,address)":{"params":{"amount":"Amount of assets to withdraw","owner":"Account holding the shares to burn","receiver":"Account to receive the withdrawn assets"},"returns":{"_0":"Amount of shares burned"}}},"version":1},"userdoc":{"kind":"user","methods":{"EVC()":{"notice":"Address of EthereumVaultConnector contract"},"LTVBorrow(address)":{"notice":"Retrieves the borrow LTV of the collateral, which is used to determine if the account is healthy during account status checks."},"LTVFull(address)":{"notice":"Retrieves LTV configuration for the collateral"},"LTVLiquidation(address)":{"notice":"Retrieves the current liquidation LTV, which is used to determine if the account is eligible for liquidation"},"LTVList()":{"notice":"Retrieves a list of collaterals with configured LTVs"},"MODULE_BALANCE_FORWARDER()":{"notice":"Address of the BalanceForwarder module"},"MODULE_BORROWING()":{"notice":"Address of the Borrowing module"},"MODULE_GOVERNANCE()":{"notice":"Address of the Governance module"},"MODULE_INITIALIZE()":{"notice":"Address of the Initialize module"},"MODULE_LIQUIDATION()":{"notice":"Address of the Liquidation module"},"MODULE_RISKMANAGER()":{"notice":"Address of the RiskManager module"},"MODULE_TOKEN()":{"notice":"Address of the Token module"},"MODULE_VAULT()":{"notice":"Address of the Vault module"},"accountLiquidity(address,bool)":{"notice":"Retrieve account's total liquidity"},"accountLiquidityFull(address,bool)":{"notice":"Retrieve account's liquidity per collateral"},"accumulatedFees()":{"notice":"Balance of the fees accumulator, in shares"},"accumulatedFeesAssets()":{"notice":"Balance of the fees accumulator, in underlying units"},"allowance(address,address)":{"notice":"Retrieve the current allowance"},"approve(address,uint256)":{"notice":"Allow spender to access an amount of your eTokens"},"asset()":{"notice":"Vault's underlying asset"},"balanceForwarderEnabled(address)":{"notice":"Retrieves boolean indicating if the account opted in to forward balance changes to the rewards contract"},"balanceOf(address)":{"notice":"Balance of a particular account, in eTokens"},"balanceTrackerAddress()":{"notice":"Retrieve the address of rewards contract, tracking changes in account's balances"},"borrow(uint256,address)":{"notice":"Transfer underlying tokens from the vault to the sender, and increase sender's debt"},"caps()":{"notice":"Retrieves supply and borrow caps in AmountCap format"},"cash()":{"notice":"Balance of vault assets as tracked by deposits/withdrawals and borrows/repays"},"checkAccountStatus(address,address[])":{"notice":"Checks the status of an account and reverts if account is not healthy"},"checkLiquidation(address,address,address)":{"notice":"Checks to see if a liquidation would be profitable, without actually doing anything"},"checkVaultStatus()":{"notice":"Checks the status of the vault and reverts if caps are exceeded"},"configFlags()":{"notice":"Retrieves a bitmask indicating enabled config flags"},"convertFees()":{"notice":"Splits accrued fees balance according to protocol fee share and transfers shares to the governor fee receiver and protocol fee receiver"},"convertToAssets(uint256)":{"notice":"Calculate amount of assets corresponding to the requested shares amount"},"convertToShares(uint256)":{"notice":"Calculate amount of shares corresponding to the requested assets amount"},"creator()":{"notice":"Address of the original vault creator"},"dToken()":{"notice":"Returns an address of the sidecar DToken"},"debtOf(address)":{"notice":"Debt owed by a particular account, in underlying units"},"debtOfExact(address)":{"notice":"Debt owed by a particular account, in underlying units scaled up by shifting INTERNAL_DEBT_PRECISION_SHIFT bits"},"decimals()":{"notice":"Decimals, the same as the asset's or 18 if the asset doesn't implement `decimals()`"},"deposit(uint256,address)":{"notice":"Transfer requested amount of underlying tokens from sender to the vault pool in return for shares"},"disableBalanceForwarder()":{"notice":"Disables balance forwarding for the authenticated account"},"disableController()":{"notice":"Release control of the account on EVC if no outstanding debt is present"},"enableBalanceForwarder()":{"notice":"Enables balance forwarding for the authenticated account"},"feeReceiver()":{"notice":"Retrieves address of the governance fee receiver"},"flashLoan(uint256,bytes)":{"notice":"Request a flash-loan. A onFlashLoan() callback in msg.sender will be invoked, which must repay the loan to the main Euler address prior to returning."},"governorAdmin()":{"notice":"Retrieves the address of the governor"},"hookConfig()":{"notice":"Retrieves a hook target and a bitmask indicating which operations call the hook target"},"initialize(address)":{"notice":"Initialization of the newly deployed proxy contract"},"interestAccumulator()":{"notice":"Retrieves the current interest rate accumulator for an asset"},"interestFee()":{"notice":"Retrieves the interest fee in effect for the vault"},"interestRate()":{"notice":"Retrieves the current interest rate for an asset"},"interestRateModel()":{"notice":"Looks up an asset's currently configured interest rate model"},"liquidate(address,address,uint256,uint256)":{"notice":"Attempts to perform a liquidation"},"liquidationCoolOffTime()":{"notice":"Retrieves liquidation cool-off time, which must elapse after successful account status check before account can be liquidated"},"maxDeposit(address)":{"notice":"Fetch the maximum amount of assets a user can deposit"},"maxLiquidationDiscount()":{"notice":"Retrieves the maximum liquidation discount"},"maxMint(address)":{"notice":"Fetch the maximum amount of shares a user can mint"},"maxRedeem(address)":{"notice":"Fetch the maximum amount of shares a user is allowed to redeem for assets"},"maxWithdraw(address)":{"notice":"Fetch the maximum amount of assets a user is allowed to withdraw"},"mint(uint256,address)":{"notice":"Transfer underlying tokens from sender to the vault pool in return for requested amount of shares"},"name()":{"notice":"Vault share token (eToken) name, ie \"Euler Vault: DAI\""},"oracle()":{"notice":"Retrieves the address of the oracle contract"},"permit2Address()":{"notice":"Retrieves the Permit2 contract address"},"previewDeposit(uint256)":{"notice":"Calculate an amount of shares that would be created by depositing assets"},"previewMint(uint256)":{"notice":"Calculate an amount of assets that would be required to mint requested amount of shares"},"previewRedeem(uint256)":{"notice":"Calculate the amount of assets that will be transferred when redeeming requested amount of shares"},"previewWithdraw(uint256)":{"notice":"Calculate the amount of shares that will be burned when withdrawing requested amount of assets"},"protocolConfigAddress()":{"notice":"Retrieves the ProtocolConfig address"},"protocolFeeReceiver()":{"notice":"Retrieves the address which will receive protocol's feesThe protocol fee receiver address"},"protocolFeeShare()":{"notice":"Retrieves the protocol fee share"},"pullDebt(uint256,address)":{"notice":"Take over debt from another account"},"redeem(uint256,address,address)":{"notice":"Burn requested shares and transfer corresponding underlying tokens from the vault to the receiver"},"repay(uint256,address)":{"notice":"Transfer underlying tokens from the sender to the vault, and decrease receiver's debt"},"repayWithShares(uint256,address)":{"notice":"Pay off liability with shares (\"self-repay\")"},"setCaps(uint16,uint16)":{"notice":"Set new supply and borrow caps in AmountCap format"},"setConfigFlags(uint32)":{"notice":"Set new bitmap indicating which config flags should be enabled. Flags are defined in Constants.sol"},"setFeeReceiver(address)":{"notice":"Set a new governor fee receiver address"},"setGovernorAdmin(address)":{"notice":"Set a new governor address"},"setHookConfig(address,uint32)":{"notice":"Set a new hook target and a new bitmap indicating which operations should call the hook target. Operations are defined in Constants.sol."},"setInterestRateModel(address)":{"notice":"Set a new interest rate model contract"},"setLTV(address,uint16,uint16,uint32)":{"notice":"Set a new LTV config"},"setLiquidationCoolOffTime(uint16)":{"notice":"Set a new liquidation cool off time, which must elapse after successful account status check before account can be liquidated"},"setMaxLiquidationDiscount(uint16)":{"notice":"Set a new maximum liquidation discount"},"skim(uint256,address)":{"notice":"Creates shares for the receiver, from excess asset balances of the vault (not accounted for in `cash`)"},"symbol()":{"notice":"Vault share token (eToken) symbol, ie \"eDAI\""},"totalAssets()":{"notice":"Total amount of managed assets, cash and borrows"},"totalBorrows()":{"notice":"Sum of all outstanding debts, in underlying units (increases as interest is accrued)"},"totalBorrowsExact()":{"notice":"Sum of all outstanding debts, in underlying units scaled up by shifting INTERNAL_DEBT_PRECISION_SHIFT bits"},"totalSupply()":{"notice":"Sum of all eToken balances"},"touch()":{"notice":"Updates interest accumulator and totalBorrows, credits reserves, re-targets interest rate, and logs vault status"},"transfer(address,uint256)":{"notice":"Transfer eTokens to another address"},"transferFrom(address,address,uint256)":{"notice":"Transfer eTokens from one address to another"},"transferFromMax(address,address)":{"notice":"Transfer the full eToken balance of an address to another"},"unitOfAccount()":{"notice":"Retrieves a reference asset used for liquidity calculations"},"withdraw(uint256,address,address)":{"notice":"Transfer requested amount of underlying tokens from the vault and decrease account's shares balance"}},"version":1}},"settings":{"remappings":["@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/","@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/","@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/","@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/","@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/","@solady/=lib/euler-price-oracle/lib/solady/src/","@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/","@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/","axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/","axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/","ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","ethereum-vault-connector/=lib/ethereum-vault-connector/src/","euler-price-oracle-test/=lib/euler-price-oracle/test/","euler-price-oracle/=lib/euler-price-oracle/src/","euler-vault-kit/=lib/euler-vault-kit/src/","evc/=lib/ethereum-vault-connector/src/","evk-test/=lib/euler-vault-kit/test/","evk/=lib/euler-vault-kit/src/","fee-flow/=lib/fee-flow/src/","forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/","openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/","permit2/=lib/euler-vault-kit/lib/permit2/","pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/","redstone-oracles-monorepo/=lib/euler-price-oracle/lib/","reward-streams/=lib/reward-streams/src/","solady/=lib/euler-price-oracle/lib/solady/src/","solmate/=lib/fee-flow/lib/solmate/src/","v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/","v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/"],"optimizer":{"enabled":true,"runs":20000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/euler-vault-kit/src/EVault/EVault.sol":"EVault"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/ethereum-vault-connector/src/interfaces/IEthereumVaultConnector.sol":{"keccak256":"0x2d7b4cf0a3346feada4b7bc2c661c89fa60a485f498f374078a934cd4ece7c7b","urls":["bzz-raw://e8c832fdc952913ffeec92cdbf06266b427c66d87ad1b5d027c73b22fc4fc82d","dweb:/ipfs/QmPEcrWAR85tMKBFQDnTZxgXPVENRU2B6MBgzgRBhbV8oP"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/interfaces/IVault.sol":{"keccak256":"0xb04fe66deccf8baa3e5c850f2ecf32e948393d7a42e78b59b037141b205edf42","urls":["bzz-raw://11acaad66e9a42deec1f9328abe9f2662bfb109568baa20a79317ae707b94016","dweb:/ipfs/QmQbAtvrk9cqXJJZgMRjdxrMDXiZPz37m6PGZYEpbtN8to"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/DToken.sol":{"keccak256":"0xede53299e72a2138a06e0aba6c5b76fcef959832a24b5b4a231bf54cc533f733","urls":["bzz-raw://0ffcfb7d6f89e725f7e4770c5ce16569461523371d5a55914336b45d17558798","dweb:/ipfs/QmVEhjgxCsVoQAMKEMSmBR8XAM9ZwyS13TmtwbEpJ3Byj5"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/Dispatch.sol":{"keccak256":"0xa42cec3ad6bdf05da5ea964453346b1302495fb77c404fb4961b978da511589d","urls":["bzz-raw://2c6059c4617e6b6f0fa41283a262afbd63b7594cb89dd915287e4bb305ab8055","dweb:/ipfs/QmXe9qv2T9YavhdzNGDWGxtHw9z7WuxQQ1r5nWpJiyfted"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/EVault.sol":{"keccak256":"0xb25edcceef5970d97bafec4b34a6f99a473c505ed5cf554d99aab4b7010eef70","urls":["bzz-raw://72b6455cb8d21d93f0fc68395f0e62e3de4781780c833c43634d9f8249d17cee","dweb:/ipfs/QmPHmkAdotKrF6vyYMVk7ndp2k9W1XJZUSDRKC89PZVzvv"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/IEVault.sol":{"keccak256":"0x1e41f0fe57683c65b27afa6b725ee2c68128b540f682bba93e2dc135522ac6b3","urls":["bzz-raw://86bb1872eb9073214b853663fb136157bea709bbcf626bb0a2bb2748a43f941d","dweb:/ipfs/QmSWQPjHBBahLM3AsoVjHHYEBiBj8WbkQqCQLPNUJVMX1k"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/modules/BalanceForwarder.sol":{"keccak256":"0xcd38158478dcb61780326cc5d67f27487adaed08a0a1922e7f0e6ab4e67e656b","urls":["bzz-raw://c435261c091ccd7820ebb0433d0730d0845b41033ef57db61e0d16e3ee31f7c7","dweb:/ipfs/Qmea7sYiZetjmDN99frFLLnXWjMuezGy2XyNcEzrBJ5E5q"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/Borrowing.sol":{"keccak256":"0x11d69bc8fe31d7eff3fca3c12ad458560e4ec845431ec1f1a777306cae316563","urls":["bzz-raw://b93d0a4e5c198970361e1da84b6f53672863f79590a1f1f8714abf3d0d04eecb","dweb:/ipfs/QmQ9CySqmJpLd5CTMwqh7n4dqzS5YX9Tx78xdhwEC1zazK"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/Governance.sol":{"keccak256":"0xcdee32c086bf55fac9c0cba6a80da1de650b316eb617f5e244f4810738b324ef","urls":["bzz-raw://6bd98e36ef599ddbfa32c1822a7ce79eaf35bc5d351bc36243bae21aac63b930","dweb:/ipfs/Qmf2uGhQehDQCZCbPueyw6P3xLzFioGfsks5VWjbAYW1Az"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/Initialize.sol":{"keccak256":"0x465cd6c9a4107bbe0bcc3f7caec84eef824f2978b7abc2b3cb123f7a52042970","urls":["bzz-raw://fb431ec2765e55385444c0f4d8e22b02136ce9aa10bb482306d0a0f0fc42cdb8","dweb:/ipfs/QmSPDWkQXPTia6XisJwiQqV3V9FzzNT8NMVjEm2HYt62iM"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/Liquidation.sol":{"keccak256":"0xde4b76d0b5e191eeb1f8e5951cafc632e8159e9dcf07e72de523fe7ad94a003e","urls":["bzz-raw://e99cda652a739ce70d067681c4f167c05d5679e6152208e09786270b5ed3904b","dweb:/ipfs/QmXcfhDU1hhnLNjEvrz4ZBx33G2jage6JDf1yNbsUeXe52"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/RiskManager.sol":{"keccak256":"0x4b244e29a33546c1ec96ece0772b4df6082574a588ac7d688f180df129a28e1f","urls":["bzz-raw://2f471f3cc323809bd8dde9e5b7e6ab3fd73fd0dab1c51e6cab6b1e6840ec98b9","dweb:/ipfs/QmZsttEuAvqUf3GN6UYEpyYrqm5c6jofL3HddJMyAuueU1"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/Token.sol":{"keccak256":"0x3f2176bada53b1b1ff79453bfdddeed023a3de7679c5550eb4373b7752292459","urls":["bzz-raw://ecde60cff6a858bd20286e8f8c6b62af96ac907151cf73111e001dea37ca0771","dweb:/ipfs/QmQ3MVMmdFbHsdPDmEpXQBDzEPBvTQP57YwPn4oyYjR97r"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/modules/Vault.sol":{"keccak256":"0x33da510c95866ddef92c9092a4fd5acfcf58baf4b53704dfb33718f7d67a0312","urls":["bzz-raw://1275bf9ca9ee870ed1d2ad2fc4e85ffd8daa728a1edd550b696db36ff56474fb","dweb:/ipfs/QmXY9ZThsM1GUPX81thvPYxU3WiCuR2VMyhtL2RfVGXpoF"],"license":"BUSL-1.1"},"lib/euler-vault-kit/src/EVault/shared/AssetTransfers.sol":{"keccak256":"0x67502822f02eb0964790d94fcf2c31e28faa6366a83b21fd3ebe121bbb96f971","urls":["bzz-raw://16952aede414f5f3b2f9584927e6f1c77c0b7f072520ab074223767bcddd3e5f","dweb:/ipfs/QmT8AUxozPTrAh6BCZf9pwSZqy1eu3SnWmwDdd72uMsTND"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/BalanceUtils.sol":{"keccak256":"0x1a76b6178b6d2e8db9b757ac1aeddda6ecd8552721b400d1383148f2ea63355b","urls":["bzz-raw://c10be81a47ab3ce8a9b2f6e02625c146dc63218e1bf5c90b6b111f118c1b010e","dweb:/ipfs/QmSwd1VGo4jiaWGBR9FTg45DoUN6biwV8Q2MDjmitA1T9q"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/Base.sol":{"keccak256":"0xf49eebd148a79afc5834f48e6c6388b017b763d4fa79b14e796072127ee39e3a","urls":["bzz-raw://2385807b5b508ef506c1756bd595087fbc3764d5930fc27e191ff712c2465cf1","dweb:/ipfs/QmcnbDCwqdwy75df6RLoeAK8tu6YFSFCMxrVjFsoSn5VKx"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/BorrowUtils.sol":{"keccak256":"0xecb340bc803ef6736f071da286b2390ccc4cc2e515519d524ef61786f9c5ec4a","urls":["bzz-raw://85d605a34fce37fed8094d4ec555ea5e745714fe2d3ab1711a09cb24bde474a7","dweb:/ipfs/QmfBFGSvCq7FuTm7cHBZdeRbnvi43ysT9JLbAqMXCeLuuj"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/Cache.sol":{"keccak256":"0x45da1d4bb59b42c8cefa3c9a754ad98c192433a378d5d885b711bb86fad46d1f","urls":["bzz-raw://60661c395ba77473243c88b1c207639f25c1960a2b9a02aec59b24790ddd73d3","dweb:/ipfs/QmaV3AQ9paVij1zj96WFv3ZJLLKYAfxLXVbSKky8kU1MsV"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/Constants.sol":{"keccak256":"0x2ebe53774841efddede73dedd186db34e4e25ee0eaf501eefb84e050d92302c3","urls":["bzz-raw://6e1744f0a718796c8c0bd59e83a8f3da940f34793ef3369b9e4a042a24015957","dweb:/ipfs/QmYrR2K3CVGhPQqF8JKy48vMBkaQMZccgxiCcs5CTkRmH3"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/EVCClient.sol":{"keccak256":"0xb18450832c0b5f823cab92079a3c9de277a961b168a9780fcc640b1bc44df777","urls":["bzz-raw://b0a03b9e3bfe730d358881ea10c652cbfec5385e62fb0b1e304266a6c60a3f3f","dweb:/ipfs/QmcABReCmZ4NSv3GxdSVidRDGPLaTcp16Ut7cyj6nzJdsN"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/Errors.sol":{"keccak256":"0x602f18548a2cb917337095faab9afd839e36e2cd0f3710013d0a2499082d85a0","urls":["bzz-raw://58682c0712a0e2da378aee586edcedcf73e2f05fe255bb6b9867e30695292502","dweb:/ipfs/QmX8ytBHPnwiTdTxK26uSxwEPKpTH8BvLie8n956pP4JTv"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/Events.sol":{"keccak256":"0xe9231f76167eac66a84ead5b01cac576e14e7467324549d388abaca78dc4129f","urls":["bzz-raw://cc5b9a0bbed87dccac4fb0b3a905a20340eeb85417f20117d0ba5ef6d249ac31","dweb:/ipfs/QmU9G1HdmjnFDJmGTDo5pUuyMkLRLrCbkxtXTXovRp9viM"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/LTVUtils.sol":{"keccak256":"0x6b65fe6aaa09fa6854500d15b5ae7dd198a3ed5b4c99c946663e6bbe62d698b1","urls":["bzz-raw://f3d59b410880ecbee00941c36229b6798491cb8b38c1833f5d33cb52d903c3a8","dweb:/ipfs/QmfFi9q11sMsbrVMxUoTetfH3vddiKb4qY3LdyjSnDJKat"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/LiquidityUtils.sol":{"keccak256":"0x5bd8c92995ce568ccbf46f0143474315b473787b4d683cc9d0e7d2d85ba2158e","urls":["bzz-raw://ef10c53f32b39f30b1a938a8cb2079b7a8e7627ea45379380f7085f6f7505c0b","dweb:/ipfs/QmbrfYNWpG4h2gCTBmhKNbtdyp93NxHDXGjiRaVYFs7C4V"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/Storage.sol":{"keccak256":"0x5b300bb6dd674f281bdf93283f02562bcb97be065bbf891f4b52bb6a2b63f4b6","urls":["bzz-raw://8b8949e0f1f77241c15159ac16c47d1a70bf1fbd050eaddfd9bfa280b0975527","dweb:/ipfs/QmbEkaafzdVZeaqKMNJDPMNBJTCSpDM67MSfGR5AACfEnW"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/lib/AddressUtils.sol":{"keccak256":"0xc4ce1ac0ad62cf32abd8b9b8165b5d61bcdceeb09dd5a8648d2ad2c451689453","urls":["bzz-raw://6bf478cd7e48d49157ff0396c4116e11e496ac5a71c5f37dd141718c5e6acb86","dweb:/ipfs/QmeUr5r8hkoXPYDMkfqCBknJoCRxgKYT56b8vADWf4RPrP"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/lib/ConversionHelpers.sol":{"keccak256":"0x8f271a57682c0f7d6d8e2f4af37315c270894a1aa7a8fd4268dfadb57c8274d3","urls":["bzz-raw://cc39dcb068a36dd4ca82880188c46372f09d63eb6c7534dd30097e096c9630b0","dweb:/ipfs/QmSMetVnvVyH9tu7b94wcqkVYjpYtwpjruVjE6ceyDDQrH"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/lib/ProxyUtils.sol":{"keccak256":"0xd6190456c6ee3ada01c913541eb4cb8e9606bfe55d86b852579bfce6196e609b","urls":["bzz-raw://1d4eb7e33697789fe2ad2fa5021dd63d2e65e7b6a5d64306b120acede680ff42","dweb:/ipfs/QmdEAsDDu9fNaK51pDtvu35FF2sJmt1ZvKYtszgKW6dSoU"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/lib/RPow.sol":{"keccak256":"0xb471fd40087fc710f7a53eb3b559fa446b8cdc3f866644b0d5575995cec614c2","urls":["bzz-raw://e54ae3486d6f7dcd8bc18251231836750d57e2c66e8f47836c19e2eedd9d45a8","dweb:/ipfs/QmXNUPLE42A4Eiw3wrgPVWV9Qp7buvu4nzWNVdNUQ2MHGm"],"license":"AGPL-3.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/lib/RevertBytes.sol":{"keccak256":"0xd1bbbe5f2c443deff18cde63690ea1066be5205f3a11cff0e1bba100148a5fa4","urls":["bzz-raw://7a2aafc01d8d7bfbd0aef2e33ed9c1f130e95d363b923a74d81d4cf5b101f00c","dweb:/ipfs/QmQthkn3w1gfkMqPW3RtCZ3tTh8AFfHXwi2VFas7pgqCJw"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/lib/SafeERC20Lib.sol":{"keccak256":"0x42b52132b80940b636a6ffa7a34d0a2378e47ec3640fdf27cd2656c72d343bba","urls":["bzz-raw://44d9e83a256143c89cf55fbd69d65058809fcd8dcc52824483c7aa89d4f677c9","dweb:/ipfs/QmeBmfHVcNbVfdqgFsqSP6dvQGTcQkmbf48Kq7q9NWEAbN"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/AmountCap.sol":{"keccak256":"0xcca0200f2207362a8248a3a3201779aabb3e657bc51587d890e6b80a24c15e51","urls":["bzz-raw://7504a76f12318bdd82610d423cb694ed1e1a8a3e7b651be235129a2db565da75","dweb:/ipfs/QmczmWNBo33FH2nzsQoB6FT6xd6cRHzPBZEgAZ8Jfsf1XT"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/Assets.sol":{"keccak256":"0xf9010712880d194eb4e85b1d4e410131fffa0451e1553388248d404e79f55d1f","urls":["bzz-raw://82f5f20ac28d9fea97aacd88a78b6b3631c608b61f7881e1fb1f606738cad128","dweb:/ipfs/Qmb1mmGH29dXE3AzuhVXu8gBWCYxQuFEaUzeh2qq7tN8L4"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/ConfigAmount.sol":{"keccak256":"0x7a324a3606c848af9b327c078f1cbfef0f10d0d1f76d74796ec0d5f5b1ef8e50","urls":["bzz-raw://e34d3cc285174d219676fbe00c3257ea75bd3f9d41408347d78ef8df9ccffa64","dweb:/ipfs/QmVmrhrtMyDtxAvTKfiZzzUqkPEuPR37nksKNMKuLukjwM"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/Flags.sol":{"keccak256":"0x5be65a9c99bc059baaf0ed4bc5849a108423878d7f0dbb4c92b20ff0e32c55ae","urls":["bzz-raw://b1dab07de7c66d82b305bd0139da383923ba97df28ea3b3d6b78974a4b43d376","dweb:/ipfs/QmdzHixVQbrDDhj3CHFKRAVcWtuHQNMCxxV6wHPDhNpiTG"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/LTVConfig.sol":{"keccak256":"0x6b982c951201f6cfd5372dcc3fdfcd69e8350d4f072470e712949609603603e3","urls":["bzz-raw://e5303e17a31862ca8a309e5e13337c525f854af3ecdbea3e540faa66ad711794","dweb:/ipfs/QmQ2nezdfizAyjaVnLTE8rRJh7ZoeW4o9kdfAb5QV18q4B"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/Owed.sol":{"keccak256":"0xc4ad5946088588bf95ae9504aa27840d57ca4e425625b781132b1c5e7b41a4db","urls":["bzz-raw://951df5b6b6152a4ccfdda72488132884a6c588940419011ac78f4c99eb94a63a","dweb:/ipfs/QmQzCfVoC2SCh1eAwygiGo64grmCPmtyDKrcqsMCNC6vo6"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/Shares.sol":{"keccak256":"0xdf8079de1d68cef14f3991e306e10c44524bc4c84e603c988574893ab8017b7a","urls":["bzz-raw://6a4ccf3e71173fbbc558ba0e3ad833863f0f480ad8d0b2e2ee090677ebb8ce1e","dweb:/ipfs/QmbNcj87DnDHwqy1B7wxZnXSXjCDe4vV1xMXLiEqQT96Kc"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/Snapshot.sol":{"keccak256":"0x6dab8d29ea25d03e24e64c6d533d76cf27dcc6f890233950caed6b6bf70e5cf7","urls":["bzz-raw://553a80ec7a64e83f85a830501b2d74b529871cda53189fcec01a42b2a04871d1","dweb:/ipfs/QmcLFwccG1PJ5A7bVatFBgwzvwTLTFXzkqxfPZjwWqAmSt"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/Types.sol":{"keccak256":"0xd72e1411c41b39a6f6e24ea97fe5eb590ec6e157ee7e5ad460181a3c915eb5b5","urls":["bzz-raw://b63f3218ca7fa2e8f4ad251d58f36e62d2f2cea4ea6b3881d9e8b10efa06947e","dweb:/ipfs/Qmac4Rh1qoAVbAUFAvKz5dyHKXTMG5gSNWKq89BUdToYd1"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/UserStorage.sol":{"keccak256":"0x5df5ffd48a87efe5b1caaf4d7d0c38fc620c3484031e91d1c4263064251980ef","urls":["bzz-raw://3f937c133ee8fb4d2c2ba7f0d153ce219751e4db2bd53de69f0015601eeafe16","dweb:/ipfs/QmTzhuxThBzfa7Q3u1pguJUBBLCUsvKjgc6MdVvRFrV7yX"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/VaultCache.sol":{"keccak256":"0xd0edea1589280112d224de0273a2e06f19bc1b76e170143a3214ce8a71684f90","urls":["bzz-raw://2a9135ba748414edb60e181a189ef7467e2ec1a44e938071f2e60a1ae61f147b","dweb:/ipfs/QmRvPaYs7PAW8v1Z4WxRpDWJqMiJgRbX3n4oN1TP1JDXEx"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/EVault/shared/types/VaultStorage.sol":{"keccak256":"0x45b9738b8e34d4e97d55b4af04e7e73aa2278206aedfeec7725e3743ccfba661","urls":["bzz-raw://d44342349aee41392051063be80ebc2115946610ce08330ea77dfbc2d46d9187","dweb:/ipfs/QmUekMwWev6czRWjKiiybqLKJJQE9FBgwKkxkGLkpG8dYJ"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/InterestRateModels/IIRM.sol":{"keccak256":"0x9e8636dfb4e9053e8ea935f6bc22faa72d17a61cfb0761ebcdb0ac2d9aa16214","urls":["bzz-raw://a82f1d12a6134a247be36817f33b826fcf74ba1ccdebc720677def1ffee2eb5b","dweb:/ipfs/QmRMA1zZz1gaTFbfwBUVxsYaVd75kjrG92kqEJ2cpVXiJn"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/ProtocolConfig/IProtocolConfig.sol":{"keccak256":"0x9c8772332de7b47cd451bca15106ca4355a12d5124bcefe8e2d12df96fe0d4b2","urls":["bzz-raw://71d21806b7a7cfdaf26f15aa60b6438b47abe614329f1a23f466c5ac54e5e0e3","dweb:/ipfs/QmQASzJD1MBr1uNB1katLJYbFQXALU3X6wLJvdQJbXwfLv"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/interfaces/IBalanceTracker.sol":{"keccak256":"0xce8bd7df42d4ea27cbef3ca1b067c77e5a2f1da4ecae58ad4597c9577a254d45","urls":["bzz-raw://b350e342d2e80390b13b117bbca9503c90b075013e9e27130f30786426109aa0","dweb:/ipfs/QmWznuHbMgDLStYpwAnzKne6yQigrPTdjp1yejY26qM6qv"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/interfaces/IFlashLoan.sol":{"keccak256":"0x1a2ec7da850f870d7631c92befb0f027ee76764c2c45a380823b81ea4e3f3710","urls":["bzz-raw://d3e2b33a32ed82d35b76b3d5ea63a520faaf8c11a94f195798d6427053b81a81","dweb:/ipfs/QmeL4HaB7kafAfcBXzi5zWUegp7CTqsqtxYDKUrvQVcd3Z"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/interfaces/IHookTarget.sol":{"keccak256":"0xd8d4342fbd185e1cd14321597a2962b141d3f6f4769c25fe483c9765565dba37","urls":["bzz-raw://7c686e5585fb3715857d4c64f07fea97a2ee7fa855fada3e0c62a36c62b1273c","dweb:/ipfs/Qma4ecAsSraF9ofWVeZ3WMaDp7my4L7m3KLDooQWWsdTg2"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/interfaces/IPermit2.sol":{"keccak256":"0x8912bf9dc4aa7dab8013f1168c06023c95d8b9128015fec04a38442fd3b2310c","urls":["bzz-raw://0de039b3b5056e95349b04ddc59ef2827a56d41493cf4e0b511ad1148eebe73f","dweb:/ipfs/QmWZRJXL2omhdtnEZ87zR5u8vMDjq84uNKHNGZ2R4Nmq4r"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/interfaces/IPriceOracle.sol":{"keccak256":"0x02de3d909198483870304a8ab528773e4f4e00e63e88beef403dbb0f2f0ca17a","urls":["bzz-raw://538e5d523e49c7dfc8af365b207ec9adb8c19ab183d9cf7194dbe3e0feb0b832","dweb:/ipfs/QmWp7EqG5xeGD9BLbz2s5xuq8x5GnXeP9fdr5uf1iAp8oc"],"license":"GPL-2.0-or-later"},"lib/euler-vault-kit/src/interfaces/ISequenceRegistry.sol":{"keccak256":"0x0b1d69979db5e6b3418a95bd4ddead8d8f1af5fb68b3f666d6da9f0b0121b312","urls":["bzz-raw://02b1e2d5edbd6eed07b4e5cb2cd76f4ef95050a18221e69261b7cadc75a65a19","dweb:/ipfs/QmXRpmQ7D4hGV6ca9WCXAAtABn3rw354W5csnWh68RskkD"],"license":"GPL-2.0-or-later"}},"version":1},"id":71} \ No newline at end of file diff --git a/contracts/EthereumVaultConnector.json b/contracts/EthereumVaultConnector.json new file mode 100644 index 0000000..3cbca80 --- /dev/null +++ b/contracts/EthereumVaultConnector.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"areChecksDeferred","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"areChecksInProgress","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"batch","inputs":[{"name":"items","type":"tuple[]","internalType":"struct IEVC.BatchItem[]","components":[{"name":"targetContract","type":"address","internalType":"address"},{"name":"onBehalfOfAccount","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"batchRevert","inputs":[{"name":"items","type":"tuple[]","internalType":"struct IEVC.BatchItem[]","components":[{"name":"targetContract","type":"address","internalType":"address"},{"name":"onBehalfOfAccount","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"batchSimulation","inputs":[{"name":"items","type":"tuple[]","internalType":"struct IEVC.BatchItem[]","components":[{"name":"targetContract","type":"address","internalType":"address"},{"name":"onBehalfOfAccount","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"batchItemsResult","type":"tuple[]","internalType":"struct IEVC.BatchItemResult[]","components":[{"name":"success","type":"bool","internalType":"bool"},{"name":"result","type":"bytes","internalType":"bytes"}]},{"name":"accountsStatusCheckResult","type":"tuple[]","internalType":"struct IEVC.StatusCheckResult[]","components":[{"name":"checkedAddress","type":"address","internalType":"address"},{"name":"isValid","type":"bool","internalType":"bool"},{"name":"result","type":"bytes","internalType":"bytes"}]},{"name":"vaultsStatusCheckResult","type":"tuple[]","internalType":"struct IEVC.StatusCheckResult[]","components":[{"name":"checkedAddress","type":"address","internalType":"address"},{"name":"isValid","type":"bool","internalType":"bool"},{"name":"result","type":"bytes","internalType":"bytes"}]}],"stateMutability":"payable"},{"type":"function","name":"call","inputs":[{"name":"targetContract","type":"address","internalType":"address"},{"name":"onBehalfOfAccount","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"result","type":"bytes","internalType":"bytes"}],"stateMutability":"payable"},{"type":"function","name":"controlCollateral","inputs":[{"name":"targetCollateral","type":"address","internalType":"address"},{"name":"onBehalfOfAccount","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"result","type":"bytes","internalType":"bytes"}],"stateMutability":"payable"},{"type":"function","name":"disableCollateral","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"vault","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"disableController","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"enableCollateral","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"vault","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"enableController","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"vault","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"forgiveAccountStatusCheck","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"forgiveVaultStatusCheck","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"getAccountOwner","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getAddressPrefix","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bytes19","internalType":"bytes19"}],"stateMutability":"pure"},{"type":"function","name":"getCollaterals","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getControllers","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"getCurrentOnBehalfOfAccount","inputs":[{"name":"controllerToCheck","type":"address","internalType":"address"}],"outputs":[{"name":"onBehalfOfAccount","type":"address","internalType":"address"},{"name":"controllerEnabled","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getLastAccountStatusCheckTimestamp","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"},{"name":"nonceNamespace","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getOperator","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRawExecutionContext","inputs":[],"outputs":[{"name":"context","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"haveCommonOwner","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"otherAccount","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"isAccountOperatorAuthorized","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isAccountStatusCheckDeferred","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isCollateralEnabled","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"vault","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isControlCollateralInProgress","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isControllerEnabled","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"vault","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isLockdownMode","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isOperatorAuthenticated","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isPermitDisabledMode","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isSimulationInProgress","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isVaultStatusCheckDeferred","inputs":[{"name":"vault","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"permit","inputs":[{"name":"signer","type":"address","internalType":"address"},{"name":"sender","type":"address","internalType":"address"},{"name":"nonceNamespace","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"value","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"reorderCollaterals","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"index1","type":"uint8","internalType":"uint8"},{"name":"index2","type":"uint8","internalType":"uint8"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"requireAccountAndVaultStatusCheck","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"requireAccountStatusCheck","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"requireVaultStatusCheck","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setAccountOperator","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"},{"name":"authorized","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setLockdownMode","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"},{"name":"enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setNonce","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"},{"name":"nonceNamespace","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setOperator","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"},{"name":"operator","type":"address","internalType":"address"},{"name":"operatorBitField","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setPermitDisabledMode","inputs":[{"name":"addressPrefix","type":"bytes19","internalType":"bytes19"},{"name":"enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AccountStatusCheck","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"controller","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"CallWithContext","inputs":[{"name":"caller","type":"address","indexed":true,"internalType":"address"},{"name":"onBehalfOfAddressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"onBehalfOfAccount","type":"address","indexed":false,"internalType":"address"},{"name":"targetContract","type":"address","indexed":true,"internalType":"address"},{"name":"selector","type":"bytes4","indexed":false,"internalType":"bytes4"}],"anonymous":false},{"type":"event","name":"CollateralStatus","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"collateral","type":"address","indexed":true,"internalType":"address"},{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"ControllerStatus","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"controller","type":"address","indexed":true,"internalType":"address"},{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"LockdownModeStatus","inputs":[{"name":"addressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"NonceStatus","inputs":[{"name":"addressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"nonceNamespace","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldNonce","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newNonce","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NonceUsed","inputs":[{"name":"addressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"nonceNamespace","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"nonce","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorStatus","inputs":[{"name":"addressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"accountOperatorAuthorized","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnerRegistered","inputs":[{"name":"addressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"owner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PermitDisabledModeStatus","inputs":[{"name":"addressPrefix","type":"bytes19","indexed":true,"internalType":"bytes19"},{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"VaultStatusCheck","inputs":[{"name":"vault","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"EVC_BatchPanic","inputs":[]},{"type":"error","name":"EVC_ChecksReentrancy","inputs":[]},{"type":"error","name":"EVC_ControlCollateralReentrancy","inputs":[]},{"type":"error","name":"EVC_ControllerViolation","inputs":[]},{"type":"error","name":"EVC_EmptyError","inputs":[]},{"type":"error","name":"EVC_InvalidAddress","inputs":[]},{"type":"error","name":"EVC_InvalidData","inputs":[]},{"type":"error","name":"EVC_InvalidNonce","inputs":[]},{"type":"error","name":"EVC_InvalidOperatorStatus","inputs":[]},{"type":"error","name":"EVC_InvalidTimestamp","inputs":[]},{"type":"error","name":"EVC_InvalidValue","inputs":[]},{"type":"error","name":"EVC_LockdownMode","inputs":[]},{"type":"error","name":"EVC_NotAuthorized","inputs":[]},{"type":"error","name":"EVC_OnBehalfOfAccountNotAuthenticated","inputs":[]},{"type":"error","name":"EVC_PermitDisabledMode","inputs":[]},{"type":"error","name":"EVC_RevertedBatchResult","inputs":[{"name":"batchItemsResult","type":"tuple[]","internalType":"struct IEVC.BatchItemResult[]","components":[{"name":"success","type":"bool","internalType":"bool"},{"name":"result","type":"bytes","internalType":"bytes"}]},{"name":"accountsStatusResult","type":"tuple[]","internalType":"struct IEVC.StatusCheckResult[]","components":[{"name":"checkedAddress","type":"address","internalType":"address"},{"name":"isValid","type":"bool","internalType":"bool"},{"name":"result","type":"bytes","internalType":"bytes"}]},{"name":"vaultsStatusResult","type":"tuple[]","internalType":"struct IEVC.StatusCheckResult[]","components":[{"name":"checkedAddress","type":"address","internalType":"address"},{"name":"isValid","type":"bool","internalType":"bool"},{"name":"result","type":"bytes","internalType":"bytes"}]}]},{"type":"error","name":"EVC_SimulationBatchNested","inputs":[]},{"type":"error","name":"InvalidIndex","inputs":[]},{"type":"error","name":"TooManyElements","inputs":[]}],"bytecode":{"object":"0x60c060405234801562000010575f80fd5b50600160c81b5f55620000246001620000e2565b62000030600c620000e2565b466080818152604080518082018252601881527f457468657265756d205661756c7420436f6e6e6563746f72000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f040f0adc9d57e8bea9a4602b7065ad7261f63d709e7be772afe0ceb20a92d47381840152606081019490945230848401528151808503909301835260a09093019052805191012060a05262000162565b80546001600160f81b0316600160f81b17815560015b600a8110156200014a57600182810182600a81106200011b576200011b6200014e565b0180546001600160601b0392909216600160a01b026001600160a01b03909216919091179055600101620000f8565b5050565b634e487b7160e01b5f52603260045260245ffd5b60805160a0516155e5620001845f395f61347c01525f6133a901526155e55ff3fe6080604052600436106102da575f3560e01c8063863789d71161017b578063c368516c116100d1578063df7c138411610087578063ebf1ea8611610062578063ebf1ea8614610915578063f4fc35701461091d578063fd6046d714610930575f80fd5b8063df7c1384146108b6578063e21e537c146108d5578063e920e8e014610902575f80fd5b8063cb29955a116100b7578063cb29955a1461082d578063cdd8ea7814610884578063d44fee5a146108a3575f80fd5b8063c368516c146107fb578063c760d9211461080e575f80fd5b8063a4d25d1e11610131578063b9b70ff51161010c578063b9b70ff5146107c2578063c14c11bf146107d5578063c16ae7a4146107e8575f80fd5b8063a4d25d1e14610730578063a829aaf51461075c578063b03c130d1461076f575f80fd5b80639e716d58116101615780639e716d58146106f65780639f5c462a14610715578063a37d54af14610728575f80fd5b8063863789d71461069857806392d2fc01146106c6575f80fd5b80633b2416be1161023057806347cfdac4116101e6578063642ea23f116101c1578063642ea23f146106505780637f17c377146106635780637f5c92f314610685575f80fd5b806347cfdac4146105e0578063506d8c92146105ff5780635bedd1cd1461063d575f80fd5b8063430292b311610216578063430292b314610542578063442b172c1461056e57806346591032146105cd575f80fd5b80633b2416be146104f457806342e5349914610523575f80fd5b80631647292a1161029057806330f316671161026b57806330f31667146104785780633a1a3a1d1461048b5780633b10f3ef1461049e575f80fd5b80631647292a146103f857806318503a1e146104275780631f8b521514610465575f80fd5b8063116d0e93116102c0578063116d0e93146103a5578063129d21a0146103b857806312d6c936146103cb575f80fd5b806306fdde031461033457806310a7519814610392575f80fd5b36610330575f5474ff00000000000000000000000000000000000000001661032e576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b34801561033f575f80fd5b5061037c6040518060400160405280601881526020017f457468657265756d205661756c7420436f6e6e6563746f72000000000000000081525081565b60405161038991906148e3565b60405180910390f35b61032e6103a0366004614909565b61094f565b61032e6103b336600461494e565b610aaa565b61032e6103c636600461494e565b610bfd565b3480156103d6575f80fd5b506103ea6103e5366004614983565b610d49565b604051908152602001610389565b348015610403575f80fd5b506104176104123660046149ab565b610d7a565b6040519015158152602001610389565b348015610432575f80fd5b50610446610441366004614909565b610d8c565b604080516001600160a01b039093168352901515602083015201610389565b61037c610473366004614a1c565b610e1f565b61032e610486366004614909565b610f17565b348015610496575f80fd5b505f546103ea565b3480156104a9575f80fd5b506104176104b8366004614a8a565b6cffffffffffffffffffffffffff19165f9081526017602052604090205474010000000000000000000000000000000000000000900460ff1690565b3480156104ff575f80fd5b505f5477ff0000000000000000000000000000000000000000000000161515610417565b34801561052e575f80fd5b5061041761053d366004614909565b610f65565b34801561054d575f80fd5b505f5474ff0000000000000000000000000000000000000000161515610417565b348015610579575f80fd5b506105b5610588366004614909565b60601b6cffffffffffffffffffffffffff19165f908152601760205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610389565b61032e6105db366004614909565b610fca565b3480156105eb575f80fd5b506104176105fa3660046149ab565b610ffc565b34801561060a575f80fd5b5061061e610619366004614909565b61101d565b6040516cffffffffffffffffffffffffff199091168152602001610389565b61032e61064b366004614aa3565b611038565b61032e61065e366004614b6a565b611488565b610676610671366004614bac565b61156b565b60405161038993929190614c9c565b61032e610693366004614bac565b61171c565b3480156106a3575f80fd5b505f5476ff00000000000000000000000000000000000000000000161515610417565b3480156106d1575f80fd5b505f5478ff000000000000000000000000000000000000000000000000161515610417565b348015610701575f80fd5b506104176107103660046149ab565b6119d1565b61032e610723366004614d4f565b6119f2565b61032e611c11565b34801561073b575f80fd5b5061074f61074a366004614909565b611c45565b6040516103899190614dda565b61032e61076a366004614dec565b611c68565b34801561077a575f80fd5b506103ea610789366004614e1c565b6cffffffffffffffffffffffffff1982165f9081526018602090815260408083206001600160a01b038516845290915290205492915050565b61037c6107d0366004614a1c565b611d45565b61032e6107e3366004614e36565b611f3b565b61032e6107f6366004614bac565b612076565b61032e6108093660046149ab565b6121c8565b348015610819575f80fd5b506104176108283660046149ab565b61233c565b348015610838575f80fd5b50610417610847366004614a8a565b6cffffffffffffffffffffffffff19165f908152601760205260409020547501000000000000000000000000000000000000000000900460ff1690565b34801561088f575f80fd5b5061041761089e366004614909565b612349565b61032e6108b13660046149ab565b6123a6565b3480156108c1575f80fd5b506103ea6108d0366004614909565b612508565b3480156108e0575f80fd5b505f5475ff000000000000000000000000000000000000000000161515610417565b61032e6109103660046149ab565b61259a565b61032e6126b9565b61032e61092b366004614909565b61273f565b34801561093b575f80fd5b5061074f61094a366004614909565b612853565b5f5475ff0000000000000000000000000000000000000000008116156109a1576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f05f75ff00000000000000000000000000000000000000000083175b7fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161790565b5f9081556001600160a01b038084168252601b602052604090912054839160ff82169161010090041660018214610a53576040517ff1be451900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381163314610a95576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50610aa39050600184612876565b50505f5550565b81610ab6815f80612cf1565b506cffffffffffffffffffffffffff1983165f9081526017602052604090205460ff750100000000000000000000000000000000000000000090910416151582151514610bf85781158015610b2257505f5474ff00000000000000000000000000000000000000001615155b15610b59576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1983165f818152601760205260409081902080548515157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909116179055517f6321df4e44267d425279195e7488fadba1a42d5cce9e84f596d5cf696f4449cd90610bef90851515815260200190565b60405180910390a25b505050565b81610c09815f80612cf1565b506cffffffffffffffffffffffffff1983165f9081526017602052604090205460ff7401000000000000000000000000000000000000000090910416151582151514610bf85781158015610c7d57505f5474ff000000000000000000000000000000000000000016151580610c7d57503330145b15610cb4576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1983165f8181526017602052604090819020805485151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909116179055517faf5120bc58372f0063d8362c9bba9070c462c07ae24c24082d080a426432798b90610bef90851515815260200190565b6cffffffffffffffffffffffffff1982165f9081526019602090815260408083208484529091529020545b92915050565b5f610d858383612d54565b9392505050565b5f80610d9f5f546001600160a01b031690565b91506001600160a01b038216610de1576040517f5217b8ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831615610e16576001600160a01b0382165f908152601b60205260409020610e119084612ddd565b610e18565b5f5b9050915091565b5f5460609075ff000000000000000000000000000000000000000000811615610e74576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615610ec5576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f5474ff000000000000000000000000000000000000000081175f908155610ef18888888888612e81565b9350905080610f0357610f0383612fa2565b610f0c82612fe3565b505095945050505050565b5f5474ff00000000000000000000000000000000000000001615610f5057610f4060018261303c565b50610f4c600c3361303c565b5050565b610f59816132a2565b610f6233613326565b50565b5f805475ff0000000000000000000000000000000000000000001615610fb7576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc2600183612ddd565b90505b919050565b5f5474ff00000000000000000000000000000000000000001615610ff357610f4c60018261303c565b610f62816132a2565b6001600160a01b0382165f908152601b60205260408120610d859083612ddd565b5f606082901b6cffffffffffffffffffffffffff1916610fc2565b5f5475ff00000000000000000000000000000000000000000081161561108a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff000000000000000000000000000000000000000000008116156110db576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b503330148061110657506001600160a01b0389161580159061110657506001600160a01b0389163314155b1561113d576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038a16158061115c575061115a8a610100111590565b155b15611193576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608a901b6cffffffffffffffffffffffffff19165f818152601760205260409020547501000000000000000000000000000000000000000000900460ff1615611209576040517f4426359200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1981165f9081526019602090815260408083208c84529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114806112615750888114155b15611298576040517fa82b84bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50428710156112d3576040517f7c9bb1cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84900361130d576040517fe85c620e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61131e8c8c8c8c8c8c8c8c6133a5565b905061135f8185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061357f92505050565b6001600160a01b03168c6001600160a01b0316141580156113bd57506113bb8c8286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061363992505050565b155b156113f4576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1982165f8181526019602090815260408083208e845282529182902060018d01905590518b81528c92917fb0dcec731e48090736be6db10ad9f9581d0ec5fc0f1925a8e267b64b614b08d6910160405180910390a35f80611466308f8b8b8b61376e565b91509150816114785761147881612fa2565b5050505050505050505050505050565b5f5475ff0000000000000000000000000000000000000000008116156114da576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff0000000000000000000000000000000000000000000081161561152b576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5082611539816001806139d4565b506001600160a01b0384165f908152601a6020526040902061155c908484613bd0565b61156584610fca565b50505050565b60608060605f80306001600160a01b0316306001600160a01b0316637f5c92f3898960405160240161159e929190614e9b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e09490941b9390931790925290516115eb9250614fe7565b5f60405180830381855af49150503d805f8114611623576040519150601f19603f3d011682016040523d82523d5f602084013e611628565b606091505b50915091508115611665576040517f4cd2d4f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004815110806116bf57507fd4b0e4d30000000000000000000000000000000000000000000000000000000061169a82615002565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156116cd576116cd81612fa2565b80517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8101600483019081529161170c91810160200190602401615269565b9199909850909650945050505050565b5f5475ff00000000000000000000000000000000000000000081161561176e576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff000000000000000000000000000000000000000000008116156117bf576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f546060908190819074ff0000000000000000000000000000000000000000811615611818576040517fb83566c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b78ff000000ff000000000000000000000000000000000000000081175f55848067ffffffffffffffff8111156118505761185061504d565b60405190808252806020026020018201604052801561189557816020015b604080518082019091525f81526060602082015281526020019060019003908161186e5790505b5094505f5b8181101561194d57368888838181106118b5576118b561539c565b90506020028101906118c791906153c9565b90506119006118d96020830183614909565b6118e96040840160208501614909565b60408401356118fb60608601866153fb565b612e81565b8884815181106119125761191261539c565b60200260200101515f0189858151811061192e5761192e61539c565b602090810291909101810151019190915290151590525060010161189a565b506119705f75ff00000000000000000000000000000000000000000084176109bf565b5f90815561197d90613d9b565b93506119896001613d9b565b5f8390556040517fd4b0e4d30000000000000000000000000000000000000000000000000000000081529093506119c890869086908690600401614c9c565b60405180910390fd5b6001600160a01b0382165f908152601a60205260408120610d859083612ddd565b5f6119ff8460015f6139d4565b90506cffffffffffffffffffffffffff19606085901b165f61010086841810611a4f576cffffffffffffffffffffffffff1982165f908152601760205260409020546001600160a01b0316611a51565b825b9050826001600160a01b0316816001600160a01b031614158015611a875750826001600160a01b0316856001600160a01b031614155b15611abe576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516301480611ad85750610100858218105b15611b0f576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1982165f9081526018602090815260408083206001600160a01b038981168552925282205460018985189092169190911b9186611b5d5782198216611b61565b8282175b9050808203611b9c576040517f655156bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1985165f8181526018602090815260408083206001600160a01b038d1680855290835292819020859055518481529192917f7ba31654d8467e98b6bd4fc56ddde246de9ade831cf860c7ac695579aecb9564910160405180910390a3505050505050505050565b5f5474ff00000000000000000000000000000000000000001615611c3a57610f62600c3361303c565b611c4333613326565b565b6001600160a01b0381165f908152601a60205260409020606090610fc290613edb565b82611c74815f80612cf1565b506cffffffffffffffffffffffffff1984165f908152601960209081526040808320868452909152902054828110611cd8576040517fa82b84bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1985165f81815260196020908152604080832088845282529182902086905581518481529081018690528692917f3b8510174a91acb36200f7427c1889f934941fd89ed86faf390749b4c2b46337910160405180910390a35050505050565b5f5460609075ff000000000000000000000000000000000000000000811615611d9a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615611deb576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038086165f908152601b6020526040902054869160ff82169161010090041660018214611e4c576040517ff1be451900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381163314611e8e576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506001600160a01b0386165f908152601a60205260409020611eb19088612ddd565b611ee7576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5476ff00ff000000000000000000000000000000000000000081175f908155611f14898989898961376e565b9450905080611f2657611f2684612fa2565b611f2f82612fe3565b50505095945050505050565b5f611f47845f80612cf1565b90506001600160a01b038316301480611f635750610100838218105b15611f9a576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1984165f9081526018602090815260408083206001600160a01b0387168452909152902054829003612006576040517f655156bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1984165f8181526018602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f7ba31654d8467e98b6bd4fc56ddde246de9ade831cf860c7ac695579aecb9564910160405180910390a350505050565b5f5475ff0000000000000000000000000000000000000000008116156120c8576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615612119576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f5474ff000000000000000000000000000000000000000081175f90815582905b818110156121be57368585838181106121565761215661539c565b905060200281019061216891906153c9565b90505f8061219e61217c6020850185614909565b61218c6040860160208701614909565b60408601356118fb60608801886153fb565b91509150816121b0576121b081612fa2565b50505080600101905061213b565b5061156582612fe3565b5f5475ff00000000000000000000000000000000000000000081161561221a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff0000000000000000000000000000000000000000000081161561226b576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081612279816001806139d4565b50306001600160a01b038316036122bc576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383165f908152601b602052604090206122dd908361303c565b1561233357816001600160a01b0316836001600160a01b03167f9919d437ee612d4ec7bba88a7d9bc4fc36a0a23608ad6259252711a46b708af9600160405161232a911515815260200190565b60405180910390a35b610bf883610fca565b5f61010082841810610d85565b5f805475ff000000000000000000000000000000000000000000161561239b576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc2600c83612ddd565b5f5475ff0000000000000000000000000000000000000000008116156123f8576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615612449576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081612457816001806139d4565b50306001600160a01b0383160361249a576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383165f908152601a602052604090206124bb908361303c565b1561233357816001600160a01b0316836001600160a01b03167ff022705c827017c972043d1984cfddc7958c9f4685b4d9ce8bd68696f4381cd2600160405161232a911515815260200190565b5f805475ff000000000000000000000000000000000000000000161561255a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03165f908152601b60205260409020547501000000000000000000000000000000000000000000900469ffffffffffffffffffff1690565b5f5475ff0000000000000000000000000000000000000000008116156125ec576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff0000000000000000000000000000000000000000000081161561263d576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508161264b816001806139d4565b506001600160a01b0383165f908152601a6020526040902061266d9083612876565b1561233357816001600160a01b0316836001600160a01b03167ff022705c827017c972043d1984cfddc7958c9f4685b4d9ce8bd68696f4381cd25f60405161232a911515815260200190565b5f5475ff00000000000000000000000000000000000000000081161561270b576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61272d5f75ff00000000000000000000000000000000000000000083176109bf565b5f5561273a600c33612876565b505f55565b5f5475ff000000000000000000000000000000000000000000811615612791576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff000000000000000000000000000000000000000000008116156127e2576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b0381165f908152601b602052604090206128049033612876565b1561284a576040515f815233906001600160a01b038316907f9919d437ee612d4ec7bba88a7d9bc4fc36a0a23608ad6259252711a46b708af99060200160405180910390a35b610f6281610fca565b6001600160a01b0381165f908152601b60205260409020606090610fc290613edb565b81545f9061010081046001600160a01b03169060ff8116907501000000000000000000000000000000000000000000900469ffffffffffffffffffff168184036128c5575f9350505050610d74565b5f856001600160a01b0316846001600160a01b031614612935575060015b8281101561292257856001600160a01b03168760010182600a811061290a5761290a61539c565b01546001600160a01b031614612922576001016128e3565b828103612935575f945050505050610d74565b826001036129b557507effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff909116750100000000000000000000000000000000000000000002167f01000000000000000000000000000000000000000000000000000000000000001785555060019150610d749050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83015f6001890182600a81106129ee576129ee61539c565b019050818314612bf257825f03612ad457805489547f010000000000000000000000000000000000000000000000000000000000000060ff85167fff000000000000000000000000000000000000000000000000000000000000009092166101006001600160a01b03909416939093027fff00000000000000000000ffffffffffffffffffffffffffffffffffffffff00169290921717750100000000000000000000000000000000000000000069ffffffffffffffffffff871602177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16178955612cbd565b80546001600160a01b031660018a0184600a8110612af457612af461539c565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905589547f010000000000000000000000000000000000000000000000000000000000000060ff85167fff00000000000000000000000000000000000000000000000000000000000000909216610100938a16939093027fff00000000000000000000ffffffffffffffffffffffffffffffffffffffff00169290921717750100000000000000000000000000000000000000000069ffffffffffffffffffff871602177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16178955612cbd565b88547f010000000000000000000000000000000000000000000000000000000000000060ff84167fff000000000000000000000000000000000000000000000000000000000000009092166101006001600160a01b038a16027fff00000000000000000000ffffffffffffffffffffffffffffffffffffffff00161791909117750100000000000000000000000000000000000000000069ffffffffffffffffffff871602177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff161789555b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055506001979650505050505050565b6cffffffffffffffffffffffffff1983165f908152601760205260408120546001600160a01b0316612d4b8115612d285781612d44565b73ffffffffffffffffffffffffffffffffffffff00606087901c165b85856139d4565b95945050505050565b6cffffffffffffffffffffffffff19606083901b165f818152601760205260408120549091906001600160a01b031680612d92575f92505050610d74565b6cffffffffffffffffffffffffff19919091165f9081526018602090815260408083206001600160a01b0396871684529091529020546001949091189092169290921b161515919050565b81545f906001600160a01b036101008204169060ff16808303612e04575f92505050610d74565b836001600160a01b0316826001600160a01b031603612e2857600192505050610d74565b60015b81811015612e7657846001600160a01b03168660010182600a8110612e5257612e5261539c565b01546001600160a01b031603612e6e5760019350505050610d74565b600101612e2b565b505f95945050505050565b5f6060306001600160a01b03881603612f67576001600160a01b03861615612ed5576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8415612f0d576040517fbb6de1c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040513090612f1f908690869061545c565b5f60405180830381855af49150503d805f8114612f57576040519150601f19603f3d011682016040523d82523d5f602084013e612f5c565b606091505b509092509050612f98565b6001600160a01b0387163314612f8557612f83866001806139d4565b505b612f92878787878761376e565b90925090505b9550959350505050565b805115612fb157805181602001fd5b6040517f38ae747c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b74ff00000000000000000000000000000000000000008116613038576130215f75ff00000000000000000000000000000000000000000083176109bf565b5f90815561302e90613fdd565b6130386001613fdd565b5f55565b81545f9061010081046001600160a01b03169060ff8116907501000000000000000000000000000000000000000000900469ffffffffffffffffffff168184036131505785547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff9092167501000000000000000000000000000000000000000000029190911674ffffffffffffffffffffffffffffffffffffffffff6001600160a01b038716610100027fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600190811792909216177f01000000000000000000000000000000000000000000000000000000000000001786559250610d74915050565b846001600160a01b0316836001600160a01b031603613174575f9350505050610d74565b60015b828110156131c257856001600160a01b03168760010182600a811061319e5761319e61539c565b01546001600160a01b0316036131ba575f945050505050610d74565b600101613177565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6820161321c576040517f3572cf8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848660010183600a81106132325761323261539c565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555084547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600191820160ff1617909455509192915050565b5f5475ff0000000000000000000000000000000000000000008116156132f4576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133165f75ff00000000000000000000000000000000000000000083176109bf565b5f556133218261400f565b5f5550565b5f5475ff000000000000000000000000000000000000000000811615613378576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61339a5f75ff00000000000000000000000000000000000000000083176109bf565b5f556133218261402c565b5f807f0000000000000000000000000000000000000000000000000000000000000000461461347a57604080518082018252601881527f457468657265756d205661756c7420436f6e6e6563746f72000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f040f0adc9d57e8bea9a4602b7065ad7261f63d709e7be772afe0ceb20a92d47381840152466060820152306080808301919091528351808303909101815260a0909101909252815191012061349c565b7f00000000000000000000000000000000000000000000000000000000000000005b90505f7f4ae56dd541cf527f212121ebe3756a7631631f85f66a3073e982c01a6e2ecbf28b8b8b8b8b8b8b8b6040516134d692919061545c565b6040805191829003822060208301999099526001600160a01b0397881690820152959094166060860152608085019290925260a084015260c083015260e0820152610100810191909152610120016040516020818303038152906040528051906020012090507f19010000000000000000000000000000000000000000000000000000000000005f52816002528060225260425f2092505f602252505098975050505050505050565b5f815160411461359057505f610d74565b6020820151604083015160608401515f1a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156135d4575f9350505050610d74565b604080515f81526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015613624573d5f803e3d5ffd5b5050604051601f190151979650505050505050565b5f836001600160a01b03163b5f0361365257505f610d85565b5f80856001600160a01b0316858560405160240161367192919061546b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1626ba7e00000000000000000000000000000000000000000000000000000000179052516136d49190614fe7565b5f60405180830381855afa9150503d805f811461370c576040519150601f19603f3d011682016040523d82523d5f602084013e613711565b606091505b5091509150818015613724575080516020145b8015613764575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906137629083016020908101908401615483565b145b9695505050505050565b5f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85036137a0574794506137da565b478511156137da576040517fbb6de1c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8054906137e6614037565b9050610100888218108061380257506001600160a01b03891633145b8061381557506001600160a01b03891630145b80613838575076ff00000000000000000000000000000000000000000000821615155b15613872577fffffffffffffffff00ffffff000000000000000000000000000000000000000082166001600160a01b038916175f556138bd565b77ff00000000000000000000000000000000000000000000006001600160a01b0389167fffffffffffffffffffffffff0000000000000000000000000000000000000000841617175f555b6001600160a01b038916606089901b6cffffffffffffffffffffffffff19166cffffffffffffffffffffffffff19166001600160a01b0383167f6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec8b6139228a8c61549a565b604080516001600160a01b0390931683527fffffffff0000000000000000000000000000000000000000000000000000000090911660208301520160405180910390a4886001600160a01b031687878760405161398092919061545c565b5f6040518083038185875af1925050503d805f81146139ba576040519150601f19603f3d011682016040523d82523d5f602084013e6139bf565b606091505b505f9390935599919850909650505050505050565b606083901b6cffffffffffffffffffffffffff19165f818152601760205260408120549091906001600160a01b0381169074010000000000000000000000000000000000000000900460ff1683613a29614037565b90505f6101008983181015613aeb576001600160a01b038416613ace576cffffffffffffffffffffffffff1985165f8181526017602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038716908117909155905194965086949092917f67cb2734834e775d6db886bf16ac03d7273b290223ee5363354b385ec5b643b091a3506001613aeb565b816001600160a01b0316846001600160a01b031603613aeb575060015b80158015613af65750875b8015613b075750613b078983612d54565b15613b10575060015b808015613b2f5750886001600160a01b0316846001600160a01b031614155b8015613b4457506001600160a01b0389163b15155b15613b4c57505f5b80613b83576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868015613b8d5750825b15613bc4576040517fd80a9cac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50979650505050505050565b82546001600160a01b036101008204169060ff90811690838116908516101580613bfd5750808360ff1610155b15613c34576040517f63df817100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360ff165f03613cce57846001018360ff16600a8110613c5657613c5661539c565b01546001600160a01b03168286600181810160ff8816600a8110613c7c57613c7c61539c565b0180546001600160a01b039485167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905581549383166101009190910a908102920219909216179055613d94565b846001018360ff16600a8110613ce657613ce661539c565b01546001600160a01b03166001860160ff8616600a8110613d0957613d0961539c565b01546001600160a01b03166001870160ff8716600a8110613d2c57613d2c61539c565b015f6001890160ff8816600a8110613d4657613d4661539c565b0180546001600160a01b039485167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905581549383166101009190910a9081029202199092161790555b5050505050565b60605f80836001811115613db157613db16154e2565b14613dc857613dc3600c614053614194565b613dd5565b613dd560016143f5614194565b80519091508067ffffffffffffffff811115613df357613df361504d565b604051908082528060200260200182016040528015613e3f57816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081613e115790505b5092505f5b81811015613ed3575f805f858481518110613e6157613e6161539c565b6020026020010151806020019051810190613e7c919061550f565b9250925092506040518060600160405280846001600160a01b03168152602001831515815260200182815250878581518110613eba57613eba61539c565b6020026020010181905250505050806001019050613e44565b505050919050565b80546060906001600160a01b036101008204169060ff165f8167ffffffffffffffff811115613f0c57613f0c61504d565b604051908082528060200260200182016040528015613f35578160200160208202803683370190505b509050815f03613f4757949350505050565b82815f81518110613f5a57613f5a61539c565b6001600160a01b039092166020928302919091019091015260015b82811015613fd4578560010181600a8110613f9257613f9261539c565b015482516001600160a01b0390911690839083908110613fb457613fb461539c565b6001600160a01b0390921660209283029190910190910152600101613f75565b50949350505050565b5f816001811115613ff057613ff06154e2565b1461400257610f62600c61402c61471e565b610f62600161400f61471e565b5f8061401a836143f5565b9150915081610bf857610bf881612fa2565b5f8061401a83614053565b5f33301461404457503390565b505f546001600160a01b031690565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4b3d12230000000000000000000000000000000000000000000000000000000017905290515f9160609183916001600160a01b038616916140c79190614fe7565b5f604051808303815f865af19150503d805f8114614100576040519150601f19603f3d011682016040523d82523d5f602084013e614105565b606091505b5092509050808015614118575081516020145b8015614158575081517f4b3d122300000000000000000000000000000000000000000000000000000000906141569084016020908101908501615483565b145b6040519093506001600160a01b038516907faea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9905f90a250915091565b815460609060ff81169061010081046001600160a01b0316907501000000000000000000000000000000000000000000900469ffffffffffffffffffff165f8367ffffffffffffffff8111156141ec576141ec61504d565b60405190808252806020026020018201604052801561421f57816020015b606081526020019060019003908161420a5790505b509050835f03614234579350610d7492505050565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff8316750100000000000000000000000000000000000000000002167f01000000000000000000000000000000000000000000000000000000000000001787555f806142ad8563ffffffff8a16565b915091508482826040516020016142c693929190615565565b604051602081830303815290604052835f815181106142e7576142e761539c565b602090810291909101015260015b868110156143e7575f8a60010182600a81106143135761431361539c565b0154604080518082019091525f81526001602082018190526001600160a01b039092169250908c0183600a811061434c5761434c61539c565b82516020909301516bffffffffffffffffffffffff1674010000000000000000000000000000000000000000026001600160a01b03909316929092179101556143988163ffffffff8c16565b60405191955093506143b290829086908690602001615565565b6040516020818303038152906040528583815181106143d3576143d361539c565b6020908102919091010152506001016142f5565b509198975050505050505050565b6001600160a01b038082165f908152601b602052604081208054919260609260ff80821692610100830416917f010000000000000000000000000000000000000000000000000000000000000090041682860361446a57600160405180602001604052805f8152509550955050505050915091565b60018311156144d85750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff1be4519000000000000000000000000000000000000000000000000000000001790525f969095509350505050565b6001600160a01b038781165f908152601a602052604081209091841690899061450090613edb565b60405160240161451192919061558e565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb168c58f00000000000000000000000000000000000000000000000000000000179052516145749190614fe7565b5f60405180830381855afa9150503d805f81146145ac576040519150601f19603f3d011682016040523d82523d5f602084013e6145b1565b606091505b50965090508080156145c4575085516020145b8015614604575085517fb168c58f00000000000000000000000000000000000000000000000000000000906146029088016020908101908901615483565b145b965086156146d457845460ff8581167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091176101006001600160a01b038616021774ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004269ffffffffffffffffffff16027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16177f0100000000000000000000000000000000000000000000000000000000000000918416919091021785555b826001600160a01b0316886001600160a01b03167f889a4d4628b31342e420737e2aeb45387087570710d26239aa8a5f13d3e829d460405160405180910390a35050505050915091565b815460ff81169061010081046001600160a01b0316907501000000000000000000000000000000000000000000900469ffffffffffffffffffff165f839003614768575050505050565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff8216750100000000000000000000000000000000000000000002167f01000000000000000000000000000000000000000000000000000000000000001785556147df8263ffffffff8616565b60015b8381101561488e575f8660010182600a81106148005761480061539c565b0154604080518082019091525f81526001602082018190526001600160a01b03909216925090880183600a81106148395761483961539c565b82516020909301516bffffffffffffffffffffffff1674010000000000000000000000000000000000000000026001600160a01b03909316929092179101556148858163ffffffff8816565b506001016147e2565b505050505050565b5f5b838110156148b0578181015183820152602001614898565b50505f910152565b5f81518084526148cf816020860160208601614896565b601f01601f19169290920160200192915050565b602081525f610d8560208301846148b8565b6001600160a01b0381168114610f62575f80fd5b5f60208284031215614919575f80fd5b8135610d85816148f5565b80356cffffffffffffffffffffffffff1981168114610fc5575f80fd5b8015158114610f62575f80fd5b5f806040838503121561495f575f80fd5b61496883614924565b9150602083013561497881614941565b809150509250929050565b5f8060408385031215614994575f80fd5b61499d83614924565b946020939093013593505050565b5f80604083850312156149bc575f80fd5b82356149c7816148f5565b91506020830135614978816148f5565b5f8083601f8401126149e7575f80fd5b50813567ffffffffffffffff8111156149fe575f80fd5b602083019150836020828501011115614a15575f80fd5b9250929050565b5f805f805f60808688031215614a30575f80fd5b8535614a3b816148f5565b94506020860135614a4b816148f5565b935060408601359250606086013567ffffffffffffffff811115614a6d575f80fd5b614a79888289016149d7565b969995985093965092949392505050565b5f60208284031215614a9a575f80fd5b610d8582614924565b5f805f805f805f805f806101008b8d031215614abd575f80fd5b8a35614ac8816148f5565b995060208b0135614ad8816148f5565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b013567ffffffffffffffff80821115614b10575f80fd5b614b1c8e838f016149d7565b909650945060e08d0135915080821115614b34575f80fd5b50614b418d828e016149d7565b915080935050809150509295989b9194979a5092959850565b803560ff81168114610fc5575f80fd5b5f805f60608486031215614b7c575f80fd5b8335614b87816148f5565b9250614b9560208501614b5a565b9150614ba360408501614b5a565b90509250925092565b5f8060208385031215614bbd575f80fd5b823567ffffffffffffffff80821115614bd4575f80fd5b818501915085601f830112614be7575f80fd5b813581811115614bf5575f80fd5b8660208260051b8501011115614c09575f80fd5b60209290920196919550909350505050565b5f82825180855260208086019550808260051b8401018186015f5b84811015614c8f57858303601f19018952815180516001600160a01b0316845284810151151585850152604090810151606091850182905290614c7b818601836148b8565b9a86019a9450505090830190600101614c36565b5090979650505050505050565b5f606082016060835280865180835260808501915060808160051b860101925060208089015f5b83811015614d25578786037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8001855281518051151587528301516040848801819052614d11818901836148b8565b975050509382019390820190600101614cc3565b505085840381870152505050614d3b8186614c1b565b905082810360408401526137648185614c1b565b5f805f60608486031215614d61575f80fd5b8335614d6c816148f5565b92506020840135614d7c816148f5565b91506040840135614d8c81614941565b809150509250925092565b5f815180845260208085019450602084015f5b83811015614dcf5781516001600160a01b031687529582019590820190600101614daa565b509495945050505050565b602081525f610d856020830184614d97565b5f805f60608486031215614dfe575f80fd5b614e0784614924565b95602085013595506040909401359392505050565b5f8060408385031215614e2d575f80fd5b6149c783614924565b5f805f60608486031215614e48575f80fd5b614e5184614924565b92506020840135614e61816148f5565b929592945050506040919091013590565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b60208082528181018390525f906040808401600586901b8501820187855b88811015614fd9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818b3603018112614f19575f80fd5b8a0160808135614f28816148f5565b6001600160a01b0390811686528289013590614f43826148f5565b16858901528187013587860152606080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112614f86575f80fd5b90920188810192903567ffffffffffffffff811115614fa3575f80fd5b803603841315614fb1575f80fd5b8282880152614fc38388018286614e72565b978a019796505050928701925050600101614eb9565b509098975050505050505050565b5f8251614ff8818460208701614896565b9190910192915050565b5f815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015613ed35760049290920360031b82901b161692915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561509d5761509d61504d565b60405290565b6040805190810167ffffffffffffffff8111828210171561509d5761509d61504d565b604051601f8201601f1916810167ffffffffffffffff811182821017156150ef576150ef61504d565b604052919050565b5f67ffffffffffffffff8211156151105761511061504d565b5060051b60200190565b5f82601f830112615129575f80fd5b815167ffffffffffffffff8111156151435761514361504d565b6151566020601f19601f840116016150c6565b81815284602083860101111561516a575f80fd5b61517b826020830160208701614896565b949350505050565b5f82601f830112615192575f80fd5b815160206151a76151a2836150f7565b6150c6565b82815260059290921b840181019181810190868411156151c5575f80fd5b8286015b8481101561525e57805167ffffffffffffffff808211156151e8575f80fd5b8189019150606080601f19848d03011215615201575f80fd5b61520961507a565b87840151615216816148f5565b815260408481015161522781614941565b828a015291840151918383111561523c575f80fd5b61524a8d8a8588010161511a565b9082015286525050509183019183016151c9565b509695505050505050565b5f805f6060848603121561527b575f80fd5b835167ffffffffffffffff80821115615292575f80fd5b818601915086601f8301126152a5575f80fd5b815160206152b56151a2836150f7565b82815260059290921b8401810191818101908a8411156152d3575f80fd5b8286015b8481101561534b578051868111156152ed575f80fd5b87016040818e03601f19011215615302575f80fd5b61530a6150a3565b8582015161531781614941565b815260408201518881111561532a575f80fd5b6153388f888386010161511a565b82880152508452509183019183016152d7565b5091890151919750909350505080821115615364575f80fd5b61537087838801615183565b93506040860151915080821115615385575f80fd5b5061539286828701615183565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614ff8575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261542e575f80fd5b83018035915067ffffffffffffffff821115615448575f80fd5b602001915036819003821315614a15575f80fd5b818382375f9101908152919050565b828152604060208201525f61517b60408301846148b8565b5f60208284031215615493575f80fd5b5051919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156154da5780818660040360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f805f60608486031215615521575f80fd5b835161552c816148f5565b602085015190935061553d81614941565b604085015190925067ffffffffffffffff811115615559575f80fd5b6153928682870161511a565b6001600160a01b03841681528215156020820152606060408201525f612d4b60608301846148b8565b6001600160a01b0383168152604060208201525f61517b6040830184614d9756fea26469706673582212207414c567e5190dcfe61f62c2bf724b7071ff017973cdf7cd800b17f559f9d76864736f6c63430008180033","sourceMap":"671:53747:1:-:0;;;4987:124;;;;;;;;;-1:-1:-1;;;;1035:16:5;:62;2462:32;1062:1;2462:30;:32::i;:::-;2504:30;:17;:28;:30::i;:::-;5029:13:1;5011:31;;;;1344:4;;;;;;;;;;;;;;;;;50236:64;;1403:80;50236:64;;;377:25:270;1328:22:1;418:18:270;;;411:34;461:18;;;454:34;;;;50294:4:1;504:18:270;;;497:60;50236:64:1;;;;;;;;;;349:19:270;;;;50236:64:1;;50226:75;;;;;5052:52;;671:53747;;2538:250:4;2608:30;;-1:-1:-1;;;;;2608:30:4;-1:-1:-1;;;2608:30:4;;;2145:1;2649:133;245:2;2688:20;;2649:133;;;2145:1;2729:19;;;2749:1;2729:22;;;;;;;:::i;:::-;;:42;;-1:-1:-1;;;;;2729:42:4;;;;-1:-1:-1;;;2729:42:4;-1:-1:-1;;;;;2729:42:4;;;;;;;;;-1:-1:-1;2710:3:4;2649:133;;;;2538:250;:::o;14:127:270:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:417;671:53747:1;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106102da575f3560e01c8063863789d71161017b578063c368516c116100d1578063df7c138411610087578063ebf1ea8611610062578063ebf1ea8614610915578063f4fc35701461091d578063fd6046d714610930575f80fd5b8063df7c1384146108b6578063e21e537c146108d5578063e920e8e014610902575f80fd5b8063cb29955a116100b7578063cb29955a1461082d578063cdd8ea7814610884578063d44fee5a146108a3575f80fd5b8063c368516c146107fb578063c760d9211461080e575f80fd5b8063a4d25d1e11610131578063b9b70ff51161010c578063b9b70ff5146107c2578063c14c11bf146107d5578063c16ae7a4146107e8575f80fd5b8063a4d25d1e14610730578063a829aaf51461075c578063b03c130d1461076f575f80fd5b80639e716d58116101615780639e716d58146106f65780639f5c462a14610715578063a37d54af14610728575f80fd5b8063863789d71461069857806392d2fc01146106c6575f80fd5b80633b2416be1161023057806347cfdac4116101e6578063642ea23f116101c1578063642ea23f146106505780637f17c377146106635780637f5c92f314610685575f80fd5b806347cfdac4146105e0578063506d8c92146105ff5780635bedd1cd1461063d575f80fd5b8063430292b311610216578063430292b314610542578063442b172c1461056e57806346591032146105cd575f80fd5b80633b2416be146104f457806342e5349914610523575f80fd5b80631647292a1161029057806330f316671161026b57806330f31667146104785780633a1a3a1d1461048b5780633b10f3ef1461049e575f80fd5b80631647292a146103f857806318503a1e146104275780631f8b521514610465575f80fd5b8063116d0e93116102c0578063116d0e93146103a5578063129d21a0146103b857806312d6c936146103cb575f80fd5b806306fdde031461033457806310a7519814610392575f80fd5b36610330575f5474ff00000000000000000000000000000000000000001661032e576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b34801561033f575f80fd5b5061037c6040518060400160405280601881526020017f457468657265756d205661756c7420436f6e6e6563746f72000000000000000081525081565b60405161038991906148e3565b60405180910390f35b61032e6103a0366004614909565b61094f565b61032e6103b336600461494e565b610aaa565b61032e6103c636600461494e565b610bfd565b3480156103d6575f80fd5b506103ea6103e5366004614983565b610d49565b604051908152602001610389565b348015610403575f80fd5b506104176104123660046149ab565b610d7a565b6040519015158152602001610389565b348015610432575f80fd5b50610446610441366004614909565b610d8c565b604080516001600160a01b039093168352901515602083015201610389565b61037c610473366004614a1c565b610e1f565b61032e610486366004614909565b610f17565b348015610496575f80fd5b505f546103ea565b3480156104a9575f80fd5b506104176104b8366004614a8a565b6cffffffffffffffffffffffffff19165f9081526017602052604090205474010000000000000000000000000000000000000000900460ff1690565b3480156104ff575f80fd5b505f5477ff0000000000000000000000000000000000000000000000161515610417565b34801561052e575f80fd5b5061041761053d366004614909565b610f65565b34801561054d575f80fd5b505f5474ff0000000000000000000000000000000000000000161515610417565b348015610579575f80fd5b506105b5610588366004614909565b60601b6cffffffffffffffffffffffffff19165f908152601760205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610389565b61032e6105db366004614909565b610fca565b3480156105eb575f80fd5b506104176105fa3660046149ab565b610ffc565b34801561060a575f80fd5b5061061e610619366004614909565b61101d565b6040516cffffffffffffffffffffffffff199091168152602001610389565b61032e61064b366004614aa3565b611038565b61032e61065e366004614b6a565b611488565b610676610671366004614bac565b61156b565b60405161038993929190614c9c565b61032e610693366004614bac565b61171c565b3480156106a3575f80fd5b505f5476ff00000000000000000000000000000000000000000000161515610417565b3480156106d1575f80fd5b505f5478ff000000000000000000000000000000000000000000000000161515610417565b348015610701575f80fd5b506104176107103660046149ab565b6119d1565b61032e610723366004614d4f565b6119f2565b61032e611c11565b34801561073b575f80fd5b5061074f61074a366004614909565b611c45565b6040516103899190614dda565b61032e61076a366004614dec565b611c68565b34801561077a575f80fd5b506103ea610789366004614e1c565b6cffffffffffffffffffffffffff1982165f9081526018602090815260408083206001600160a01b038516845290915290205492915050565b61037c6107d0366004614a1c565b611d45565b61032e6107e3366004614e36565b611f3b565b61032e6107f6366004614bac565b612076565b61032e6108093660046149ab565b6121c8565b348015610819575f80fd5b506104176108283660046149ab565b61233c565b348015610838575f80fd5b50610417610847366004614a8a565b6cffffffffffffffffffffffffff19165f908152601760205260409020547501000000000000000000000000000000000000000000900460ff1690565b34801561088f575f80fd5b5061041761089e366004614909565b612349565b61032e6108b13660046149ab565b6123a6565b3480156108c1575f80fd5b506103ea6108d0366004614909565b612508565b3480156108e0575f80fd5b505f5475ff000000000000000000000000000000000000000000161515610417565b61032e6109103660046149ab565b61259a565b61032e6126b9565b61032e61092b366004614909565b61273f565b34801561093b575f80fd5b5061074f61094a366004614909565b612853565b5f5475ff0000000000000000000000000000000000000000008116156109a1576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109f05f75ff00000000000000000000000000000000000000000083175b7fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161790565b5f9081556001600160a01b038084168252601b602052604090912054839160ff82169161010090041660018214610a53576040517ff1be451900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381163314610a95576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50610aa39050600184612876565b50505f5550565b81610ab6815f80612cf1565b506cffffffffffffffffffffffffff1983165f9081526017602052604090205460ff750100000000000000000000000000000000000000000090910416151582151514610bf85781158015610b2257505f5474ff00000000000000000000000000000000000000001615155b15610b59576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1983165f818152601760205260409081902080548515157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909116179055517f6321df4e44267d425279195e7488fadba1a42d5cce9e84f596d5cf696f4449cd90610bef90851515815260200190565b60405180910390a25b505050565b81610c09815f80612cf1565b506cffffffffffffffffffffffffff1983165f9081526017602052604090205460ff7401000000000000000000000000000000000000000090910416151582151514610bf85781158015610c7d57505f5474ff000000000000000000000000000000000000000016151580610c7d57503330145b15610cb4576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1983165f8181526017602052604090819020805485151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909116179055517faf5120bc58372f0063d8362c9bba9070c462c07ae24c24082d080a426432798b90610bef90851515815260200190565b6cffffffffffffffffffffffffff1982165f9081526019602090815260408083208484529091529020545b92915050565b5f610d858383612d54565b9392505050565b5f80610d9f5f546001600160a01b031690565b91506001600160a01b038216610de1576040517f5217b8ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831615610e16576001600160a01b0382165f908152601b60205260409020610e119084612ddd565b610e18565b5f5b9050915091565b5f5460609075ff000000000000000000000000000000000000000000811615610e74576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615610ec5576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f5474ff000000000000000000000000000000000000000081175f908155610ef18888888888612e81565b9350905080610f0357610f0383612fa2565b610f0c82612fe3565b505095945050505050565b5f5474ff00000000000000000000000000000000000000001615610f5057610f4060018261303c565b50610f4c600c3361303c565b5050565b610f59816132a2565b610f6233613326565b50565b5f805475ff0000000000000000000000000000000000000000001615610fb7576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc2600183612ddd565b90505b919050565b5f5474ff00000000000000000000000000000000000000001615610ff357610f4c60018261303c565b610f62816132a2565b6001600160a01b0382165f908152601b60205260408120610d859083612ddd565b5f606082901b6cffffffffffffffffffffffffff1916610fc2565b5f5475ff00000000000000000000000000000000000000000081161561108a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff000000000000000000000000000000000000000000008116156110db576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b503330148061110657506001600160a01b0389161580159061110657506001600160a01b0389163314155b1561113d576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038a16158061115c575061115a8a610100111590565b155b15611193576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608a901b6cffffffffffffffffffffffffff19165f818152601760205260409020547501000000000000000000000000000000000000000000900460ff1615611209576040517f4426359200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1981165f9081526019602090815260408083208c84529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114806112615750888114155b15611298576040517fa82b84bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50428710156112d3576040517f7c9bb1cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84900361130d576040517fe85c620e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61131e8c8c8c8c8c8c8c8c6133a5565b905061135f8185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061357f92505050565b6001600160a01b03168c6001600160a01b0316141580156113bd57506113bb8c8286868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061363992505050565b155b156113f4576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1982165f8181526019602090815260408083208e845282529182902060018d01905590518b81528c92917fb0dcec731e48090736be6db10ad9f9581d0ec5fc0f1925a8e267b64b614b08d6910160405180910390a35f80611466308f8b8b8b61376e565b91509150816114785761147881612fa2565b5050505050505050505050505050565b5f5475ff0000000000000000000000000000000000000000008116156114da576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff0000000000000000000000000000000000000000000081161561152b576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5082611539816001806139d4565b506001600160a01b0384165f908152601a6020526040902061155c908484613bd0565b61156584610fca565b50505050565b60608060605f80306001600160a01b0316306001600160a01b0316637f5c92f3898960405160240161159e929190614e9b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660e09490941b9390931790925290516115eb9250614fe7565b5f60405180830381855af49150503d805f8114611623576040519150601f19603f3d011682016040523d82523d5f602084013e611628565b606091505b50915091508115611665576040517f4cd2d4f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004815110806116bf57507fd4b0e4d30000000000000000000000000000000000000000000000000000000061169a82615002565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156116cd576116cd81612fa2565b80517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8101600483019081529161170c91810160200190602401615269565b9199909850909650945050505050565b5f5475ff00000000000000000000000000000000000000000081161561176e576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff000000000000000000000000000000000000000000008116156117bf576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f546060908190819074ff0000000000000000000000000000000000000000811615611818576040517fb83566c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b78ff000000ff000000000000000000000000000000000000000081175f55848067ffffffffffffffff8111156118505761185061504d565b60405190808252806020026020018201604052801561189557816020015b604080518082019091525f81526060602082015281526020019060019003908161186e5790505b5094505f5b8181101561194d57368888838181106118b5576118b561539c565b90506020028101906118c791906153c9565b90506119006118d96020830183614909565b6118e96040840160208501614909565b60408401356118fb60608601866153fb565b612e81565b8884815181106119125761191261539c565b60200260200101515f0189858151811061192e5761192e61539c565b602090810291909101810151019190915290151590525060010161189a565b506119705f75ff00000000000000000000000000000000000000000084176109bf565b5f90815561197d90613d9b565b93506119896001613d9b565b5f8390556040517fd4b0e4d30000000000000000000000000000000000000000000000000000000081529093506119c890869086908690600401614c9c565b60405180910390fd5b6001600160a01b0382165f908152601a60205260408120610d859083612ddd565b5f6119ff8460015f6139d4565b90506cffffffffffffffffffffffffff19606085901b165f61010086841810611a4f576cffffffffffffffffffffffffff1982165f908152601760205260409020546001600160a01b0316611a51565b825b9050826001600160a01b0316816001600160a01b031614158015611a875750826001600160a01b0316856001600160a01b031614155b15611abe576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516301480611ad85750610100858218105b15611b0f576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1982165f9081526018602090815260408083206001600160a01b038981168552925282205460018985189092169190911b9186611b5d5782198216611b61565b8282175b9050808203611b9c576040517f655156bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1985165f8181526018602090815260408083206001600160a01b038d1680855290835292819020859055518481529192917f7ba31654d8467e98b6bd4fc56ddde246de9ade831cf860c7ac695579aecb9564910160405180910390a3505050505050505050565b5f5474ff00000000000000000000000000000000000000001615611c3a57610f62600c3361303c565b611c4333613326565b565b6001600160a01b0381165f908152601a60205260409020606090610fc290613edb565b82611c74815f80612cf1565b506cffffffffffffffffffffffffff1984165f908152601960209081526040808320868452909152902054828110611cd8576040517fa82b84bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1985165f81815260196020908152604080832088845282529182902086905581518481529081018690528692917f3b8510174a91acb36200f7427c1889f934941fd89ed86faf390749b4c2b46337910160405180910390a35050505050565b5f5460609075ff000000000000000000000000000000000000000000811615611d9a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615611deb576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038086165f908152601b6020526040902054869160ff82169161010090041660018214611e4c576040517ff1be451900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381163314611e8e576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506001600160a01b0386165f908152601a60205260409020611eb19088612ddd565b611ee7576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5476ff00ff000000000000000000000000000000000000000081175f908155611f14898989898961376e565b9450905080611f2657611f2684612fa2565b611f2f82612fe3565b50505095945050505050565b5f611f47845f80612cf1565b90506001600160a01b038316301480611f635750610100838218105b15611f9a576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1984165f9081526018602090815260408083206001600160a01b0387168452909152902054829003612006576040517f655156bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6cffffffffffffffffffffffffff1984165f8181526018602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f7ba31654d8467e98b6bd4fc56ddde246de9ade831cf860c7ac695579aecb9564910160405180910390a350505050565b5f5475ff0000000000000000000000000000000000000000008116156120c8576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615612119576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f5474ff000000000000000000000000000000000000000081175f90815582905b818110156121be57368585838181106121565761215661539c565b905060200281019061216891906153c9565b90505f8061219e61217c6020850185614909565b61218c6040860160208701614909565b60408601356118fb60608801886153fb565b91509150816121b0576121b081612fa2565b50505080600101905061213b565b5061156582612fe3565b5f5475ff00000000000000000000000000000000000000000081161561221a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff0000000000000000000000000000000000000000000081161561226b576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081612279816001806139d4565b50306001600160a01b038316036122bc576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383165f908152601b602052604090206122dd908361303c565b1561233357816001600160a01b0316836001600160a01b03167f9919d437ee612d4ec7bba88a7d9bc4fc36a0a23608ad6259252711a46b708af9600160405161232a911515815260200190565b60405180910390a35b610bf883610fca565b5f61010082841810610d85565b5f805475ff000000000000000000000000000000000000000000161561239b576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc2600c83612ddd565b5f5475ff0000000000000000000000000000000000000000008116156123f8576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff00000000000000000000000000000000000000000000811615612449576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081612457816001806139d4565b50306001600160a01b0383160361249a576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383165f908152601a602052604090206124bb908361303c565b1561233357816001600160a01b0316836001600160a01b03167ff022705c827017c972043d1984cfddc7958c9f4685b4d9ce8bd68696f4381cd2600160405161232a911515815260200190565b5f805475ff000000000000000000000000000000000000000000161561255a576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b03165f908152601b60205260409020547501000000000000000000000000000000000000000000900469ffffffffffffffffffff1690565b5f5475ff0000000000000000000000000000000000000000008116156125ec576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff0000000000000000000000000000000000000000000081161561263d576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508161264b816001806139d4565b506001600160a01b0383165f908152601a6020526040902061266d9083612876565b1561233357816001600160a01b0316836001600160a01b03167ff022705c827017c972043d1984cfddc7958c9f4685b4d9ce8bd68696f4381cd25f60405161232a911515815260200190565b5f5475ff00000000000000000000000000000000000000000081161561270b576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61272d5f75ff00000000000000000000000000000000000000000083176109bf565b5f5561273a600c33612876565b505f55565b5f5475ff000000000000000000000000000000000000000000811615612791576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b76ff000000000000000000000000000000000000000000008116156127e2576040517f0ddfd8da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b0381165f908152601b602052604090206128049033612876565b1561284a576040515f815233906001600160a01b038316907f9919d437ee612d4ec7bba88a7d9bc4fc36a0a23608ad6259252711a46b708af99060200160405180910390a35b610f6281610fca565b6001600160a01b0381165f908152601b60205260409020606090610fc290613edb565b81545f9061010081046001600160a01b03169060ff8116907501000000000000000000000000000000000000000000900469ffffffffffffffffffff168184036128c5575f9350505050610d74565b5f856001600160a01b0316846001600160a01b031614612935575060015b8281101561292257856001600160a01b03168760010182600a811061290a5761290a61539c565b01546001600160a01b031614612922576001016128e3565b828103612935575f945050505050610d74565b826001036129b557507effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff909116750100000000000000000000000000000000000000000002167f01000000000000000000000000000000000000000000000000000000000000001785555060019150610d749050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83015f6001890182600a81106129ee576129ee61539c565b019050818314612bf257825f03612ad457805489547f010000000000000000000000000000000000000000000000000000000000000060ff85167fff000000000000000000000000000000000000000000000000000000000000009092166101006001600160a01b03909416939093027fff00000000000000000000ffffffffffffffffffffffffffffffffffffffff00169290921717750100000000000000000000000000000000000000000069ffffffffffffffffffff871602177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16178955612cbd565b80546001600160a01b031660018a0184600a8110612af457612af461539c565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392831617905589547f010000000000000000000000000000000000000000000000000000000000000060ff85167fff00000000000000000000000000000000000000000000000000000000000000909216610100938a16939093027fff00000000000000000000ffffffffffffffffffffffffffffffffffffffff00169290921717750100000000000000000000000000000000000000000069ffffffffffffffffffff871602177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16178955612cbd565b88547f010000000000000000000000000000000000000000000000000000000000000060ff84167fff000000000000000000000000000000000000000000000000000000000000009092166101006001600160a01b038a16027fff00000000000000000000ffffffffffffffffffffffffffffffffffffffff00161791909117750100000000000000000000000000000000000000000069ffffffffffffffffffff871602177effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff161789555b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055506001979650505050505050565b6cffffffffffffffffffffffffff1983165f908152601760205260408120546001600160a01b0316612d4b8115612d285781612d44565b73ffffffffffffffffffffffffffffffffffffff00606087901c165b85856139d4565b95945050505050565b6cffffffffffffffffffffffffff19606083901b165f818152601760205260408120549091906001600160a01b031680612d92575f92505050610d74565b6cffffffffffffffffffffffffff19919091165f9081526018602090815260408083206001600160a01b0396871684529091529020546001949091189092169290921b161515919050565b81545f906001600160a01b036101008204169060ff16808303612e04575f92505050610d74565b836001600160a01b0316826001600160a01b031603612e2857600192505050610d74565b60015b81811015612e7657846001600160a01b03168660010182600a8110612e5257612e5261539c565b01546001600160a01b031603612e6e5760019350505050610d74565b600101612e2b565b505f95945050505050565b5f6060306001600160a01b03881603612f67576001600160a01b03861615612ed5576040517f8133abd100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8415612f0d576040517fbb6de1c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040513090612f1f908690869061545c565b5f60405180830381855af49150503d805f8114612f57576040519150601f19603f3d011682016040523d82523d5f602084013e612f5c565b606091505b509092509050612f98565b6001600160a01b0387163314612f8557612f83866001806139d4565b505b612f92878787878761376e565b90925090505b9550959350505050565b805115612fb157805181602001fd5b6040517f38ae747c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b74ff00000000000000000000000000000000000000008116613038576130215f75ff00000000000000000000000000000000000000000083176109bf565b5f90815561302e90613fdd565b6130386001613fdd565b5f55565b81545f9061010081046001600160a01b03169060ff8116907501000000000000000000000000000000000000000000900469ffffffffffffffffffff168184036131505785547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff9092167501000000000000000000000000000000000000000000029190911674ffffffffffffffffffffffffffffffffffffffffff6001600160a01b038716610100027fffffffffffffffffffffff00000000000000000000000000000000000000000090931692909217600190811792909216177f01000000000000000000000000000000000000000000000000000000000000001786559250610d74915050565b846001600160a01b0316836001600160a01b031603613174575f9350505050610d74565b60015b828110156131c257856001600160a01b03168760010182600a811061319e5761319e61539c565b01546001600160a01b0316036131ba575f945050505050610d74565b600101613177565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6820161321c576040517f3572cf8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b848660010183600a81106132325761323261539c565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555084547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600191820160ff1617909455509192915050565b5f5475ff0000000000000000000000000000000000000000008116156132f4576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133165f75ff00000000000000000000000000000000000000000083176109bf565b5f556133218261400f565b5f5550565b5f5475ff000000000000000000000000000000000000000000811615613378576040517f7c1b290800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61339a5f75ff00000000000000000000000000000000000000000083176109bf565b5f556133218261402c565b5f807f0000000000000000000000000000000000000000000000000000000000000000461461347a57604080518082018252601881527f457468657265756d205661756c7420436f6e6e6563746f72000000000000000060209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f040f0adc9d57e8bea9a4602b7065ad7261f63d709e7be772afe0ceb20a92d47381840152466060820152306080808301919091528351808303909101815260a0909101909252815191012061349c565b7f00000000000000000000000000000000000000000000000000000000000000005b90505f7f4ae56dd541cf527f212121ebe3756a7631631f85f66a3073e982c01a6e2ecbf28b8b8b8b8b8b8b8b6040516134d692919061545c565b6040805191829003822060208301999099526001600160a01b0397881690820152959094166060860152608085019290925260a084015260c083015260e0820152610100810191909152610120016040516020818303038152906040528051906020012090507f19010000000000000000000000000000000000000000000000000000000000005f52816002528060225260425f2092505f602252505098975050505050505050565b5f815160411461359057505f610d74565b6020820151604083015160608401515f1a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156135d4575f9350505050610d74565b604080515f81526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015613624573d5f803e3d5ffd5b5050604051601f190151979650505050505050565b5f836001600160a01b03163b5f0361365257505f610d85565b5f80856001600160a01b0316858560405160240161367192919061546b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1626ba7e00000000000000000000000000000000000000000000000000000000179052516136d49190614fe7565b5f60405180830381855afa9150503d805f811461370c576040519150601f19603f3d011682016040523d82523d5f602084013e613711565b606091505b5091509150818015613724575080516020145b8015613764575080517f1626ba7e00000000000000000000000000000000000000000000000000000000906137629083016020908101908401615483565b145b9695505050505050565b5f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85036137a0574794506137da565b478511156137da576040517fbb6de1c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8054906137e6614037565b9050610100888218108061380257506001600160a01b03891633145b8061381557506001600160a01b03891630145b80613838575076ff00000000000000000000000000000000000000000000821615155b15613872577fffffffffffffffff00ffffff000000000000000000000000000000000000000082166001600160a01b038916175f556138bd565b77ff00000000000000000000000000000000000000000000006001600160a01b0389167fffffffffffffffffffffffff0000000000000000000000000000000000000000841617175f555b6001600160a01b038916606089901b6cffffffffffffffffffffffffff19166cffffffffffffffffffffffffff19166001600160a01b0383167f6e9738e5aa38fe1517adbb480351ec386ece82947737b18badbcad1e911133ec8b6139228a8c61549a565b604080516001600160a01b0390931683527fffffffff0000000000000000000000000000000000000000000000000000000090911660208301520160405180910390a4886001600160a01b031687878760405161398092919061545c565b5f6040518083038185875af1925050503d805f81146139ba576040519150601f19603f3d011682016040523d82523d5f602084013e6139bf565b606091505b505f9390935599919850909650505050505050565b606083901b6cffffffffffffffffffffffffff19165f818152601760205260408120549091906001600160a01b0381169074010000000000000000000000000000000000000000900460ff1683613a29614037565b90505f6101008983181015613aeb576001600160a01b038416613ace576cffffffffffffffffffffffffff1985165f8181526017602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038716908117909155905194965086949092917f67cb2734834e775d6db886bf16ac03d7273b290223ee5363354b385ec5b643b091a3506001613aeb565b816001600160a01b0316846001600160a01b031603613aeb575060015b80158015613af65750875b8015613b075750613b078983612d54565b15613b10575060015b808015613b2f5750886001600160a01b0316846001600160a01b031614155b8015613b4457506001600160a01b0389163b15155b15613b4c57505f5b80613b83576040517fe07f2e6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868015613b8d5750825b15613bc4576040517fd80a9cac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50979650505050505050565b82546001600160a01b036101008204169060ff90811690838116908516101580613bfd5750808360ff1610155b15613c34576040517f63df817100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360ff165f03613cce57846001018360ff16600a8110613c5657613c5661539c565b01546001600160a01b03168286600181810160ff8816600a8110613c7c57613c7c61539c565b0180546001600160a01b039485167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905581549383166101009190910a908102920219909216179055613d94565b846001018360ff16600a8110613ce657613ce661539c565b01546001600160a01b03166001860160ff8616600a8110613d0957613d0961539c565b01546001600160a01b03166001870160ff8716600a8110613d2c57613d2c61539c565b015f6001890160ff8816600a8110613d4657613d4661539c565b0180546001600160a01b039485167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905581549383166101009190910a9081029202199092161790555b5050505050565b60605f80836001811115613db157613db16154e2565b14613dc857613dc3600c614053614194565b613dd5565b613dd560016143f5614194565b80519091508067ffffffffffffffff811115613df357613df361504d565b604051908082528060200260200182016040528015613e3f57816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081613e115790505b5092505f5b81811015613ed3575f805f858481518110613e6157613e6161539c565b6020026020010151806020019051810190613e7c919061550f565b9250925092506040518060600160405280846001600160a01b03168152602001831515815260200182815250878581518110613eba57613eba61539c565b6020026020010181905250505050806001019050613e44565b505050919050565b80546060906001600160a01b036101008204169060ff165f8167ffffffffffffffff811115613f0c57613f0c61504d565b604051908082528060200260200182016040528015613f35578160200160208202803683370190505b509050815f03613f4757949350505050565b82815f81518110613f5a57613f5a61539c565b6001600160a01b039092166020928302919091019091015260015b82811015613fd4578560010181600a8110613f9257613f9261539c565b015482516001600160a01b0390911690839083908110613fb457613fb461539c565b6001600160a01b0390921660209283029190910190910152600101613f75565b50949350505050565b5f816001811115613ff057613ff06154e2565b1461400257610f62600c61402c61471e565b610f62600161400f61471e565b5f8061401a836143f5565b9150915081610bf857610bf881612fa2565b5f8061401a83614053565b5f33301461404457503390565b505f546001600160a01b031690565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f4b3d12230000000000000000000000000000000000000000000000000000000017905290515f9160609183916001600160a01b038616916140c79190614fe7565b5f604051808303815f865af19150503d805f8114614100576040519150601f19603f3d011682016040523d82523d5f602084013e614105565b606091505b5092509050808015614118575081516020145b8015614158575081517f4b3d122300000000000000000000000000000000000000000000000000000000906141569084016020908101908501615483565b145b6040519093506001600160a01b038516907faea973cfb51ea8ca328767d72f105b5b9d2360c65f5ac4110a2c4470434471c9905f90a250915091565b815460609060ff81169061010081046001600160a01b0316907501000000000000000000000000000000000000000000900469ffffffffffffffffffff165f8367ffffffffffffffff8111156141ec576141ec61504d565b60405190808252806020026020018201604052801561421f57816020015b606081526020019060019003908161420a5790505b509050835f03614234579350610d7492505050565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff8316750100000000000000000000000000000000000000000002167f01000000000000000000000000000000000000000000000000000000000000001787555f806142ad8563ffffffff8a16565b915091508482826040516020016142c693929190615565565b604051602081830303815290604052835f815181106142e7576142e761539c565b602090810291909101015260015b868110156143e7575f8a60010182600a81106143135761431361539c565b0154604080518082019091525f81526001602082018190526001600160a01b039092169250908c0183600a811061434c5761434c61539c565b82516020909301516bffffffffffffffffffffffff1674010000000000000000000000000000000000000000026001600160a01b03909316929092179101556143988163ffffffff8c16565b60405191955093506143b290829086908690602001615565565b6040516020818303038152906040528583815181106143d3576143d361539c565b6020908102919091010152506001016142f5565b509198975050505050505050565b6001600160a01b038082165f908152601b602052604081208054919260609260ff80821692610100830416917f010000000000000000000000000000000000000000000000000000000000000090041682860361446a57600160405180602001604052805f8152509550955050505050915091565b60018311156144d85750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff1be4519000000000000000000000000000000000000000000000000000000001790525f969095509350505050565b6001600160a01b038781165f908152601a602052604081209091841690899061450090613edb565b60405160240161451192919061558e565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fb168c58f00000000000000000000000000000000000000000000000000000000179052516145749190614fe7565b5f60405180830381855afa9150503d805f81146145ac576040519150601f19603f3d011682016040523d82523d5f602084013e6145b1565b606091505b50965090508080156145c4575085516020145b8015614604575085517fb168c58f00000000000000000000000000000000000000000000000000000000906146029088016020908101908901615483565b145b965086156146d457845460ff8581167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091176101006001600160a01b038616021774ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000004269ffffffffffffffffffff16027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16177f0100000000000000000000000000000000000000000000000000000000000000918416919091021785555b826001600160a01b0316886001600160a01b03167f889a4d4628b31342e420737e2aeb45387087570710d26239aa8a5f13d3e829d460405160405180910390a35050505050915091565b815460ff81169061010081046001600160a01b0316907501000000000000000000000000000000000000000000900469ffffffffffffffffffff165f839003614768575050505050565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff69ffffffffffffffffffff8216750100000000000000000000000000000000000000000002167f01000000000000000000000000000000000000000000000000000000000000001785556147df8263ffffffff8616565b60015b8381101561488e575f8660010182600a81106148005761480061539c565b0154604080518082019091525f81526001602082018190526001600160a01b03909216925090880183600a81106148395761483961539c565b82516020909301516bffffffffffffffffffffffff1674010000000000000000000000000000000000000000026001600160a01b03909316929092179101556148858163ffffffff8816565b506001016147e2565b505050505050565b5f5b838110156148b0578181015183820152602001614898565b50505f910152565b5f81518084526148cf816020860160208601614896565b601f01601f19169290920160200192915050565b602081525f610d8560208301846148b8565b6001600160a01b0381168114610f62575f80fd5b5f60208284031215614919575f80fd5b8135610d85816148f5565b80356cffffffffffffffffffffffffff1981168114610fc5575f80fd5b8015158114610f62575f80fd5b5f806040838503121561495f575f80fd5b61496883614924565b9150602083013561497881614941565b809150509250929050565b5f8060408385031215614994575f80fd5b61499d83614924565b946020939093013593505050565b5f80604083850312156149bc575f80fd5b82356149c7816148f5565b91506020830135614978816148f5565b5f8083601f8401126149e7575f80fd5b50813567ffffffffffffffff8111156149fe575f80fd5b602083019150836020828501011115614a15575f80fd5b9250929050565b5f805f805f60808688031215614a30575f80fd5b8535614a3b816148f5565b94506020860135614a4b816148f5565b935060408601359250606086013567ffffffffffffffff811115614a6d575f80fd5b614a79888289016149d7565b969995985093965092949392505050565b5f60208284031215614a9a575f80fd5b610d8582614924565b5f805f805f805f805f806101008b8d031215614abd575f80fd5b8a35614ac8816148f5565b995060208b0135614ad8816148f5565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b013567ffffffffffffffff80821115614b10575f80fd5b614b1c8e838f016149d7565b909650945060e08d0135915080821115614b34575f80fd5b50614b418d828e016149d7565b915080935050809150509295989b9194979a5092959850565b803560ff81168114610fc5575f80fd5b5f805f60608486031215614b7c575f80fd5b8335614b87816148f5565b9250614b9560208501614b5a565b9150614ba360408501614b5a565b90509250925092565b5f8060208385031215614bbd575f80fd5b823567ffffffffffffffff80821115614bd4575f80fd5b818501915085601f830112614be7575f80fd5b813581811115614bf5575f80fd5b8660208260051b8501011115614c09575f80fd5b60209290920196919550909350505050565b5f82825180855260208086019550808260051b8401018186015f5b84811015614c8f57858303601f19018952815180516001600160a01b0316845284810151151585850152604090810151606091850182905290614c7b818601836148b8565b9a86019a9450505090830190600101614c36565b5090979650505050505050565b5f606082016060835280865180835260808501915060808160051b860101925060208089015f5b83811015614d25578786037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8001855281518051151587528301516040848801819052614d11818901836148b8565b975050509382019390820190600101614cc3565b505085840381870152505050614d3b8186614c1b565b905082810360408401526137648185614c1b565b5f805f60608486031215614d61575f80fd5b8335614d6c816148f5565b92506020840135614d7c816148f5565b91506040840135614d8c81614941565b809150509250925092565b5f815180845260208085019450602084015f5b83811015614dcf5781516001600160a01b031687529582019590820190600101614daa565b509495945050505050565b602081525f610d856020830184614d97565b5f805f60608486031215614dfe575f80fd5b614e0784614924565b95602085013595506040909401359392505050565b5f8060408385031215614e2d575f80fd5b6149c783614924565b5f805f60608486031215614e48575f80fd5b614e5184614924565b92506020840135614e61816148f5565b929592945050506040919091013590565b81835281816020850137505f602082840101525f6020601f19601f840116840101905092915050565b60208082528181018390525f906040808401600586901b8501820187855b88811015614fd9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818b3603018112614f19575f80fd5b8a0160808135614f28816148f5565b6001600160a01b0390811686528289013590614f43826148f5565b16858901528187013587860152606080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112614f86575f80fd5b90920188810192903567ffffffffffffffff811115614fa3575f80fd5b803603841315614fb1575f80fd5b8282880152614fc38388018286614e72565b978a019796505050928701925050600101614eb9565b509098975050505050505050565b5f8251614ff8818460208701614896565b9190910192915050565b5f815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015613ed35760049290920360031b82901b161692915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561509d5761509d61504d565b60405290565b6040805190810167ffffffffffffffff8111828210171561509d5761509d61504d565b604051601f8201601f1916810167ffffffffffffffff811182821017156150ef576150ef61504d565b604052919050565b5f67ffffffffffffffff8211156151105761511061504d565b5060051b60200190565b5f82601f830112615129575f80fd5b815167ffffffffffffffff8111156151435761514361504d565b6151566020601f19601f840116016150c6565b81815284602083860101111561516a575f80fd5b61517b826020830160208701614896565b949350505050565b5f82601f830112615192575f80fd5b815160206151a76151a2836150f7565b6150c6565b82815260059290921b840181019181810190868411156151c5575f80fd5b8286015b8481101561525e57805167ffffffffffffffff808211156151e8575f80fd5b8189019150606080601f19848d03011215615201575f80fd5b61520961507a565b87840151615216816148f5565b815260408481015161522781614941565b828a015291840151918383111561523c575f80fd5b61524a8d8a8588010161511a565b9082015286525050509183019183016151c9565b509695505050505050565b5f805f6060848603121561527b575f80fd5b835167ffffffffffffffff80821115615292575f80fd5b818601915086601f8301126152a5575f80fd5b815160206152b56151a2836150f7565b82815260059290921b8401810191818101908a8411156152d3575f80fd5b8286015b8481101561534b578051868111156152ed575f80fd5b87016040818e03601f19011215615302575f80fd5b61530a6150a3565b8582015161531781614941565b815260408201518881111561532a575f80fd5b6153388f888386010161511a565b82880152508452509183019183016152d7565b5091890151919750909350505080821115615364575f80fd5b61537087838801615183565b93506040860151915080821115615385575f80fd5b5061539286828701615183565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614ff8575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261542e575f80fd5b83018035915067ffffffffffffffff821115615448575f80fd5b602001915036819003821315614a15575f80fd5b818382375f9101908152919050565b828152604060208201525f61517b60408301846148b8565b5f60208284031215615493575f80fd5b5051919050565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156154da5780818660040360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f805f60608486031215615521575f80fd5b835161552c816148f5565b602085015190935061553d81614941565b604085015190925067ffffffffffffffff811115615559575f80fd5b6153928682870161511a565b6001600160a01b03841681528215156020820152606060408201525f612d4b60608301846148b8565b6001600160a01b0383168152604060208201525f61517b6040830184614d9756fea26469706673582212207414c567e5190dcfe61f62c2bf724b7071ff017973cdf7cd800b17f559f9d76864736f6c63430008180033","sourceMap":"671:53747:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5276:16;;1437:66:3;2827:38;5271:94:1;;5335:19;;;;;;;;;;;;;;5271:94;671:53747;;;;;1172:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;28524:225;;;;;;:::i;:::-;;:::i;13284:798::-;;;;;;:::i;:::-;;:::i;12516:737::-;;;;;;:::i;:::-;;:::i;11924:163::-;;;;;;;;;;-1:-1:-1;11924:163:1;;;;;:::i;:::-;;:::i;:::-;;;2313:25:270;;;2301:2;2286:18;11924:163:1;2167:177:270;12306:179:1;;;;;;;;;;-1:-1:-1;12306:179:1;;;;;:::i;:::-;;:::i;:::-;;;2907:14:270;;2900:22;2882:41;;2870:2;2855:18;12306:179:1;2742:187:270;9551:577:1;;;;;;;;;;-1:-1:-1;9551:577:1;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3120:55:270;;;3102:74;;3219:14;;3212:22;3207:2;3192:18;;3185:50;3075:18;9551:577:1;2934:307:270;23095:566:1;;;;;;:::i;:::-;;:::i;29466:417::-;;;;;;:::i;:::-;;:::i;9392:128::-;;;;;;;;;;-1:-1:-1;9449:15:1;9496:16;9392:128;;11568:141;;;;;;;;;;-1:-1:-1;11568:141:1;;;;;:::i;:::-;-1:-1:-1;;11661:26:1;11638:4;11661:26;;;:11;:26;;;;;:41;;;;;;;11568:141;10634:130;;;;;;;;;;-1:-1:-1;10692:4:1;10715:16;1854:66:3;3796:45;:50;;10634:130:1;;28014:164;;;;;;;;;;-1:-1:-1;28014:164:1;;;;;:::i;:::-;;:::i;10159:118::-;;;;;;;;;;-1:-1:-1;10211:4:1;10234:16;1437:66:3;2827:38;:43;;10159:118:1;10634:130;11340:197;;;;;;;;;;-1:-1:-1;11340:197:1;;;;;:::i;:::-;52182:55;;-1:-1:-1;;52182:55:1;11405:7;11498:26;;;:11;:26;;;;;:32;-1:-1:-1;;;;;11498:32:1;;11340:197;;;;-1:-1:-1;;;;;4935:55:270;;;4917:74;;4905:2;4890:18;11340:197:1;4771:226:270;28209:284:1;;;;;;:::i;:::-;;:::i;19800:157::-;;;;;;;;;;-1:-1:-1;19800:157:1;;;;;:::i;:::-;;:::i;11177:132::-;;;;;;;;;;-1:-1:-1;11177:132:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;5166:79:270;;;5148:98;;5136:2;5121:18;11177:132:1;5002:250:270;20769:2270:1;;;;;;:::i;:::-;;:::i;19262:306::-;;;;;;:::i;:::-;;:::i;26576:1170::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;25221:1324::-;;;;;;:::i;:::-;;:::i;10461:142::-;;;;;;;;;;-1:-1:-1;10525:4:1;10548:16;1718:66:3;3441:58;:63;;10461:142:1;10634:130;10795:128;;;;;;;;;;-1:-1:-1;10852:4:1;10875:16;1970:66:3;4284:33;:38;;10795:128:1;10634:130;18252:157;;;;;;;;;;-1:-1:-1;18252:157:1;;;;;:::i;:::-;;:::i;15722:2298::-;;;;;;:::i;:::-;;:::i;28994:269::-;;;:::i;18082:139::-;;;;;;;;;;-1:-1:-1;18082:139:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14113:467::-;;;;;;:::i;:::-;;:::i;12118:157::-;;;;;;;;;;-1:-1:-1;12118:157:1;;;;;:::i;:::-;-1:-1:-1;;12229:29:1;;12203:7;12229:29;;;:14;:29;;;;;;;;-1:-1:-1;;;;;12229:39:1;;;;;;;;;;12118:157;;;;;23692:827;;;;;;:::i;:::-;;:::i;14751:790::-;;;;;;:::i;:::-;;:::i;24550:620::-;;;;;;:::i;:::-;;:::i;19988:412::-;;;;;;:::i;:::-;;:::i;10983:163::-;;;;;;;;;;-1:-1:-1;10983:163:1;;;;;:::i;:::-;;:::i;11740:153::-;;;;;;;;;;-1:-1:-1;11740:153:1;;;;;:::i;:::-;-1:-1:-1;;11839:26:1;11816:4;11839:26;;;:11;:26;;;;;:47;;;;;;;11740:153;28807:156;;;;;;;;;;-1:-1:-1;28807:156:1;;;;;:::i;:::-;;:::i;18440:412::-;;;;;;:::i;:::-;;:::i;27806:177::-;;;;;;;;;;-1:-1:-1;27806:177:1;;;;;:::i;:::-;;:::i;10308:122::-;;;;;;;;;;-1:-1:-1;10362:4:1;10385:16;1569:66:3;3125:41;:46;;10308:122:1;10634:130;18883:348;;;;;;:::i;:::-;;:::i;29294:141::-;;;:::i;20431:292::-;;;;;;:::i;:::-;;:::i;19630:139::-;;;;;;;;;;-1:-1:-1;19630:139:1;;;;;:::i;:::-;;:::i;28524:225::-;8736:15;8754:16;1569:66:3;3125:41;;:46;8781:94:1;;8842:22;;;;;;;;;;;;;;8781:94;8904:67;8968:1;1569:66:3;3283:41;;8904:34:1;2676:26:3;2658:44;-1:-1:-1;;;;;2657:65:3;;;;;2540:190;8904:67:1;8885:16;:86;;;-1:-1:-1;;;;;7241:27:1;;::::1;::::0;;:18:::1;:27;::::0;;;;;:39;28684:7;;7241:39:::1;::::0;::::1;::::0;::::1;7315:40:::0;::::1;;7241:39:::0;7374:21;::::1;7370:92;;7422:25;;;;;;;;;;;;;;7370:92;-1:-1:-1::0;;;;;7480:24:1;::::1;7494:10;7480:24;7476:89;;7531:19;;;;;;;;;;;;;;7476:89;-1:-1:-1::0;28707:35:1::2;::::0;-1:-1:-1;28707:19:1::2;28734:7:::0;28707:26:::2;:35::i;:::-;-1:-1:-1::0;;8994:16:1;:31;-1:-1:-1;28524:225:1:o;13284:798::-;13407:13;6126:98;6161:13;6191:5;6217;6126:18;:98::i;:::-;-1:-1:-1;;;13436:26:1;::::1;;::::0;;;:11:::1;:26;::::0;;;;:47;::::1;::::0;;;::::1;;:58;;::::0;::::1;;;13432:644;;13819:7;13818:8;:48;;;;-1:-1:-1::0;13830:16:1::1;::::0;1437:66:3;2827:38;:43;;13830:36:1::1;13814:113;;;13893:19;;;;;;;;;;;;;;13814:113;-1:-1:-1::0;;13941:26:1;::::1;;::::0;;;:11:::1;:26;::::0;;;;;;:57;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;14017:48;::::1;::::0;::::1;::::0;13991:7;2907:14:270;2900:22;2882:41;;2870:2;2855:18;;2742:187;14017:48:1::1;;;;;;;;13432:644;13284:798:::0;;;:::o;12516:737::-;12611:13;6126:98;6161:13;6191:5;6217;6126:18;:98::i;:::-;-1:-1:-1;;;12640:26:1;::::1;;::::0;;;:11:::1;:26;::::0;;;;:41;::::1;::::0;;;::::1;;:52;;::::0;::::1;;;12636:611;;12978:7;12977:8;:72;;;;-1:-1:-1::0;12990:16:1::1;::::0;1437:66:3;2827:38;:43;;12990:58:1::1;;;-1:-1:-1::0;51177:10:1;51168:4;51160:27;13030:18:::1;12973:137;;;13076:19;;;;;;;;;;;;;;12973:137;-1:-1:-1::0;;13124:26:1;::::1;;::::0;;;:11:::1;:26;::::0;;;;;;:51;;;::::1;;::::0;::::1;::::0;;;::::1;;::::0;;13194:42;::::1;::::0;::::1;::::0;13168:7;2907:14:270;2900:22;2882:41;;2870:2;2855:18;;2742:187;11924:163:1;-1:-1:-1;;12038:26:1;;12012:7;12038:26;;;:11;:26;;;;;;;;:42;;;;;;;;;11924:163;;;;;:::o;12306:179::-;12401:4;12424:54;12460:7;12469:8;12424:35;:54::i;:::-;12417:61;12306:179;-1:-1:-1;;;12306:179:1:o;9551:577::-;9662:25;9689:22;9747:39;:16;;-1:-1:-1;;;;;2482:43:3;;2369:165;9747:39:1;9727:59;-1:-1:-1;;;;;;9868:31:1;;9864:108;;9922:39;;;;;;;;;;;;;;9864:108;-1:-1:-1;;;;;10014:31:1;;;:107;;-1:-1:-1;;;;;10056:37:1;;;;;;:18;:37;;;;;:65;;10103:17;10056:46;:65::i;:::-;10014:107;;;10048:5;10014:107;9982:139;;9551:577;;;:::o;23095:566::-;8087:10;8100:16;23305:19;;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;-1:-1:-1;23336:15:1::1;23354:16:::0;1437:66:3;2980:38;;23380:16:1::1;:51:::0;;;23484:78:::1;23515:14:::0;23531:17;23550:5;23557:4;;23484:30:::1;:78::i;:::-;23464:98:::0;-1:-1:-1;23464:98:1;-1:-1:-1;23464:98:1;23573:33:::1;;23587:19;23599:6;23587:11;:19::i;:::-;23617:37;23641:12;23617:23;:37::i;:::-;23326:335;;23095:566:::0;;;;;;;:::o;29466:417::-;29563:16;;1437:66:3;2827:38;:43;29559:318:1;;29615:35;:19;29642:7;29615:26;:35::i;:::-;-1:-1:-1;29664:36:1;:17;29689:10;29664:24;:36::i;:::-;;29466:417;:::o;29559:318::-;29731:60;29783:7;29731:51;:60::i;:::-;29805:61;29855:10;29805:49;:61::i;:::-;29466:417;:::o;28014:164::-;28111:4;7739:16;;1569:66:3;3125:41;:46;7735:98:1;;7800:22;;;;;;;;;;;;;;7735:98;28134:37:::1;:19;28163:7:::0;28134:28:::1;:37::i;:::-;28127:44;;7843:1;28014:164:::0;;;:::o;28209:284::-;28298:16;;1437:66:3;2827:38;:43;28294:193:1;;28350:35;:19;28377:7;28350:26;:35::i;28294:193::-;28416:60;28468:7;28416:51;:60::i;19800:157::-;-1:-1:-1;;;;;19907:27:1;;19884:4;19907:27;;;:18;:27;;;;;:43;;19944:5;19907:36;:43::i;11177:132::-;11243:7;52182:55;;;;-1:-1:-1;;52182:55:1;11269:33;52082:162;20769:2270;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;-1:-1:-1;51177:10:1;51168:4;51160:27;21335:68:::1;;;-1:-1:-1::0;;;;;;21358:20:1;::::1;::::0;;::::1;::::0;:44:::1;;-1:-1:-1::0;;;;;;21382:20:1;::::1;21392:10;21382:20;;21358:44;21331:125;;;21426:19;;;;;;;;;;;;;;21331:125;-1:-1:-1::0;;;;;21470:20:1;::::1;::::0;;:46:::1;;;21495:21;21509:6;51692:5:::0;-1:-1:-1;44880:44:1;;44645:286;21495:21:::1;21494:22;21470:46;21466:104;;;21539:20;;;;;;;;;;;;;;21466:104;52182:55:::0;;;;-1:-1:-1;;52182:55:1;21580:21:::1;21651:26:::0;;;:11:::1;:26;::::0;;;;:47;;;::::1;;;21647:109;;;21721:24;;;;;;;;;;;;;;21647:109;-1:-1:-1::0;;21803:26:1;::::1;21780:20;21803:26:::0;;;:11:::1;:26;::::0;;;;;;;:42;;;;;;;;;21880:17:::1;21864:33:::0;::::1;::::0;:58:::1;;;21917:5;21901:12;:21;;21864:58;21860:122;;;21949:18;;;;;;;;;;;;;;21860:122;21766:226;22017:15;22006:8;:26;22002:86;;;22055:22;;;;;;;;;;;;;;22002:86;22117:1;22102:16:::0;;;22098:71:::1;;22141:17;;;;;;;;;;;;;;22098:71;22179:18;22200:75;22214:6;22222;22230:14;22246:5;22253:8;22263:5;22270:4;;22200:13;:75::i;:::-;22179:96;;22313:41;22332:10;22344:9;;22313:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22313:18:1::1;::::0;-1:-1:-1;;;22313:41:1:i:1;:::-;-1:-1:-1::0;;;;;22303:51:1::1;:6;-1:-1:-1::0;;;;;22303:51:1::1;;;:126;;;;;22375:54;22399:6;22407:10;22419:9;;22375:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22375:23:1::1;::::0;-1:-1:-1;;;22375:54:1:i:1;:::-;22374:55;22303:126;22286:205;;;22461:19;;;;;;;;;;;;;;22286:205;-1:-1:-1::0;;22525:26:1;::::1;;::::0;;;:11:::1;:26;::::0;;;;;;;:42;;;;;;;;;22578:1:::1;22570:9:::0;::::1;22525:54:::0;;22605:47;;2313:25:270;;;22525:42:1;;:26;22605:47:::1;::::0;2286:18:270;22605:47:1::1;;;;;;;22892:12;22906:19:::0;22929:59:::1;22961:4;22968:6;22976:5;22983:4;;22929:23;:59::i;:::-;22891:97;;;;23004:7;22999:33;;23013:19;23025:6;23013:11;:19::i;:::-;21068:1971;;;;20769:2270:::0;;;;;;;;;;:::o;19262:306::-;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;8073:297;19447:7:::1;6857:84;6886:7;6910:4;6935::::0;6857:18:::1;:84::i;:::-;-1:-1:-1::0;;;;;;19466:27:1;::::2;;::::0;;;:18:::2;:27;::::0;;;;:51:::2;::::0;19502:6;19510;19466:35:::2;:51::i;:::-;19527:34;19553:7;19527:25;:34::i;:::-;8380:1:::1;19262:306:::0;;;:::o;26576:1170::-;26708:41;26763:52;26829:50;26905:12;26919:19;26950:4;-1:-1:-1;;;;;26942:26:1;26984:4;-1:-1:-1;;;;;26984:16:1;;27002:5;;26969:39;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26969:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;26942:67;;;;-1:-1:-1;26942:67:1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26904:105;;;;27024:7;27020:188;;;27054:16;;;;;;;;;;;;;;27020:188;27107:1;27091:6;:13;:17;:71;;;-1:-1:-1;27130:32:1;27112:14;27119:6;27112:14;:::i;:::-;:50;;;;27091:71;27087:121;;;27178:19;27190:6;27178:11;:19::i;:::-;27255:13;;27538:14;;;27363:1;27351:14;;27523:30;;;27351:14;27658:81;;;;;;;;;;:::i;:::-;27573:166;;;;-1:-1:-1;27573:166:1;;-1:-1:-1;26576:1170:1;-1:-1:-1;;;;;26576:1170:1:o;25221:1324::-;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;-1:-1:-1;25516:15:1::1;25534:16:::0;25342:41:::1;::::0;;;;;1437:66:3;2827:38;;:43;25561:97:1::1;;25620:27;;;;;;;;;;;;;;25561:97;4438:33:3::0;;;25668:16:1::1;:77:::0;25773:5;;25814:29:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;25814:29:1::1;;;;;;;;;;;;;;;;25795:48;;25859:9;25854:280;25874:6;25870:1;:10;25854:280;;;25901:23;25927:5;;25933:1;25927:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;25901:34:::0;-1:-1:-1;26025:98:1::1;26056:19;;::::0;::::1;25901:34:::0;26056:19:::1;:::i;:::-;26077:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;26101:10;::::0;::::1;;26113:9;;::::0;::::1;26101:4:::0;26113:9:::1;:::i;:::-;26025:30;:98::i;:::-;25950:16;25967:1;25950:19;;;;;;;;:::i;:::-;;;;;;;:27;;25979:16;25996:1;25979:19;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:26:::1;25949:174:::0;;;;;::::1;;::::0;;-1:-1:-1;25882:3:1::1;;25854:280;;;-1:-1:-1::0;26163:67:1::1;26227:1;1569:66:3::0;3283:41;;26163:34:1::1;3184:148:3::0;26163:67:1::1;26144:16;:86:::0;;;26269:41:::1;::::0;:24:::1;:41::i;:::-;26241:69;;26346:39;26371:13;26346:24;:39::i;:::-;26396:16;:31:::0;;;26445:93:::1;::::0;::::1;::::0;;26320:65;;-1:-1:-1;26445:93:1::1;::::0;26469:16;;26487:25;;26320:65;;26445:93:::1;;;:::i;:::-;;;;;;;;18252:157:::0;-1:-1:-1;;;;;18359:27:1;;18336:4;18359:27;;;:18;:27;;;;;:43;;18396:5;18359:36;:43::i;15722:2298::-;15835:17;15855:85;15884:7;15908:4;15933:5;15855:18;:85::i;:::-;15835:105;-1:-1:-1;;;52182:55:1;;;;;15950:21;51692:5;51664:26;;;51661:37;16399:90;;-1:-1:-1;;16457:26:1;;;;;;:11;:26;;;;;:32;-1:-1:-1;;;;;16457:32:1;16399:90;;;16445:9;16399:90;16383:106;;16634:9;-1:-1:-1;;;;;16625:18:1;:5;-1:-1:-1;;;;;16625:18:1;;;:43;;;;;16659:9;-1:-1:-1;;;;;16647:21:1;:8;-1:-1:-1;;;;;16647:21:1;;;16625:43;16621:100;;;16691:19;;;;;;;;;;;;;;16621:100;-1:-1:-1;;;;;16826:25:1;;16846:4;16826:25;;:69;;-1:-1:-1;51692:5:1;51664:26;;;51661:37;16855:40;16822:127;;;16918:20;;;;;;;;;;;;;;16822:127;-1:-1:-1;;17570:29:1;;17314:15;17570:29;;;:14;:29;;;;;;;;-1:-1:-1;;;;;17570:39:1;;;;;;;;;;17332:1;17338:33;;;17332:40;;;;;;;;17649:10;:75;;17717:7;17716:8;17694:19;:30;17649:75;;;17684:7;17662:19;:29;17649:75;17619:105;;17762:19;17739;:42;17735:279;;17804:27;;;;;;;;;;;;;;17735:279;-1:-1:-1;;17862:29:1;;;;;;:14;:29;;;;;;;;-1:-1:-1;;;;;17862:39:1;;;;;;;;;;;;:61;;;17943:60;2313:25:270;;;17862:39:1;;:29;17943:60;;2286:18:270;17943:60:1;;;;;;;15825:2195;;;;;;15722:2298;;;:::o;28994:269::-;29066:16;;1437:66:3;2827:38;:43;29062:195:1;;29118:36;:17;29143:10;29118:24;:36::i;29062:195::-;29185:61;29235:10;29185:49;:61::i;:::-;28994:269::o;18082:139::-;-1:-1:-1;;;;;18181:27:1;;;;;;:18;:27;;;;;18146:16;;18181:33;;:31;:33::i;14113:467::-;14256:13;6126:98;6161:13;6191:5;6217;6126:18;:98::i;:::-;-1:-1:-1;;;14304:26:1;::::1;14281:20;14304:26:::0;;;:11:::1;:26;::::0;;;;;;;:42;;;;;;;;;14361:21;;::::1;14357:77;;14405:18;;;;;;;;;;;;;;14357:77;-1:-1:-1::0;;14444:26:1;::::1;;::::0;;;:11:::1;:26;::::0;;;;;;;:42;;;;;;;;;:50;;;14510:63;;22914:25:270;;;22955:18;;;22948:34;;;14444:42:1;;:26;14510:63:::1;::::0;22887:18:270;14510:63:1::1;;;;;;;14271:309;14113:467:::0;;;;:::o;23692:827::-;8087:10;8100:16;23999:19;;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;-1:-1:-1;;;;;;7241:27:1;;::::1;7214:24;7241:27:::0;;;:18:::1;:27;::::0;;;;:39;23963:17;;7241:39:::1;::::0;::::1;::::0;::::1;7315:40:::0;::::1;;7241:39:::0;7374:21;::::1;7370:92;;7422:25;;;;;;;;;;;;;;7370:92;-1:-1:-1::0;;;;;7480:24:1;::::1;7494:10;7480:24;7476:89;;7531:19;;;;;;;;;;;;;;7476:89;-1:-1:-1::0;;;;;;;24039:37:1;::::2;;::::0;;;:18:::2;:37;::::0;;;;:64:::2;::::0;24086:16;24039:46:::2;:64::i;:::-;24034:122;;24126:19;;;;;;;;;;;;;;24034:122;24166:15;24184:16:::0;3627:58:3;;;24210:16:1::2;:84:::0;;;24347:73:::2;24371:16:::0;24389:17;24408:5;24415:4;;24347:23:::2;:73::i;:::-;24327:93:::0;-1:-1:-1;24327:93:1;-1:-1:-1;24327:93:1;24431:33:::2;;24445:19;24457:6;24445:11;:19::i;:::-;24475:37;24499:12;24475:23;:37::i;:::-;24024:495;;8380:1:::1;23692:827:::0;;;;;;;:::o;14751:790::-;14872:17;14904:98;14939:13;14969:5;14995;14904:18;:98::i;:::-;14872:130;-1:-1:-1;;;;;;15108:25:1;;15128:4;15108:25;;:73;;-1:-1:-1;51692:5:1;51664:26;;;51661:37;15137:44;15104:131;;;15204:20;;;;;;;;;;;;;;15104:131;-1:-1:-1;;15249:29:1;;;;;;:14;:29;;;;;;;;-1:-1:-1;;;;;15249:39:1;;;;;;;;;;:59;;;15245:290;;15331:27;;;;;;;;;;;;;;15245:290;-1:-1:-1;;15389:29:1;;;;;;:14;:29;;;;;;;;-1:-1:-1;;;;;15389:39:1;;;;;;;;;;;;:58;;;15467:57;2313:25:270;;;15389:39:1;;:29;15467:57;;2286:18:270;15467:57:1;;;;;;;14862:679;14751:790;;;:::o;24550:620::-;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;-1:-1:-1;24665:15:1::1;24683:16:::0;1437:66:3;2980:38;;24709:16:1::1;:51:::0;;;24788:5;;24810:306:::1;24830:6;24826:1;:10;24810:306;;;24857:23;24883:5;;24889:1;24883:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;24857:34:::0;-1:-1:-1;24906:12:1::1;::::0;24959:98:::1;24990:19;;::::0;::::1;24857:34:::0;24990:19:::1;:::i;:::-;25011:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;25035:10;::::0;::::1;;25047:9;;::::0;::::1;25035:4:::0;25047:9:::1;:::i;24959:98::-;24905:152;;;;25077:7;25072:33;;25086:19;25098:6;25086:11;:19::i;:::-;24843:273;;;24838:3;;;;;24810:306;;;;25126:37;25150:12;25126:23;:37::i;19988:412::-:0;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;8073:297;20150:7:::1;6857:84;6886:7;6910:4;6935::::0;6857:18:::1;:84::i;:::-;-1:-1:-1::0;20190:4:1::2;-1:-1:-1::0;;;;;20173:22:1;::::2;::::0;20169:55:::2;;20204:20;;;;;;;;;;;;;;20169:55;-1:-1:-1::0;;;;;20239:27:1;::::2;;::::0;;;:18:::2;:27;::::0;;;;:41:::2;::::0;20274:5;20239:34:::2;:41::i;:::-;20235:115;;;20327:5;-1:-1:-1::0;;;;;20301:38:1::2;20318:7;-1:-1:-1::0;;;;;20301:38:1::2;;20334:4;20301:38;;;;2907:14:270::0;2900:22;2882:41;;2870:2;2855:18;;2742:187;20301:38:1::2;;;;;;;;20235:115;20359:34;20385:7;20359:25;:34::i;10983:163::-:0;11070:4;51692:5;51664:26;;;51661:37;11093:46;51510:204;28807:156;28900:4;7739:16;;1569:66:3;3125:41;:46;7735:98:1;;7800:22;;;;;;;;;;;;;;7735:98;28923:33:::1;:17;28950:5:::0;28923:26:::1;:33::i;18440:412::-:0;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;8073:297;18602:7:::1;6857:84;6886:7;6910:4;6935::::0;6857:18:::1;:84::i;:::-;-1:-1:-1::0;18642:4:1::2;-1:-1:-1::0;;;;;18625:22:1;::::2;::::0;18621:55:::2;;18656:20;;;;;;;;;;;;;;18621:55;-1:-1:-1::0;;;;;18691:27:1;::::2;;::::0;;;:18:::2;:27;::::0;;;;:41:::2;::::0;18726:5;18691:34:::2;:41::i;:::-;18687:115;;;18779:5;-1:-1:-1::0;;;;;18753:38:1::2;18770:7;-1:-1:-1::0;;;;;18753:38:1::2;;18786:4;18753:38;;;;2907:14:270::0;2900:22;2882:41;;2870:2;2855:18;;2742:187;27806:177:1;27909:7;7739:16;;1569:66:3;3125:41;:46;7735:98:1;;7800:22;;;;;;;;;;;;;;7735:98;-1:-1:-1;;;;;;27935:27:1::1;;::::0;;;:18:::1;:27;::::0;;;;9915:19:4;;;;;;;27806:177:1:o;18883:348::-;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;8073:297;19046:7:::1;6857:84;6886:7;6910:4;6935::::0;6857:18:::1;:84::i;:::-;-1:-1:-1::0;;;;;;19069:27:1;::::2;;::::0;;;:18:::2;:27;::::0;;;;:41:::2;::::0;19104:5;19069:34:::2;:41::i;:::-;19065:116;;;19157:5;-1:-1:-1::0;;;;;19131:39:1::2;19148:7;-1:-1:-1::0;;;;;19131:39:1::2;;19164:5;19131:39;;;;2907:14:270::0;2900:22;2882:41;;2870:2;2855:18;;2742:187;29294:141:1;8736:15;8754:16;1569:66:3;3125:41;;:46;8781:94:1;;8842:22;;;;;;;;;;;;;;8781:94;8904:67;8968:1;1569:66:3;3283:41;;8904:34:1;3184:148:3;8904:67:1;8885:16;:86;29392:36:::1;:17;29417:10;29392:24;:36::i;:::-;-1:-1:-1::0;8994:16:1;:31;29294:141::o;20431:292::-;8087:10;8100:16;1569:66:3;3125:41;;:46;8131:97:1;;8191:22;;;;;;;;;;;;;;8131:97;1718:66:3;3441:58;;:63;8242:118:1;;8312:33;;;;;;;;;;;;;;8242:118;-1:-1:-1;;;;;;20551:27:1;::::1;;::::0;;;:18:::1;:27;::::0;;;;:46:::1;::::0;20586:10:::1;20551:34;:46::i;:::-;20547:126;;;20618:44;::::0;20656:5:::1;2882:41:270::0;;20644:10:1::1;::::0;-1:-1:-1;;;;;20618:44:1;::::1;::::0;::::1;::::0;2870:2:270;2855:18;20618:44:1::1;;;;;;;20547:126;20682:34;20708:7;20682:25;:34::i;19630:139::-:0;-1:-1:-1;;;;;19729:27:1;;;;;;:18;:27;;;;;19694:16;;19729:33;;:31;:33::i;5121:2149:4:-;5242:23;;5203:4;;5242:23;;;-1:-1:-1;;;;;5242:23:4;;5297:22;;;;5347:19;;;;;5381:16;;;5377:34;;5406:5;5399:12;;;;;;;5377:34;5422:19;5471:7;-1:-1:-1;;;;;5455:23:4;:12;-1:-1:-1;;;;;5455:23:4;;5451:288;;-1:-1:-1;2087:1:4;5494:176;5549:11;5535;:25;5494:176;;;5641:7;-1:-1:-1;;;;;5599:49:4;:10;:19;;5619:11;5599:32;;;;;;;:::i;:::-;;:38;-1:-1:-1;;;;;5599:38:4;5595:60;5650:5;5595:60;5562:13;;5494:176;;;5703:11;5688;:26;5684:44;;5723:5;5716:12;;;;;;;;5684:44;5819:11;5834:1;5819:16;5815:236;;-1:-1:-1;5985:30:4;5941;;;;;;5985;;;;;-1:-1:-1;5851:26:4;;-1:-1:-1;6029:11:4;;-1:-1:-1;6029:11:4;5815:236;6124:15;;;6061:17;6138:1;6333:19;;6124:15;6333:30;;;;;;;:::i;:::-;;6296:67;;6392:9;6377:11;:24;6373:828;;6421:11;6436:1;6421:16;6417:562;;6483:17;;6457:43;;6625:30;6518:41;;;6577:30;;;;6483:17;-1:-1:-1;;;;;6483:17:4;;;6457:43;;;;6577:30;;;;;;;;;;;;;6625;;;;;6373:828;;6417:562;6735:17;;-1:-1:-1;;;;;6735:17:4;;6694:19;;6714:11;6694:32;;;;;;;:::i;:::-;;:58;;;;-1:-1:-1;;;;;6694:58:4;;;;;;6771:38;;6934:30;6827:41;;;6886:30;;;;6694:58;6771:38;;;;;;;6886:30;;;;;;;;;;;;;6934;;;;;6373:828;;;7009:38;;7160:30;7061:41;;;7116:30;;;;7009:38;-1:-1:-1;;;;;7009:38:4;;;7116:30;;;;;;;;;;;;;7160;;;;;6373:828;7211:30;;;;;;-1:-1:-1;;;5121:2149:4;-1:-1:-1;;;;;;;5121:2149:4:o;33248:479:1:-;-1:-1:-1;;33434:26:1;;33399:7;33434:26;;;:11;:26;;;;;:32;-1:-1:-1;;;;;33434:32:1;33484:236;33526:19;;:91;;33612:5;33526:91;;;33556:52;;;;;;33526:91;33646:13;33692:17;33484:18;:236::i;:::-;33477:243;33248:479;-1:-1:-1;;;;;33248:479:1:o;53040:924::-;-1:-1:-1;;52182:55:1;;;;;53165:17;53277:26;;;:11;:26;;;;;:32;53165:17;;52182:55;-1:-1:-1;;;;;53277:32:1;;53424:37;;53456:5;53449:12;;;;;;53424:37;-1:-1:-1;;53903:29:1;;;;53827:15;53903:29;;;:14;:29;;;;;;;;-1:-1:-1;;;;;53903:39:1;;;;;;;;;;;53845:1;53851:33;;;;53845:40;;;;;;;53903:49;:54;;;53040:924;-1:-1:-1;53040:924:1:o;10290:482:4:-;10418:23;;10379:4;;-1:-1:-1;;;;;10418:23:4;;;;;10473:22;;10510:16;;;10506:34;;10535:5;10528:12;;;;;;10506:34;10570:7;-1:-1:-1;;;;;10554:23:4;:12;-1:-1:-1;;;;;10554:23:4;;10550:40;;10586:4;10579:11;;;;;;10550:40;2087:1;10601:142;10644:11;10640:1;:15;10601:142;;;10712:7;-1:-1:-1;;;;;10680:39:4;:10;:19;;10700:1;10680:22;;;;;;;:::i;:::-;;:28;-1:-1:-1;;;;;10680:28:4;:39;10676:56;;10728:4;10721:11;;;;;;;10676:56;10657:3;;10601:142;;;-1:-1:-1;10760:5:4;;10290:482;-1:-1:-1;;;;;10290:482:4:o;36922:1104:1:-;37113:12;37127:19;37188:4;-1:-1:-1;;;;;37162:31:1;;;37158:862;;-1:-1:-1;;;;;37213:31:1;;;37209:97;;37271:20;;;;;;;;;;;;;;37209:97;37324:10;;37320:74;;37361:18;;;;;;;;;;;;;;37320:74;37538:32;;37546:4;;37538:32;;37565:4;;;;37538:32;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37518:52:1;;-1:-1:-1;37518:52:1;-1:-1:-1;37158:862:1;;;-1:-1:-1;;;;;37747:28:1;;37765:10;37747:28;37743:161;;37795:94;37824:17;37858:4;37883;37795:18;:94::i;:::-;;37743:161;37938:71;37962:14;37978:17;37997:5;38004:4;;37938:23;:71::i;:::-;37918:91;;-1:-1:-1;37918:91:1;-1:-1:-1;37158:862:1;36922:1104;;;;;;;;:::o;54184:232::-;54254:13;;:18;54250:127;;54345:6;54339:13;54330:6;54326:2;54322:15;54315:38;54250:127;54393:16;;;;;;;;;;;;;;38611:364;1437:66:3;2827:38;;38688:239:1;;38760:67;38824:1;1569:66:3;3283:41;;38760:34:1;3184:148:3;38760:67:1;38741:16;:86;;;38842:31;;:14;:31::i;:::-;38887:29;38902:13;38887:14;:29::i;:::-;38937:16;:31;38611:364::o;3270:1206:4:-;3391:23;;3352:4;;3391:23;;;-1:-1:-1;;;;;3391:23:4;;3446:22;;;;3496:19;;;;;3530:16;;;3526:494;;3823:26;;3954:30;3910;;;;;;3954;;;;;-1:-1:-1;;;;;3863:33:4;;3823:26;3863:33;;;;;;;;;3848:1;3863:33;;;3954:30;;;;;;;;;3848:1;-1:-1:-1;3998:11:4;;-1:-1:-1;;3998:11:4;3526:494;4050:7;-1:-1:-1;;;;;4034:23:4;:12;-1:-1:-1;;;;;4034:23:4;;4030:41;;4066:5;4059:12;;;;;;;4030:41;2087:1;4082:143;4125:11;4121:1;:15;4082:143;;;4193:7;-1:-1:-1;;;;;4161:39:4;:10;:19;;4181:1;4161:22;;;;;;;:::i;:::-;;:28;-1:-1:-1;;;;;4161:28:4;:39;4157:57;;4209:5;4202:12;;;;;;;;4157:57;4138:3;;4082:143;;;-1:-1:-1;4239:31:4;;;4235:61;;4279:17;;;;;;;;;;;;;;4235:61;4348:7;4307:10;:19;;4327:11;4307:32;;;;;;;:::i;:::-;;:48;;;;-1:-1:-1;;;;;4307:48:4;;;;;;;;;;-1:-1:-1;4390:47:4;;;;-1:-1:-1;4421:15:4;;;4390:47;;;;;;-1:-1:-1;;;3270:1206:4;-1:-1:-1;;3270:1206:4:o;41202:212:1:-;8736:15;8754:16;1569:66:3;3125:41;;:46;8781:94:1;;8842:22;;;;;;;;;;;;;;8781:94;8904:67;8968:1;1569:66:3;3283:41;;8904:34:1;3184:148:3;8904:67:1;8885:16;:86;41365:42:::1;41399:7:::0;41365:33:::1;:42::i;:::-;8994:16:::0;:31;-1:-1:-1;41202:212:1:o;42442:204::-;8736:15;8754:16;1569:66:3;3125:41;;:46;8781:94:1;;8842:22;;;;;;;;;;;;;;8781:94;8904:67;8968:1;1569:66:3;3283:41;;8904:34:1;3184:148:3;8904:67:1;8885:16;:86;42601:38:::1;42633:5:::0;42601:31:::1;:38::i;45504:929::-:0;45737:18;45767:23;45822:15;45805:13;:32;:87;;1344:4;;;;;;;;;;;;;;;;;50236:64;;1403:80;50236:64;;;26689:25:270;1328:22:1;26730:18:270;;;26723:34;50271:13:1;26773:18:270;;;26766:34;50294:4:1;26816:18:270;;;;26809:83;;;;50236:64:1;;;;;;;;;;26661:19:270;;;;50236:64:1;;;50226:75;;;;;45805:87;;;45840:23;45805:87;45767:125;;45903:18;1534:143;45975:6;45983;45991:14;46007:5;46014:8;46024:5;46041:4;;46031:15;;;;;;;:::i;:::-;;;;;;;;;;45947:100;;;23612:25:270;;;;-1:-1:-1;;;;;23734:15:270;;;23714:18;;;23707:43;23786:15;;;;23766:18;;;23759:43;23818:18;;;23811:34;;;;23861:19;;;23854:35;23905:19;;;23898:35;23949:19;;;23942:35;23993:19;;;23986:35;;;;23584:19;;45947:100:1;;;;;;;;;;;;45924:133;;;;;;45903:154;;46251:10;46245:4;46238:24;46288:15;46282:4;46275:29;46330:10;46324:4;46317:24;46384:4;46378;46368:21;46354:35;;46415:1;46409:4;46402:15;46224:203;;45504:929;;;;;;;;;;:::o;47011:1692::-;47100:14;47130:9;:16;47150:2;47130:22;47126:45;;-1:-1:-1;47169:1:1;47154:17;;47126:45;47453:4;47438:20;;47432:27;47498:4;47483:20;;47477:27;47551:4;47536:20;;47530:27;47182:9;47522:36;48469:66;48456:79;;48452:127;;;48566:1;48551:17;;;;;;;48452:127;48672:24;;;;;;;;;;;;24259:25:270;;;24332:4;24320:17;;24300:18;;;24293:45;;;;24354:18;;;24347:34;;;24397:18;;;24390:34;;;48672:24:1;;24231:19:270;;48672:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48672:24:1;;-1:-1:-1;;48672:24:1;;;47011:1692;-1:-1:-1;;;;;;;47011:1692:1:o;49490:495::-;49630:12;49658:6;-1:-1:-1;;;;;49658:18:1;;49680:1;49658:23;49654:41;;-1:-1:-1;49690:5:1;49683:12;;49654:41;49707:12;49721:19;49756:6;-1:-1:-1;;;;;49756:17:1;49817:4;49823:9;49774:60;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49774:60:1;;;;;;;;;;;;;;;;;;;;49756:79;;;49774:60;49756:79;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49706:129;;;;49856:7;:30;;;;;49867:6;:13;49884:2;49867:19;49856:30;:122;;;;-1:-1:-1;49902:29:1;;49943:34;;49902:29;;;;;;;;;;;;:::i;:::-;:76;49856:122;49846:132;49490:495;-1:-1:-1;;;;;;49490:495:1:o;34182:1928::-;34366:12;34380:19;34424:17;34415:5;:26;34411:177;;34465:21;34457:29;;34411:177;;;34515:21;34507:5;:29;34503:85;;;34559:18;;;;;;;;;;;;;;34503:85;34598:15;34616:16;;;34662:12;:10;:12::i;:::-;34642:32;-1:-1:-1;51692:5:1;51664:26;;;51661:37;35385:85;;;-1:-1:-1;;;;;;35442:28:1;;35460:10;35442:28;35385:85;:136;;;-1:-1:-1;;;;;;35490:31:1;;35516:4;35490:31;35385:136;:184;;;-1:-1:-1;1718:66:3;3441:58;;:63;;35525:44:1;35368:466;;;4128:46:3;;;-1:-1:-1;;;;;2657:65:3;;4128:46;35594:16:1;:100;35368:466;;;1854:66:3;-1:-1:-1;;;;;2657:65:3;;2676:26;2658:44;;2657:65;3963:45;35725:16:1;:98;35368:466;-1:-1:-1;;;;;35849:142:1;;52182:55;;;;-1:-1:-1;;52182:55:1;-1:-1:-1;;35849:142:1;-1:-1:-1;;;;;35849:142:1;;;35934:17;35969:12;35976:4;;35969:12;:::i;:::-;35849:142;;;-1:-1:-1;;;;;25482:55:270;;;25464:74;;25586:66;25574:79;;;25569:2;25554:18;;25547:107;25437:18;35849:142:1;;;;;;;36022:14;-1:-1:-1;;;;;36022:19:1;36049:5;36056:4;;36022:39;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36072:16:1;:31;;;;36002:59;;;-1:-1:-1;34182:1928:1;;-1:-1:-1;;;;;;;34182:1928:1:o;30760:1788::-;52182:55;;;;-1:-1:-1;;52182:55:1;30905:7;31007:26;;;:11;:26;;;;;:32;30905:7;;52182:55;-1:-1:-1;;;;;31007:32:1;;;31069:41;;;;;30905:7;31140:12;:10;:12::i;:::-;31120:32;-1:-1:-1;31162:18:1;51692:5;51664:26;;;51661:37;31258:427;;;-1:-1:-1;;;;;31384:19:1;;31380:295;;-1:-1:-1;;31423:26:1;;;;;;:11;:26;;;;;;:52;;;;-1:-1:-1;;;;;31423:52:1;;;;;;;;31498:41;;31423:52;;-1:-1:-1;31423:52:1;;;;:26;31498:41;;;-1:-1:-1;31573:4:1;31380:295;;;31611:9;-1:-1:-1;;;;;31602:18:1;:5;-1:-1:-1;;;;;31602:18:1;;31598:77;;-1:-1:-1;31656:4:1;31598:77;31795:13;31794:14;:31;;;;;31812:13;31794:31;:90;;;;;31829:55;31865:7;31874:9;31829:35;:55::i;:::-;31790:141;;;-1:-1:-1;31916:4:1;31790:141;32047:13;:33;;;;;32073:7;-1:-1:-1;;;;;32064:16:1;:5;-1:-1:-1;;;;;32064:16:1;;;32047:33;:61;;;;-1:-1:-1;;;;;;32084:19:1;;;:24;;32047:61;32043:113;;;-1:-1:-1;32140:5:1;32043:113;32251:13;32246:71;;32287:19;;;;;;;;;;;;;;32246:71;32430:17;:33;;;;;32451:12;32430:33;32426:89;;;32486:18;;;;;;;;;;;;;;32426:89;-1:-1:-1;32532:9:1;30760:1788;-1:-1:-1;;;;;;;30760:1788:1:o;7819:675:4:-;7937:23;;-1:-1:-1;;;;;7937:23:4;;;;;7992:22;;;;;8029:16;;;;;;;;;:41;;;8059:11;8049:6;:21;;;;8029:41;8025:93;;;8093:14;;;;;;;;;;;;;;8025:93;8132:6;:11;;8142:1;8132:11;8128:360;;8239:10;:19;;8259:6;8239:27;;;;;;;;;:::i;:::-;;:33;-1:-1:-1;;;;;8239:33:4;8274:12;8160:10;8239:33;8185:19;;;:27;;;;;;;;;;:::i;:::-;;8159:128;;-1:-1:-1;;;;;8159:128:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8128:360;;;8408:10;:19;;8428:6;8408:27;;;;;;;;;:::i;:::-;;:33;-1:-1:-1;;;;;8408:33:4;;8443:19;;:27;;;;;;;;;;:::i;:::-;;:33;-1:-1:-1;;;;;8443:33:4;;8319:19;;:27;;;;;;;;;;:::i;:::-;;:33;8354:19;;;:27;;;;;;;;;;:::i;:::-;;8318:159;;-1:-1:-1;;;;;8318:159:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8128:360;7904:590;;7819:675;;;:::o;43315:814:1:-;43416:39;43471:29;;43503:7;:26;;;;;;;;:::i;:::-;;:198;;43632:69;:17;43676:24;43632:43;:69::i;:::-;43503:198;;;43544:73;:19;43590:26;43544:45;:73::i;:::-;43729:21;;43471:230;;-1:-1:-1;43729:21:1;43775:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;43775:31:1;;;;;;;;;;;;;;;;43760:46;;43822:9;43817:306;43837:6;43833:1;:10;43817:306;;;43865:22;43889:12;43903:19;43953:14;43968:1;43953:17;;;;;;;;:::i;:::-;;;;;;;43942:53;;;;;;;;;;;;:::i;:::-;43864:131;;;;;;44027:85;;;;;;;;44062:14;-1:-1:-1;;;;;44027:85:1;;;;;44087:7;44027:85;;;;;;44104:6;44027:85;;;44009:12;44022:1;44009:15;;;;;;;;:::i;:::-;;;;;;:103;;;;43850:273;;;43845:3;;;;;43817:306;;;;43461:668;;43315:814;;;:::o;9125:505:4:-;9243:23;;9192:16;;-1:-1:-1;;;;;9243:23:4;;;;;9298:22;;9220:20;9298:22;9356:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9356:26:4;;9330:52;;9397:11;9412:1;9397:16;9393:35;;9422:6;9125:505;-1:-1:-1;;;;9125:505:4:o;9393:35::-;9451:12;9439:6;9446:1;9439:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9439:24:4;;;:9;;;;;;;;;;;:24;2087:1;9474:126;9517:11;9513:1;:15;9474:126;;;9561:10;:19;;9581:1;9561:22;;;;;;;:::i;:::-;;:28;9549:9;;-1:-1:-1;;;;;9561:28:4;;;;9549:6;;9556:1;;9549:9;;;;;;:::i;:::-;-1:-1:-1;;;;;9549:40:4;;;:9;;;;;;;;;;;:40;9530:3;;9474:126;;;-1:-1:-1;9617:6:4;9125:505;-1:-1:-1;;;;9125:505:4:o;43042:267:1:-;43121:15;43110:7;:26;;;;;;;;:::i;:::-;;:192;;43236:66;:17;43270:31;43236:33;:66::i;43110:192::-;43151:70;:19;43187:33;43151:35;:70::i;40961:235::-;41049:12;41063:19;41086:35;41113:7;41086:26;:35::i;:::-;41048:73;;;;41137:7;41132:58;;41160:19;41172:6;41160:11;:19::i;42209:227::-;42293:12;42307:19;42330:31;42355:5;42330:24;:31::i;50653:159::-;50706:7;51177:10;51168:4;51160:27;50732:73;;-1:-1:-1;50795:10:1;;10634:130::o;50732:73::-;-1:-1:-1;50753:16:1;;-1:-1:-1;;;;;2482:43:3;;10634:130:1:o;41799:404::-;41972:43;;;;;;;;;;;;;;;;;;;;;;41961:55;;41874:12;;41888:19;;41874:12;;-1:-1:-1;;;;;41961:10:1;;;:55;;41972:43;41961:55;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41941:75:1;-1:-1:-1;41941:75:1;-1:-1:-1;41941:75:1;42049:30;;;;;42060:6;:13;42077:2;42060:19;42049:30;:108;;;;-1:-1:-1;42083:29:1;;42124:32;;42083:29;;;;;;;;;;;;:::i;:::-;:74;42049:108;42173:23;;42027:130;;-1:-1:-1;;;;;;42173:23:1;;;;;;;;41909:294;41799:404;;;:::o;12706:1123:4:-;12917:22;;12869:14;;12917:22;;;;;12972:23;;-1:-1:-1;;;;;12972:23:4;;13023:19;;;;;12895;12917:22;13077:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13052:49;;13116:11;13131:1;13116:16;13112:36;;13141:7;-1:-1:-1;13134:14:4;;-1:-1:-1;;;13134:14:4;13112:36;13281:30;13241;;;;;13281;;;;;13184:1;;13360:22;13369:12;13360:22;;;:::i;:::-;13322:60;;;;13416:12;13430:7;13439:6;13405:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13392:7;13400:1;13392:10;;;;;;;;:::i;:::-;;;;;;;;;;:54;2087:1;13457:341;13500:11;13496:1;:15;13457:341;;;13532:15;13550:10;:19;;13570:1;13550:22;;;;;;;:::i;:::-;;:28;13617:55;;;;;;;;;13550:28;13617:55;;13550:28;13617:55;;;;;;-1:-1:-1;;;;;13550:28:4;;;;-1:-1:-1;13617:55:4;13592:19;;13612:1;13592:22;;;;;;;:::i;:::-;:80;;;;;;;;;;;-1:-1:-1;;;;;13592:80:4;;;;;;;:22;;:80;13707:17;13716:7;13707:17;;;:::i;:::-;13751:36;;13687:37;;-1:-1:-1;13687:37:4;-1:-1:-1;13751:36:4;;13762:7;;13687:37;;;;13751:36;;;:::i;:::-;;;;;;;;;;;;;13738:7;13746:1;13738:10;;;;;;;;:::i;:::-;;;;;;;;;;:49;-1:-1:-1;13513:3:4;;13457:341;;;-1:-1:-1;13815:7:4;;12706:1123;-1:-1:-1;;;;;;;;12706:1123:4:o;39698:1257:1:-;-1:-1:-1;;;;;39869:27:1;;;39777:12;39869:27;;;:18;:27;;;;;39933:37;;39777:12;;39791:19;;39933:37;;;;;;40001:38;;;;40063:31;;;;40109:21;;;40105:157;;40140:4;40132:17;;;;;;;;;;;;;;;;;;;;39698:1257;;;:::o;40105:157::-;40187:1;40168:16;:20;40164:98;;;-1:-1:-1;;40205:56:1;;;;;;;;;;;;;;;;;;;40228:32;40205:56;;;40198:5;;40205:56;;-1:-1:-1;39698:1257:1;-1:-1:-1;;;;39698:1257:1:o;40164:98::-;-1:-1:-1;;;;;40402:27:1;;;40273:12;40402:27;;;:18;:27;;;;;40273:12;;40315:21;;;40393:7;;40402:33;;:31;:33::i;:::-;40350:87;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;40350:87:1;;;;;;;;;;;;;;;;;;;;40315:132;;;40350:87;40315:132;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40295:152:1;-1:-1:-1;40295:152:1;-1:-1:-1;40295:152:1;40468:30;;;;;40479:6;:13;40496:2;40479:19;40468:30;:122;;;;-1:-1:-1;40514:29:1;;40555:34;;40514:29;;;;;;;;;;;;:::i;:::-;:76;40468:122;40458:132;;40605:7;40601:293;;;40628:63;;;;;;40705:51;;;;;;;;40628:63;-1:-1:-1;;;;;40705:51:1;;;;40844:39;;40770:60;40814:15;40770:60;;;40844:39;;;;;;;;;;;;;;40601:293;40937:10;-1:-1:-1;;;;;40909:39:1;40928:7;-1:-1:-1;;;;;40909:39:1;;;;;;;;;;;39812:1143;;;;;39698:1257;;;:::o;11265:760:4:-;11390:22;;;;;;;11445:23;;-1:-1:-1;;;;;11445:23:4;;11496:19;;;;;11368;11530:16;;;11526:29;;11548:7;;;11265:760;;:::o;11526:29::-;11687:30;11647;;;;;11687;;;;;11728:22;11737:12;11728:22;;;:::i;:::-;2087:1;11761:258;11804:11;11800:1;:15;11761:258;;;11836:15;11854:10;:19;;11874:1;11854:22;;;;;;;:::i;:::-;;:28;11921:55;;;;;;;;;11854:28;11921:55;;11854:28;11921:55;;;;;;-1:-1:-1;;;;;11854:28:4;;;;-1:-1:-1;11921:55:4;11896:19;;11916:1;11896:22;;;;;;;:::i;:::-;:80;;;;;;;;;;;-1:-1:-1;;;;;11896:80:4;;;;;;;:22;;:80;11991:17;12000:7;11991:17;;;:::i;:::-;-1:-1:-1;11817:3:4;;11761:258;;;;11358:667;;;11265:760;;:::o;14:250:270:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:270;238:16;;231:27;14:250::o;269:330::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;513:2;501:15;-1:-1:-1;;497:88:270;488:98;;;;588:4;484:109;;269:330;-1:-1:-1;;269:330:270:o;604:220::-;753:2;742:9;735:21;716:4;773:45;814:2;803:9;799:18;791:6;773:45;:::i;829:154::-;-1:-1:-1;;;;;908:5:270;904:54;897:5;894:65;884:93;;973:1;970;963:12;988:247;1047:6;1100:2;1088:9;1079:7;1075:23;1071:32;1068:52;;;1116:1;1113;1106:12;1068:52;1155:9;1142:23;1174:31;1199:5;1174:31;:::i;1240:220::-;1308:20;;-1:-1:-1;;1357:78:270;;1347:89;;1337:117;;1450:1;1447;1440:12;1465:118;1551:5;1544:13;1537:21;1530:5;1527:32;1517:60;;1573:1;1570;1563:12;1588:315;1653:6;1661;1714:2;1702:9;1693:7;1689:23;1685:32;1682:52;;;1730:1;1727;1720:12;1682:52;1753:29;1772:9;1753:29;:::i;:::-;1743:39;;1832:2;1821:9;1817:18;1804:32;1845:28;1867:5;1845:28;:::i;:::-;1892:5;1882:15;;;1588:315;;;;;:::o;1908:254::-;1976:6;1984;2037:2;2025:9;2016:7;2012:23;2008:32;2005:52;;;2053:1;2050;2043:12;2005:52;2076:29;2095:9;2076:29;:::i;:::-;2066:39;2152:2;2137:18;;;;2124:32;;-1:-1:-1;;;1908:254:270:o;2349:388::-;2417:6;2425;2478:2;2466:9;2457:7;2453:23;2449:32;2446:52;;;2494:1;2491;2484:12;2446:52;2533:9;2520:23;2552:31;2577:5;2552:31;:::i;:::-;2602:5;-1:-1:-1;2659:2:270;2644:18;;2631:32;2672:33;2631:32;2672:33;:::i;3246:347::-;3297:8;3307:6;3361:3;3354:4;3346:6;3342:17;3338:27;3328:55;;3379:1;3376;3369:12;3328:55;-1:-1:-1;3402:20:270;;3445:18;3434:30;;3431:50;;;3477:1;3474;3467:12;3431:50;3514:4;3506:6;3502:17;3490:29;;3566:3;3559:4;3550:6;3542;3538:19;3534:30;3531:39;3528:59;;;3583:1;3580;3573:12;3528:59;3246:347;;;;;:::o;3598:754::-;3695:6;3703;3711;3719;3727;3780:3;3768:9;3759:7;3755:23;3751:33;3748:53;;;3797:1;3794;3787:12;3748:53;3836:9;3823:23;3855:31;3880:5;3855:31;:::i;:::-;3905:5;-1:-1:-1;3962:2:270;3947:18;;3934:32;3975:33;3934:32;3975:33;:::i;:::-;4027:7;-1:-1:-1;4081:2:270;4066:18;;4053:32;;-1:-1:-1;4136:2:270;4121:18;;4108:32;4163:18;4152:30;;4149:50;;;4195:1;4192;4185:12;4149:50;4234:58;4284:7;4275:6;4264:9;4260:22;4234:58;:::i;:::-;3598:754;;;;-1:-1:-1;3598:754:270;;-1:-1:-1;4311:8:270;;4208:84;3598:754;-1:-1:-1;;;3598:754:270:o;4580:186::-;4639:6;4692:2;4680:9;4671:7;4667:23;4663:32;4660:52;;;4708:1;4705;4698:12;4660:52;4731:29;4750:9;4731:29;:::i;5257:1270::-;5401:6;5409;5417;5425;5433;5441;5449;5457;5465;5473;5526:3;5514:9;5505:7;5501:23;5497:33;5494:53;;;5543:1;5540;5533:12;5494:53;5582:9;5569:23;5601:31;5626:5;5601:31;:::i;:::-;5651:5;-1:-1:-1;5708:2:270;5693:18;;5680:32;5721:33;5680:32;5721:33;:::i;:::-;5773:7;-1:-1:-1;5827:2:270;5812:18;;5799:32;;-1:-1:-1;5878:2:270;5863:18;;5850:32;;-1:-1:-1;5929:3:270;5914:19;;5901:33;;-1:-1:-1;5981:3:270;5966:19;;5953:33;;-1:-1:-1;6037:3:270;6022:19;;6009:33;6061:18;6091:14;;;6088:34;;;6118:1;6115;6108:12;6088:34;6157:58;6207:7;6198:6;6187:9;6183:22;6157:58;:::i;:::-;6234:8;;-1:-1:-1;6131:84:270;-1:-1:-1;6322:3:270;6307:19;;6294:33;;-1:-1:-1;6339:16:270;;;6336:36;;;6368:1;6365;6358:12;6336:36;;6407:60;6459:7;6448:8;6437:9;6433:24;6407:60;:::i;:::-;6381:86;;6486:8;6476:18;;;6513:8;6503:18;;;5257:1270;;;;;;;;;;;;;:::o;6532:156::-;6598:20;;6658:4;6647:16;;6637:27;;6627:55;;6678:1;6675;6668:12;6693:387;6766:6;6774;6782;6835:2;6823:9;6814:7;6810:23;6806:32;6803:52;;;6851:1;6848;6841:12;6803:52;6890:9;6877:23;6909:31;6934:5;6909:31;:::i;:::-;6959:5;-1:-1:-1;6983:36:270;7015:2;7000:18;;6983:36;:::i;:::-;6973:46;;7038:36;7070:2;7059:9;7055:18;7038:36;:::i;:::-;7028:46;;6693:387;;;;;:::o;7085:644::-;7200:6;7208;7261:2;7249:9;7240:7;7236:23;7232:32;7229:52;;;7277:1;7274;7267:12;7229:52;7317:9;7304:23;7346:18;7387:2;7379:6;7376:14;7373:34;;;7403:1;7400;7393:12;7373:34;7441:6;7430:9;7426:22;7416:32;;7486:7;7479:4;7475:2;7471:13;7467:27;7457:55;;7508:1;7505;7498:12;7457:55;7548:2;7535:16;7574:2;7566:6;7563:14;7560:34;;;7590:1;7587;7580:12;7560:34;7643:7;7638:2;7628:6;7625:1;7621:14;7617:2;7613:23;7609:32;7606:45;7603:65;;;7664:1;7661;7654:12;7603:65;7695:2;7687:11;;;;;7717:6;;-1:-1:-1;7085:644:270;;-1:-1:-1;;;;7085:644:270:o;7734:1011::-;7804:3;7835;7867:5;7861:12;7894:6;7889:3;7882:19;7920:4;7949:2;7944:3;7940:12;7933:19;;8005:2;7995:6;7992:1;7988:14;7981:5;7977:26;7973:35;8042:2;8035:5;8031:14;8063:1;8073:646;8087:6;8084:1;8081:13;8073:646;;;8152:16;;;-1:-1:-1;;8148:89:270;8136:102;;8261:13;;8331:9;;-1:-1:-1;;;;;8327:58:270;8314:72;;8441:11;;;8435:18;8428:26;8421:34;8406:13;;;8399:57;8479:4;8522:11;;;8516:18;8297:4;8554:13;;;8547:25;;;8516:18;8593:46;8625:13;;;8516:18;8593:46;:::i;:::-;8697:12;;;;8585:54;-1:-1:-1;;;8662:15:270;;;;8109:1;8102:9;8073:646;;;-1:-1:-1;8735:4:270;;7734:1011;-1:-1:-1;;;;;;;7734:1011:270:o;8750:1683::-;9254:4;9302:2;9291:9;9287:18;9332:2;9321:9;9314:21;9355:6;9390;9384:13;9421:6;9413;9406:22;9459:3;9448:9;9444:19;9437:26;;9522:3;9512:6;9509:1;9505:14;9494:9;9490:30;9486:40;9472:54;;9545:4;9584:2;9576:6;9572:15;9605:1;9615:530;9629:6;9626:1;9623:13;9615:530;;;9694:22;;;9718:66;9690:95;9678:108;;9809:13;;9891:9;;9884:17;9877:25;9862:41;;9942:11;;9936:18;9845:4;9974:15;;;9967:27;;;10017:48;10049:15;;;9936:18;10017:48;:::i;:::-;10007:58;-1:-1:-1;;;10123:12:270;;;;10088:15;;;;9651:1;9644:9;9615:530;;;9619:3;;10193:9;10185:6;10181:22;10176:2;10165:9;10161:18;10154:50;;;;10227:61;10281:6;10273;10227:61;:::i;:::-;10213:75;;10338:9;10330:6;10326:22;10319:4;10308:9;10304:20;10297:52;10366:61;10420:6;10412;10366:61;:::i;10438:523::-;10512:6;10520;10528;10581:2;10569:9;10560:7;10556:23;10552:32;10549:52;;;10597:1;10594;10587:12;10549:52;10636:9;10623:23;10655:31;10680:5;10655:31;:::i;:::-;10705:5;-1:-1:-1;10762:2:270;10747:18;;10734:32;10775:33;10734:32;10775:33;:::i;:::-;10827:7;-1:-1:-1;10886:2:270;10871:18;;10858:32;10899:30;10858:32;10899:30;:::i;:::-;10948:7;10938:17;;;10438:523;;;;;:::o;10966:488::-;11019:3;11057:5;11051:12;11084:6;11079:3;11072:19;11110:4;11139;11134:3;11130:14;11123:21;;11178:4;11171:5;11167:16;11201:1;11211:218;11225:6;11222:1;11219:13;11211:218;;;11290:13;;-1:-1:-1;;;;;11286:62:270;11274:75;;11369:12;;;;11404:15;;;;11247:1;11240:9;11211:218;;;-1:-1:-1;11445:3:270;;10966:488;-1:-1:-1;;;;;10966:488:270:o;11459:261::-;11638:2;11627:9;11620:21;11601:4;11658:56;11710:2;11699:9;11695:18;11687:6;11658:56;:::i;11725:322::-;11802:6;11810;11818;11871:2;11859:9;11850:7;11846:23;11842:32;11839:52;;;11887:1;11884;11877:12;11839:52;11910:29;11929:9;11910:29;:::i;:::-;11900:39;11986:2;11971:18;;11958:32;;-1:-1:-1;12037:2:270;12022:18;;;12009:32;;11725:322;-1:-1:-1;;;11725:322:270:o;12052:321::-;12120:6;12128;12181:2;12169:9;12160:7;12156:23;12152:32;12149:52;;;12197:1;12194;12187:12;12149:52;12220:29;12239:9;12220:29;:::i;12378:389::-;12455:6;12463;12471;12524:2;12512:9;12503:7;12499:23;12495:32;12492:52;;;12540:1;12537;12530:12;12492:52;12563:29;12582:9;12563:29;:::i;:::-;12553:39;;12642:2;12631:9;12627:18;12614:32;12655:31;12680:5;12655:31;:::i;:::-;12378:389;;12705:5;;-1:-1:-1;;;12757:2:270;12742:18;;;;12729:32;;12378:389::o;12772:325::-;12860:6;12855:3;12848:19;12912:6;12905:5;12898:4;12893:3;12889:14;12876:43;;12964:1;12957:4;12948:6;12943:3;12939:16;12935:27;12928:38;12830:3;13086:4;-1:-1:-1;;13011:2:270;13003:6;12999:15;12995:88;12990:3;12986:98;12982:109;12975:116;;12772:325;;;;:::o;13102:2229::-;13339:2;13391:21;;;13364:18;;;13447:22;;;13310:4;;13488:2;13506:18;;;13570:1;13566:14;;;13551:30;;13547:39;;13609:6;13310:4;13643:1659;13657:6;13654:1;13651:13;13643:1659;;;13746:66;13734:9;13726:6;13722:22;13718:95;13713:3;13706:108;13866:6;13853:20;13953:66;13944:6;13928:14;13924:27;13920:100;13900:18;13896:125;13886:153;;14035:1;14032;14025:12;13886:153;14065:31;;14119:4;14151:19;;14183:33;14151:19;14183:33;:::i;:::-;-1:-1:-1;;;;;14309:16:270;;;14294:32;;14367:14;;;14354:28;;14395:33;14354:28;14395:33;:::i;:::-;14465:16;14448:15;;;14441:41;14532:14;;;14519:28;14502:15;;;14495:53;14571:4;14629:14;;;14616:28;14701:14;14697:26;;;14725:66;14693:99;14667:126;;14657:154;;14807:1;14804;14797:12;14657:154;14839:32;;;14947:16;;;;-1:-1:-1;14898:21:270;14990:18;14979:30;;14976:50;;;15022:1;15019;15012:12;14976:50;15075:6;15059:14;15055:27;15046:7;15042:41;15039:61;;;15096:1;15093;15086:12;15039:61;15137:2;15132;15124:6;15120:15;15113:27;15163:59;15218:2;15210:6;15206:15;15198:6;15189:7;15163:59;:::i;:::-;15280:12;;;;15153:69;-1:-1:-1;;;15245:15:270;;;;-1:-1:-1;;13679:1:270;13672:9;13643:1659;;;-1:-1:-1;15319:6:270;;13102:2229;-1:-1:-1;;;;;;;;13102:2229:270:o;15336:287::-;15465:3;15503:6;15497:13;15519:66;15578:6;15573:3;15566:4;15558:6;15554:17;15519:66;:::i;:::-;15601:16;;;;;15336:287;-1:-1:-1;;15336:287:270:o;15628:407::-;15711:5;15751;15745:12;15793:4;15786:5;15782:16;15776:23;15818:66;15910:2;15906;15902:11;15893:20;;15936:1;15928:6;15925:13;15922:107;;;15997:1;15993:14;;;;15990:1;15986:22;15982:31;;;15974:40;15970:49;;15628:407;-1:-1:-1;;15628:407:270:o;16040:184::-;16092:77;16089:1;16082:88;16189:4;16186:1;16179:15;16213:4;16210:1;16203:15;16229:253;16301:2;16295:9;16343:4;16331:17;;16378:18;16363:34;;16399:22;;;16360:62;16357:88;;;16425:18;;:::i;:::-;16461:2;16454:22;16229:253;:::o;16487:257::-;16559:4;16553:11;;;16591:17;;16638:18;16623:34;;16659:22;;;16620:62;16617:88;;;16685:18;;:::i;16749:334::-;16820:2;16814:9;16876:2;16866:13;;-1:-1:-1;;16862:86:270;16850:99;;16979:18;16964:34;;17000:22;;;16961:62;16958:88;;;17026:18;;:::i;:::-;17062:2;17055:22;16749:334;;-1:-1:-1;16749:334:270:o;17088:198::-;17163:4;17196:18;17188:6;17185:30;17182:56;;;17218:18;;:::i;:::-;-1:-1:-1;17263:1:270;17259:14;17275:4;17255:25;;17088:198::o;17291:568::-;17344:5;17397:3;17390:4;17382:6;17378:17;17374:27;17364:55;;17415:1;17412;17405:12;17364:55;17444:6;17438:13;17470:18;17466:2;17463:26;17460:52;;;17492:18;;:::i;:::-;17536:114;17644:4;-1:-1:-1;;17568:4:270;17564:2;17560:13;17556:86;17552:97;17536:114;:::i;:::-;17675:2;17666:7;17659:19;17721:3;17714:4;17709:2;17701:6;17697:15;17693:26;17690:35;17687:55;;;17738:1;17735;17728:12;17687:55;17751:77;17825:2;17818:4;17809:7;17805:18;17798:4;17790:6;17786:17;17751:77;:::i;:::-;17846:7;17291:568;-1:-1:-1;;;;17291:568:270:o;17864:1548::-;17946:5;17999:3;17992:4;17984:6;17980:17;17976:27;17966:55;;18017:1;18014;18007:12;17966:55;18046:6;18040:13;18072:4;18096:75;18112:58;18167:2;18112:58;:::i;:::-;18096:75;:::i;:::-;18205:15;;;18291:1;18287:10;;;;18275:23;;18271:32;;;18236:12;;;;18315:15;;;18312:35;;;18343:1;18340;18333:12;18312:35;18379:2;18371:6;18367:15;18391:992;18407:6;18402:3;18399:15;18391:992;;;18486:3;18480:10;18513:18;18563:2;18550:11;18547:19;18544:39;;;18579:1;18576;18569:12;18544:39;18618:11;18610:6;18606:24;18596:34;;18653:4;18764:2;-1:-1:-1;;18690:2:270;18685:3;18681:12;18677:85;18673:94;18670:114;;;18780:1;18777;18770:12;18670:114;18810:22;;:::i;:::-;18874:2;18870;18866:11;18860:18;18891:33;18916:7;18891:33;:::i;:::-;18937:22;;18982:2;19018:11;;;19012:18;19043:30;19012:18;19043:30;:::i;:::-;19093:14;;;19086:31;19152:11;;;19146:18;;19180:16;;;19177:36;;;19209:1;19206;19199:12;19177:36;19249:60;19305:3;19300:2;19289:8;19285:2;19281:17;19277:26;19249:60;:::i;:::-;19233:14;;;19226:84;19323:18;;-1:-1:-1;;;19361:12:270;;;;18424;;18391:992;;;-1:-1:-1;19401:5:270;17864:1548;-1:-1:-1;;;;;;17864:1548:270:o;19417:2154::-;19683:6;19691;19699;19752:2;19740:9;19731:7;19727:23;19723:32;19720:52;;;19768:1;19765;19758:12;19720:52;19801:9;19795:16;19830:18;19871:2;19863:6;19860:14;19857:34;;;19887:1;19884;19877:12;19857:34;19925:6;19914:9;19910:22;19900:32;;19970:7;19963:4;19959:2;19955:13;19951:27;19941:55;;19992:1;19989;19982:12;19941:55;20021:2;20015:9;20043:4;20067:75;20083:58;20138:2;20083:58;:::i;20067:75::-;20176:15;;;20258:1;20254:10;;;;20246:19;;20242:28;;;20207:12;;;;20282:19;;;20279:39;;;20314:1;20311;20304:12;20279:39;20346:2;20342;20338:11;20358:771;20374:6;20369:3;20366:15;20358:771;;;20453:3;20447:10;20489:2;20476:11;20473:19;20470:39;;;20505:1;20502;20495:12;20470:39;20532:20;;20663:4;20576:16;;;-1:-1:-1;;20572:89:270;20568:100;20565:120;;;20681:1;20678;20671:12;20565:120;20711:22;;:::i;:::-;20775:2;20771;20767:11;20761:18;20792:30;20814:7;20792:30;:::i;:::-;20835:22;;20900:4;20892:13;;20886:20;20922:16;;;20919:36;;;20951:1;20948;20941:12;20919:36;20991:64;21047:7;21042:2;21031:8;21027:2;21023:17;21019:26;20991:64;:::i;:::-;20975:14;;;20968:88;-1:-1:-1;21069:18:270;;-1:-1:-1;21107:12:270;;;;20391;;20358:771;;;-1:-1:-1;21184:18:270;;;21178:25;21148:5;;-1:-1:-1;21178:25:270;;-1:-1:-1;;;21215:16:270;;;21212:36;;;21244:1;21241;21234:12;21212:36;21267:91;21350:7;21339:8;21328:9;21324:24;21267:91;:::i;:::-;21257:101;;21404:4;21393:9;21389:20;21383:27;21367:43;;21435:2;21425:8;21422:16;21419:36;;;21451:1;21448;21441:12;21419:36;;21474:91;21557:7;21546:8;21535:9;21531:24;21474:91;:::i;:::-;21464:101;;;19417:2154;;;;;:::o;21576:184::-;21628:77;21625:1;21618:88;21725:4;21722:1;21715:15;21749:4;21746:1;21739:15;21765:385;21860:4;21918:11;21905:25;22008:66;21997:8;21981:14;21977:29;21973:102;21953:18;21949:127;21939:155;;22090:1;22087;22080:12;22155:580;22232:4;22238:6;22298:11;22285:25;22388:66;22377:8;22361:14;22357:29;22353:102;22333:18;22329:127;22319:155;;22470:1;22467;22460:12;22319:155;22497:33;;22549:20;;;-1:-1:-1;22592:18:270;22581:30;;22578:50;;;22624:1;22621;22614:12;22578:50;22657:4;22645:17;;-1:-1:-1;22688:14:270;22684:27;;;22674:38;;22671:58;;;22725:1;22722;22715:12;22993:271;23176:6;23168;23163:3;23150:33;23132:3;23202:16;;23227:13;;;23202:16;22993:271;-1:-1:-1;22993:271:270:o;24435:289::-;24610:6;24599:9;24592:25;24653:2;24648;24637:9;24633:18;24626:30;24573:4;24673:45;24714:2;24703:9;24699:18;24691:6;24673:45;:::i;24729:184::-;24799:6;24852:2;24840:9;24831:7;24827:23;24823:32;24820:52;;;24868:1;24865;24858:12;24820:52;-1:-1:-1;24891:16:270;;24729:184;-1:-1:-1;24729:184:270:o;24918:369::-;25076:66;25038:19;;25160:11;;;;25191:1;25183:10;;25180:101;;;25268:2;25262;25255:3;25252:1;25248:11;25245:1;25241:19;25237:28;25233:2;25229:37;25225:46;25216:55;;25180:101;;;24918:369;;;;:::o;25665:184::-;25717:77;25714:1;25707:88;25814:4;25811:1;25804:15;25838:4;25835:1;25828:15;25854:599;25956:6;25964;25972;26025:2;26013:9;26004:7;26000:23;25996:32;25993:52;;;26041:1;26038;26031:12;25993:52;26073:9;26067:16;26092:31;26117:5;26092:31;:::i;:::-;26192:2;26177:18;;26171:25;26142:5;;-1:-1:-1;26205:30:270;26171:25;26205:30;:::i;:::-;26305:2;26290:18;;26284:25;26254:7;;-1:-1:-1;26332:18:270;26321:30;;26318:50;;;26364:1;26361;26354:12;26318:50;26387:60;26439:7;26430:6;26419:9;26415:22;26387:60;:::i;26903:419::-;-1:-1:-1;;;;;27104:6:270;27100:55;27089:9;27082:74;27206:6;27199:14;27192:22;27187:2;27176:9;27172:18;27165:50;27251:2;27246;27235:9;27231:18;27224:30;27063:4;27271:45;27312:2;27301:9;27297:18;27289:6;27271:45;:::i;27327:381::-;-1:-1:-1;;;;;27538:6:270;27534:55;27523:9;27516:74;27626:2;27621;27610:9;27606:18;27599:30;27497:4;27646:56;27698:2;27687:9;27683:18;27675:6;27646:56;:::i","linkReferences":{},"immutableReferences":{"132":[{"start":13225,"length":32}],"134":[{"start":13436,"length":32}]}},"methodIdentifiers":{"areChecksDeferred()":"430292b3","areChecksInProgress()":"e21e537c","batch((address,address,uint256,bytes)[])":"c16ae7a4","batchRevert((address,address,uint256,bytes)[])":"7f5c92f3","batchSimulation((address,address,uint256,bytes)[])":"7f17c377","call(address,address,uint256,bytes)":"1f8b5215","controlCollateral(address,address,uint256,bytes)":"b9b70ff5","disableCollateral(address,address)":"e920e8e0","disableController(address)":"f4fc3570","enableCollateral(address,address)":"d44fee5a","enableController(address,address)":"c368516c","forgiveAccountStatusCheck(address)":"10a75198","forgiveVaultStatusCheck()":"ebf1ea86","getAccountOwner(address)":"442b172c","getAddressPrefix(address)":"506d8c92","getCollaterals(address)":"a4d25d1e","getControllers(address)":"fd6046d7","getCurrentOnBehalfOfAccount(address)":"18503a1e","getLastAccountStatusCheckTimestamp(address)":"df7c1384","getNonce(bytes19,uint256)":"12d6c936","getOperator(bytes19,address)":"b03c130d","getRawExecutionContext()":"3a1a3a1d","haveCommonOwner(address,address)":"c760d921","isAccountOperatorAuthorized(address,address)":"1647292a","isAccountStatusCheckDeferred(address)":"42e53499","isCollateralEnabled(address,address)":"9e716d58","isControlCollateralInProgress()":"863789d7","isControllerEnabled(address,address)":"47cfdac4","isLockdownMode(bytes19)":"3b10f3ef","isOperatorAuthenticated()":"3b2416be","isPermitDisabledMode(bytes19)":"cb29955a","isSimulationInProgress()":"92d2fc01","isVaultStatusCheckDeferred(address)":"cdd8ea78","name()":"06fdde03","permit(address,address,uint256,uint256,uint256,uint256,bytes,bytes)":"5bedd1cd","reorderCollaterals(address,uint8,uint8)":"642ea23f","requireAccountAndVaultStatusCheck(address)":"30f31667","requireAccountStatusCheck(address)":"46591032","requireVaultStatusCheck()":"a37d54af","setAccountOperator(address,address,bool)":"9f5c462a","setLockdownMode(bytes19,bool)":"129d21a0","setNonce(bytes19,uint256,uint256)":"a829aaf5","setOperator(bytes19,address,uint256)":"c14c11bf","setPermitDisabledMode(bytes19,bool)":"116d0e93"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"EVC_BatchPanic\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_ChecksReentrancy\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_ControlCollateralReentrancy\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_ControllerViolation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_EmptyError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidOperatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_LockdownMode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_NotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_OnBehalfOfAccountNotAuthenticated\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_PermitDisabledMode\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.BatchItemResult[]\",\"name\":\"batchItemsResult\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"checkedAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.StatusCheckResult[]\",\"name\":\"accountsStatusResult\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"checkedAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.StatusCheckResult[]\",\"name\":\"vaultsStatusResult\",\"type\":\"tuple[]\"}],\"name\":\"EVC_RevertedBatchResult\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_SimulationBatchNested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyElements\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"}],\"name\":\"AccountStatusCheck\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"onBehalfOfAddressPrefix\",\"type\":\"bytes19\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"CallWithContext\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"collateral\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"CollateralStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"controller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"ControllerStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"LockdownModeStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonceNamespace\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNonce\",\"type\":\"uint256\"}],\"name\":\"NonceStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonceNamespace\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"NonceUsed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accountOperatorAuthorized\",\"type\":\"uint256\"}],\"name\":\"OperatorStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"PermitDisabledModeStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"VaultStatusCheck\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"areChecksDeferred\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"areChecksInProgress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.BatchItem[]\",\"name\":\"items\",\"type\":\"tuple[]\"}],\"name\":\"batch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.BatchItem[]\",\"name\":\"items\",\"type\":\"tuple[]\"}],\"name\":\"batchRevert\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.BatchItem[]\",\"name\":\"items\",\"type\":\"tuple[]\"}],\"name\":\"batchSimulation\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.BatchItemResult[]\",\"name\":\"batchItemsResult\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"checkedAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.StatusCheckResult[]\",\"name\":\"accountsStatusCheckResult\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"checkedAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isValid\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"internalType\":\"struct IEVC.StatusCheckResult[]\",\"name\":\"vaultsStatusCheckResult\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"call\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"targetCollateral\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"controlCollateral\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"result\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"disableCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"disableController\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"enableCollateral\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"enableController\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"forgiveAccountStatusCheck\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forgiveVaultStatusCheck\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getAccountOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getAddressPrefix\",\"outputs\":[{\"internalType\":\"bytes19\",\"name\":\"\",\"type\":\"bytes19\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCollaterals\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getControllers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controllerToCheck\",\"type\":\"address\"}],\"name\":\"getCurrentOnBehalfOfAccount\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onBehalfOfAccount\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"controllerEnabled\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getLastAccountStatusCheckTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"internalType\":\"uint256\",\"name\":\"nonceNamespace\",\"type\":\"uint256\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRawExecutionContext\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"context\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"otherAccount\",\"type\":\"address\"}],\"name\":\"haveCommonOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isAccountOperatorAuthorized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"isAccountStatusCheckDeferred\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"isCollateralEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isControlCollateralInProgress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"isControllerEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"}],\"name\":\"isLockdownMode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isOperatorAuthenticated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"}],\"name\":\"isPermitDisabledMode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isSimulationInProgress\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"isVaultStatusCheckDeferred\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonceNamespace\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"index1\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"index2\",\"type\":\"uint8\"}],\"name\":\"reorderCollaterals\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"requireAccountAndVaultStatusCheck\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"requireAccountStatusCheck\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requireVaultStatusCheck\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"authorized\",\"type\":\"bool\"}],\"name\":\"setAccountOperator\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setLockdownMode\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"internalType\":\"uint256\",\"name\":\"nonceNamespace\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"setNonce\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"operatorBitField\",\"type\":\"uint256\"}],\"name\":\"setOperator\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes19\",\"name\":\"addressPrefix\",\"type\":\"bytes19\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setPermitDisabledMode\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"author\":\"Euler Labs (https://www.eulerlabs.com/)\",\"custom:security-contact\":\"security@euler.xyz\",\"events\":{\"AccountStatusCheck(address,address)\":{\"params\":{\"account\":\"The account for which the status check is performed.\",\"controller\":\"The controller performing the status check.\"}},\"CallWithContext(address,bytes19,address,address,bytes4)\":{\"params\":{\"caller\":\"The address of the caller.\",\"onBehalfOfAccount\":\"The account on behalf of which the call is made.\",\"onBehalfOfAddressPrefix\":\"The address prefix of the account on behalf of which the call is made.\",\"selector\":\"The selector of the function called on the target contract.\",\"targetContract\":\"The target contract of the call.\"}},\"CollateralStatus(address,address,bool)\":{\"params\":{\"account\":\"The account for which the collateral status is changed.\",\"collateral\":\"The address of the collateral.\",\"enabled\":\"True if the collateral is enabled, false otherwise.\"}},\"ControllerStatus(address,address,bool)\":{\"params\":{\"account\":\"The account for which the controller status is changed.\",\"controller\":\"The address of the controller.\",\"enabled\":\"True if the controller is enabled, false otherwise.\"}},\"LockdownModeStatus(bytes19,bool)\":{\"params\":{\"addressPrefix\":\"The address prefix for which the lockdown mode status is changed.\",\"enabled\":\"True if the lockdown mode is enabled, false otherwise.\"}},\"NonceStatus(bytes19,uint256,uint256,uint256)\":{\"params\":{\"addressPrefix\":\"The prefix of the address for which the nonce status is updated.\",\"newNonce\":\"The new nonce value after the update.\",\"nonceNamespace\":\"The namespace of the nonce being updated.\",\"oldNonce\":\"The previous nonce value before the update.\"}},\"NonceUsed(bytes19,uint256,uint256)\":{\"params\":{\"addressPrefix\":\"The address prefix for which the nonce is used.\",\"nonce\":\"The nonce that was used.\",\"nonceNamespace\":\"The namespace of the nonce used.\"}},\"OperatorStatus(bytes19,address,uint256)\":{\"params\":{\"accountOperatorAuthorized\":\"The new authorization bitfield of the operator.\",\"addressPrefix\":\"The address prefix for which the operator status is changed.\",\"operator\":\"The address of the operator.\"}},\"OwnerRegistered(bytes19,address)\":{\"params\":{\"addressPrefix\":\"The address prefix for which the owner is registered.\",\"owner\":\"The address of the owner registered.\"}},\"PermitDisabledModeStatus(bytes19,bool)\":{\"params\":{\"addressPrefix\":\"The address prefix for which the permit disabled mode status is changed.\",\"enabled\":\"True if the permit disabled mode is enabled, false otherwise.\"}},\"VaultStatusCheck(address)\":{\"params\":{\"vault\":\"The vault for which the status check is performed.\"}}},\"kind\":\"dev\",\"methods\":{\"areChecksDeferred()\":{\"returns\":{\"_0\":\"A boolean indicating whether checks are deferred.\"}},\"areChecksInProgress()\":{\"returns\":{\"_0\":\"A boolean indicating whether checks are in progress.\"}},\"batch((address,address,uint256,bytes)[])\":{\"details\":\"This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost call ends, the account and vault status checks are performed.The authentication rules for each batch item are the same as for the call function.\",\"params\":{\"items\":\"An array of batch items to be executed.\"}},\"batchRevert((address,address,uint256,bytes)[])\":{\"details\":\"This function always reverts as it's only used for simulation purposes. This function cannot be called within a checks-deferrable call.\",\"params\":{\"items\":\"An array of batch items to be executed.\"}},\"batchSimulation((address,address,uint256,bytes)[])\":{\"details\":\"This function does not modify state and should only be used for simulation purposes. This function cannot be called within a checks-deferrable call.\",\"params\":{\"items\":\"An array of batch items to be executed.\"},\"returns\":{\"accountsStatusCheckResult\":\"An array of account status check results for each account.\",\"batchItemsResult\":\"An array of batch item results for each item.\",\"vaultsStatusCheckResult\":\"An array of vault status check results for each vault.\"}},\"call(address,address,uint256,bytes)\":{\"details\":\"This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost call ends, the account and vault status checks are performed.This function can be used to interact with any contract while checks are deferred. If the target contract is msg.sender, msg.sender is called back with the calldata provided and the context set up according to the account provided. If the target contract is not msg.sender, only the owner or the operator of the account provided can call this function.This function can be used to recover the remaining value from the EVC contract.\",\"params\":{\"data\":\"The encoded data which is called on the target contract.\",\"onBehalfOfAccount\":\"If the target contract is msg.sender, the address of the account which will be set in the context. It assumes msg.sender has authenticated the account themselves. If the target contract is not msg.sender, the address of the account for which it is checked whether msg.sender is authorized to act on behalf of.\",\"targetContract\":\"The address of the contract to be called.\",\"value\":\"The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole balance of the EVC contract will be forwarded.\"},\"returns\":{\"result\":\"The result of the call.\"}},\"controlCollateral(address,address,uint256,bytes)\":{\"details\":\"This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost call ends, the account and vault status checks are performed.This function can be used to interact with any contract while checks are deferred as long as the contract is enabled as a collateral of the account and the msg.sender is the only enabled controller of the account.\",\"params\":{\"data\":\"The encoded data which is called on the target collateral.\",\"onBehalfOfAccount\":\"The address of the account for which it is checked whether msg.sender is authorized to act on behalf.\",\"targetCollateral\":\"The collateral address to be called.\",\"value\":\"The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole balance of the EVC contract will be forwarded.\"},\"returns\":{\"result\":\"The result of the call.\"}},\"disableCollateral(address,address)\":{\"details\":\"This function does not preserve the order of collaterals in the array obtained using the getCollaterals function; the order may change. A collateral is a vault for which account\\u2019s balances are under the control of the currently enabled controller vault. Only the owner or an operator of the account can call this function. Disabling a collateral might change the order of collaterals in the array obtained using getCollaterals function. Account status checks are performed.\",\"params\":{\"account\":\"The account address for which the collateral is being disabled.\",\"vault\":\"The address of a collateral being disabled.\"}},\"disableController(address)\":{\"details\":\"A controller is a vault that has been chosen for an account to have special control over account\\u2019s balances in the enabled collaterals vaults. Only the vault itself can call this function. Disabling a controller might change the order of controllers in the array obtained using getControllers function. Account status checks are performed.\",\"params\":{\"account\":\"The address for which the calling controller is being disabled.\"}},\"enableCollateral(address,address)\":{\"details\":\"A collaterals is a vault for which account's balances are under the control of the currently enabled controller vault. Only the owner or an operator of the account can call this function. Unless it's a duplicate, the collateral is added to the end of the array. There can be at most 10 unique collaterals enabled at a time. Account status checks are performed.\",\"params\":{\"account\":\"The account address for which the collateral is being enabled.\",\"vault\":\"The address being enabled as a collateral.\"}},\"enableController(address,address)\":{\"details\":\"A controller is a vault that has been chosen for an account to have special control over account\\u2019s balances in the enabled collaterals vaults. Only the owner or an operator of the account can call this function. Unless it's a duplicate, the controller is added to the end of the array. Transiently, there can be at most 10 unique controllers enabled at a time, but at most one can be enabled after the outermost checks-deferrable call concludes. Account status checks are performed.\",\"params\":{\"account\":\"The address for which the controller is being enabled.\",\"vault\":\"The address of the controller being enabled.\"}},\"forgiveAccountStatusCheck(address)\":{\"details\":\"Account address is removed from the set of addresses for which status checks are deferred. This function can only be called by the currently enabled controller of a given account. Depending on the vault implementation, may be needed in the liquidation flow.\",\"params\":{\"account\":\"The address of the account for which the status check is forgiven.\"}},\"forgiveVaultStatusCheck()\":{\"details\":\"Vault address is removed from the set of addresses for which status checks are deferred. This function can only be called by the vault itself.\"},\"getAccountOwner(address)\":{\"details\":\"The function returns address(0) if the owner is not registered. Registration of the owner happens on the initial interaction with the EVC that requires authentication of an owner.\",\"params\":{\"account\":\"The address of the account whose owner is being retrieved.\"},\"returns\":{\"_0\":\"owner The address of the account owner. An account owner is an EOA/smart contract which address matches the first 19 bytes of the account address.\"}},\"getAddressPrefix(address)\":{\"details\":\"The address prefix is the first 19 bytes of the account address.\",\"params\":{\"account\":\"The address of the account whose address prefix is being retrieved.\"},\"returns\":{\"_0\":\"A bytes19 value that represents the address prefix of the account.\"}},\"getCollaterals(address)\":{\"details\":\"A collateral is a vault for which an account's balances are under the control of the currently enabled controller vault.\",\"params\":{\"account\":\"The address of the account whose collaterals are being queried.\"},\"returns\":{\"_0\":\"An array of addresses that are enabled collaterals for the account.\"}},\"getControllers(address)\":{\"details\":\"A controller is a vault that has been chosen for an account to have special control over the account's balances in enabled collaterals vaults. A user can have multiple controllers during a call execution, but at most one can be selected when the account status check is performed.\",\"params\":{\"account\":\"The address of the account whose controllers are being queried.\"},\"returns\":{\"_0\":\"An array of addresses that are the enabled controllers for the account.\"}},\"getCurrentOnBehalfOfAccount(address)\":{\"details\":\"This function should only be used by external smart contracts if msg.sender is the EVC. Otherwise, the account address returned must not be trusted.When checks in progress, on behalf of account is always address(0). When address is zero, the function reverts to protect the consumer from ever relying on the on behalf of account address which is in its default state.\",\"params\":{\"controllerToCheck\":\"The address of the controller for which it is checked whether it is an enabled controller for the account on behalf of which the operation is being executed at the moment.\"},\"returns\":{\"controllerEnabled\":\"A boolean value that indicates whether controllerToCheck is an enabled controller for the account on behalf of which the operation is being executed at the moment. Always false if controllerToCheck is address(0).\",\"onBehalfOfAccount\":\"An account that has been authenticated and on behalf of which the operation is being executed at the moment.\"}},\"getLastAccountStatusCheckTimestamp(address)\":{\"details\":\"This function reverts if the checks are in progress.The account status check is considered to be successful if it calls into the selected controller vault and obtains expected magic value. This timestamp does not change if the account status is considered valid when no controller enabled. When consuming, one might need to ensure that the account status check is not deferred at the moment.\",\"params\":{\"account\":\"The address of the account for which the last status check timestamp is being queried.\"},\"returns\":{\"_0\":\"The timestamp of the last status check as a uint256.\"}},\"getNonce(bytes19,uint256)\":{\"details\":\"Each nonce namespace provides 256 bit nonce that has to be used sequentially. There's no requirement to use all the nonces for a given nonce namespace before moving to the next one which allows to use permit messages in a non-sequential manner.\",\"params\":{\"addressPrefix\":\"The address prefix for which the nonce is being retrieved.\",\"nonceNamespace\":\"The nonce namespace for which the nonce is being retrieved.\"},\"returns\":{\"_0\":\"The current nonce for the given address prefix and nonce namespace.\"}},\"getOperator(bytes19,address)\":{\"details\":\"The bit field is used to store information about authorized operators for a given address prefix. Each bit in the bit field corresponds to one account belonging to the same owner. If the bit is set, the operator is authorized for the account.\",\"params\":{\"addressPrefix\":\"The address prefix for which the bit field is being retrieved.\",\"operator\":\"The address of the operator for which the bit field is being retrieved.\"},\"returns\":{\"_0\":\"The bit field for the given address prefix and operator. The bit field defines which accounts the operator is authorized for. It is a 256-position binary array like 0...010...0, marking the account positionally in a uint256. The position in the bit field corresponds to the account ID (0-255), where 0 is the owner account's ID.\"}},\"getRawExecutionContext()\":{\"details\":\"When checks in progress, on behalf of account is always address(0).\",\"returns\":{\"context\":\"Current raw execution context.\"}},\"haveCommonOwner(address,address)\":{\"details\":\"The function is used to check whether one account is authorized to perform operations on behalf of the other. Accounts are considered to have a common owner if they share the first 19 bytes of their address.\",\"params\":{\"account\":\"The address of the account that is being checked.\",\"otherAccount\":\"The address of the other account that is being checked.\"},\"returns\":{\"_0\":\"A boolean flag that indicates whether the accounts have the same owner.\"}},\"isAccountOperatorAuthorized(address,address)\":{\"params\":{\"account\":\"The address of the account whose operator is being checked.\",\"operator\":\"The address of the operator that is being checked.\"},\"returns\":{\"_0\":\"A boolean value that indicates whether the operator is authorized for the account.\"}},\"isAccountStatusCheckDeferred(address)\":{\"details\":\"This function reverts if the checks are in progress.\",\"params\":{\"account\":\"The address of the account for which it is checked whether the status check is deferred.\"},\"returns\":{\"_0\":\"A boolean flag that indicates whether the status check is deferred or not.\"}},\"isCollateralEnabled(address,address)\":{\"details\":\"A collateral is a vault for which account's balances are under the control of the currently enabled controller vault.\",\"params\":{\"account\":\"The address of the account that is being checked.\",\"vault\":\"The address of the collateral that is being checked.\"},\"returns\":{\"_0\":\"A boolean value that indicates whether the vault is an enabled collateral for the account or not.\"}},\"isControlCollateralInProgress()\":{\"returns\":{\"_0\":\"A boolean indicating whether control collateral is in progress.\"}},\"isControllerEnabled(address,address)\":{\"details\":\"A controller is a vault that has been chosen for an account to have special control over account\\u2019s balances in the enabled collaterals vaults.\",\"params\":{\"account\":\"The address of the account that is being checked.\",\"vault\":\"The address of the controller that is being checked.\"},\"returns\":{\"_0\":\"A boolean value that indicates whether the vault is enabled controller for the account or not.\"}},\"isLockdownMode(bytes19)\":{\"params\":{\"addressPrefix\":\"The address prefix to check for lockdown mode status.\"},\"returns\":{\"_0\":\"A boolean indicating whether lockdown mode is enabled.\"}},\"isOperatorAuthenticated()\":{\"returns\":{\"_0\":\"A boolean indicating whether an operator is authenticated.\"}},\"isPermitDisabledMode(bytes19)\":{\"params\":{\"addressPrefix\":\"The address prefix to check for permit functionality status.\"},\"returns\":{\"_0\":\"A boolean indicating whether permit functionality is disabled.\"}},\"isSimulationInProgress()\":{\"returns\":{\"_0\":\"A boolean indicating whether a simulation is in progress.\"}},\"isVaultStatusCheckDeferred(address)\":{\"details\":\"This function reverts if the checks are in progress.\",\"params\":{\"vault\":\"The address of the vault for which it is checked whether the status check is deferred.\"},\"returns\":{\"_0\":\"A boolean flag that indicates whether the status check is deferred or not.\"}},\"permit(address,address,uint256,uint256,uint256,uint256,bytes,bytes)\":{\"details\":\"Low-level call function is used to execute the arbitrary data signed by the owner or the operator on the EVC contract. During that call, EVC becomes msg.sender.\",\"params\":{\"data\":\"The encoded data which is self-called on the EVC contract.\",\"deadline\":\"The timestamp after which the permit is considered expired.\",\"nonce\":\"The nonce for the given account and nonce namespace. A valid nonce value is considered to be the value currently stored and can take any value between 0 and type(uint256).max - 1.\",\"nonceNamespace\":\"The nonce namespace for which the nonce is being used.\",\"sender\":\"The address of the msg.sender which is expected to execute the data signed by the signer. If address(0) is passed, the msg.sender is ignored.\",\"signature\":\"The signature of the data signed by the signer.\",\"signer\":\"The address signing the permit message (ECDSA) or verifying the permit message signature (ERC-1271). It's also the owner or the operator of all the accounts for which authentication will be needed during the execution of the arbitrary data call.\",\"value\":\"The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole balance of the EVC contract will be forwarded.\"}},\"reorderCollaterals(address,uint8,uint8)\":{\"details\":\"A collateral is a vault for which account\\u2019s balances are under the control of the currently enabled controller vault. Only the owner or an operator of the account can call this function. The order of collaterals can be changed by specifying the indices of the two collaterals to be swapped. Indices are zero-based and must be in the range of 0 to the number of collaterals minus 1. index1 must be lower than index2. Account status checks are performed.\",\"params\":{\"account\":\"The address of the account for which the collaterals are being reordered.\",\"index1\":\"The index of the first collateral to be swapped.\",\"index2\":\"The index of the second collateral to be swapped.\"}},\"requireAccountAndVaultStatusCheck(address)\":{\"details\":\"If checks deferred, the account and the vault are added to the respective sets of accounts and vaults to be checked at the end of the outermost checks-deferrable call. Account status check is performed by calling into selected controller vault and passing the array of currently enabled collaterals. If controller is not selected, the account is always considered valid. This function can only be called by the vault itself.\",\"params\":{\"account\":\"The address of the account to be checked.\"}},\"requireAccountStatusCheck(address)\":{\"details\":\"If checks deferred, the account is added to the set of accounts to be checked at the end of the outermost checks-deferrable call. There can be at most 10 unique accounts added to the set at a time. Account status check is performed by calling into the selected controller vault and passing the array of currently enabled collaterals. If controller is not selected, the account is always considered valid.\",\"params\":{\"account\":\"The address of the account to be checked.\"}},\"requireVaultStatusCheck()\":{\"details\":\"If checks deferred, the vault is added to the set of vaults to be checked at the end of the outermost checks-deferrable call. There can be at most 10 unique vaults added to the set at a time. This function can only be called by the vault itself.\"},\"setAccountOperator(address,address,bool)\":{\"details\":\"Uses authenticateCaller() function instead of onlyOwnerOrOperator() modifier to authenticate and get the caller address at once.\",\"params\":{\"account\":\"The address of the account whose operator is being set or unset.\",\"authorized\":\"A boolean value that indicates whether the operator is being authorized or deauthorized. Reverts if the provided value is equal to the currently stored value.\",\"operator\":\"The address of the operator that is being installed or uninstalled. Can neither be the EVC address nor an address belonging to the same owner as the account.\"}},\"setLockdownMode(bytes19,bool)\":{\"details\":\"This function can only be called by the owner of the address prefix. To disable this mode, the EVC must be called directly. It is not possible to disable this mode by using checks-deferrable call or permit message.\",\"params\":{\"addressPrefix\":\"The address prefix for which the lockdown mode is being set.\",\"enabled\":\"A boolean indicating whether to enable or disable lockdown mode.\"}},\"setNonce(bytes19,uint256,uint256)\":{\"details\":\"This function can only be called by the owner of the address prefix. Each nonce namespace provides a 256 bit nonce that has to be used sequentially. There's no requirement to use all the nonces for a given nonce namespace before moving to the next one which allows the use of permit messages in a non-sequential manner. To invalidate signed permit messages, set the nonce for a given nonce namespace accordingly. To invalidate all the permit messages for a given nonce namespace, set the nonce to type(uint).max.\",\"params\":{\"addressPrefix\":\"The address prefix for which the nonce is being set.\",\"nonce\":\"The new nonce for the given address prefix and nonce namespace.\",\"nonceNamespace\":\"The nonce namespace for which the nonce is being set.\"}},\"setOperator(bytes19,address,uint256)\":{\"details\":\"Uses authenticateCaller() function instead of onlyOwner() modifier to authenticate and get the caller address at once.\",\"params\":{\"addressPrefix\":\"The address prefix for which the bit field is being set.\",\"operator\":\"The address of the operator for which the bit field is being set. Can neither be the EVC address nor an address belonging to the same address prefix.\",\"operatorBitField\":\"The new bit field for the given address prefix and operator. Reverts if the provided value is equal to the currently stored value.\"}},\"setPermitDisabledMode(bytes19,bool)\":{\"details\":\"This function can only be called by the owner of the address prefix. To disable this mode, the EVC must be called directly. It is not possible to disable this mode by using checks-deferrable call or (by definition) permit message. To support permit functionality by default, note that the logic was inverted here. To disable the permit functionality, one must pass true as the second argument. To enable the permit functionality, one must pass false as the second argument.\",\"params\":{\"addressPrefix\":\"The address prefix for which the permit functionality is being set.\",\"enabled\":\"A boolean indicating whether to enable or disable the disable-permit mode.\"}}},\"title\":\"EthereumVaultConnector\",\"version\":1},\"userdoc\":{\"errors\":{\"EVC_BatchPanic()\":[{\"notice\":\"Panic error for when simulation does not behave as expected. Should never be observed.\"}],\"EVC_ChecksReentrancy()\":[{\"notice\":\"Error for when checks are in progress and reentrancy is not allowed.\"}],\"EVC_ControlCollateralReentrancy()\":[{\"notice\":\"Error for when control collateral is in progress and reentrancy is not allowed.\"}],\"EVC_ControllerViolation()\":[{\"notice\":\"Error for when there is a different number of controllers enabled than expected.\"}],\"EVC_EmptyError()\":[{\"notice\":\"Error for when an empty or undefined error is thrown.\"}],\"EVC_InvalidAddress()\":[{\"notice\":\"Error for when an address parameter passed is invalid.\"}],\"EVC_InvalidData()\":[{\"notice\":\"Error for when data parameter passed is empty.\"}],\"EVC_InvalidNonce()\":[{\"notice\":\"Error for when a nonce is invalid or already used.\"}],\"EVC_InvalidOperatorStatus()\":[{\"notice\":\"Error for when an operator's to be set is no different from the current one.\"}],\"EVC_InvalidTimestamp()\":[{\"notice\":\"Error for when a timestamp parameter passed is expired.\"}],\"EVC_InvalidValue()\":[{\"notice\":\"Error for when a value parameter passed is invalid or exceeds current balance.\"}],\"EVC_LockdownMode()\":[{\"notice\":\"Error for when an action is prohibited due to the lockdown mode.\"}],\"EVC_NotAuthorized()\":[{\"notice\":\"Error for when caller is not authorized to perform an operation.\"}],\"EVC_OnBehalfOfAccountNotAuthenticated()\":[{\"notice\":\"Error for when no account has been authenticated to act on behalf of.\"}],\"EVC_PermitDisabledMode()\":[{\"notice\":\"Error for when permit execution is prohibited due to the permit disabled mode.\"}],\"EVC_RevertedBatchResult((bool,bytes)[],(address,bool,bytes)[],(address,bool,bytes)[])\":[{\"notice\":\"Auxiliary error to pass simulation batch results.\"}],\"EVC_SimulationBatchNested()\":[{\"notice\":\"Error for when a simulation batch is nested within another simulation batch.\"}]},\"events\":{\"AccountStatusCheck(address,address)\":{\"notice\":\"Emitted when an account status check is performed.\"},\"CallWithContext(address,bytes19,address,address,bytes4)\":{\"notice\":\"Emitted when an external call is made through the EVC.\"},\"CollateralStatus(address,address,bool)\":{\"notice\":\"Emitted when the collateral status is changed for an account.\"},\"ControllerStatus(address,address,bool)\":{\"notice\":\"Emitted when the controller status is changed for an account.\"},\"LockdownModeStatus(bytes19,bool)\":{\"notice\":\"Emitted when the lockdown mode status is changed for an address prefix.\"},\"NonceStatus(bytes19,uint256,uint256,uint256)\":{\"notice\":\"Emitted when the nonce status is updated for a given address prefix and nonce namespace.\"},\"NonceUsed(bytes19,uint256,uint256)\":{\"notice\":\"Emitted when a nonce is used for an address prefix and nonce namespace as part of permit execution.\"},\"OperatorStatus(bytes19,address,uint256)\":{\"notice\":\"Emitted when the operator status is changed for an address prefix.\"},\"OwnerRegistered(bytes19,address)\":{\"notice\":\"Emitted when an owner is registered for an address prefix.\"},\"PermitDisabledModeStatus(bytes19,bool)\":{\"notice\":\"Emitted when the permit disabled mode status is changed for an address prefix.\"},\"VaultStatusCheck(address)\":{\"notice\":\"Emitted when a vault status check is performed.\"}},\"kind\":\"user\",\"methods\":{\"areChecksDeferred()\":{\"notice\":\"Checks if checks are deferred.\"},\"areChecksInProgress()\":{\"notice\":\"Checks if checks are in progress.\"},\"batch((address,address,uint256,bytes)[])\":{\"notice\":\"Executes multiple calls into the target contracts while checks deferred as per batch items provided.\"},\"batchRevert((address,address,uint256,bytes)[])\":{\"notice\":\"Executes multiple calls into the target contracts while checks deferred as per batch items provided.\"},\"batchSimulation((address,address,uint256,bytes)[])\":{\"notice\":\"Executes multiple calls into the target contracts while checks deferred as per batch items provided.\"},\"call(address,address,uint256,bytes)\":{\"notice\":\"Calls into a target contract as per data encoded.\"},\"controlCollateral(address,address,uint256,bytes)\":{\"notice\":\"For a given account, calls into one of the enabled collateral vaults from the currently enabled controller vault as per data encoded.\"},\"disableCollateral(address,address)\":{\"notice\":\"Disables a collateral for an account.\"},\"disableController(address)\":{\"notice\":\"Disables a controller for an account.\"},\"enableCollateral(address,address)\":{\"notice\":\"Enables a collateral for an account.\"},\"enableController(address,address)\":{\"notice\":\"Enables a controller for an account.\"},\"forgiveAccountStatusCheck(address)\":{\"notice\":\"Forgives previously deferred account status check.\"},\"forgiveVaultStatusCheck()\":{\"notice\":\"Forgives previously deferred vault status check.\"},\"getAccountOwner(address)\":{\"notice\":\"Returns the owner for the specified account.\"},\"getAddressPrefix(address)\":{\"notice\":\"Returns the address prefix of the specified account.\"},\"getCollaterals(address)\":{\"notice\":\"Returns an array of collaterals enabled for an account.\"},\"getControllers(address)\":{\"notice\":\"Returns an array of enabled controllers for an account.\"},\"getCurrentOnBehalfOfAccount(address)\":{\"notice\":\"Returns an account on behalf of which the operation is being executed at the moment and whether the controllerToCheck is an enabled controller for that account.\"},\"getLastAccountStatusCheckTimestamp(address)\":{\"notice\":\"Retrieves the timestamp of the last successful account status check performed for a specific account.\"},\"getNonce(bytes19,uint256)\":{\"notice\":\"Returns the current nonce for a given address prefix and nonce namespace.\"},\"getOperator(bytes19,address)\":{\"notice\":\"Returns the bit field for a given address prefix and operator.\"},\"getRawExecutionContext()\":{\"notice\":\"Returns current raw execution context.\"},\"haveCommonOwner(address,address)\":{\"notice\":\"Checks whether the specified account and the other account have the same owner.\"},\"isAccountOperatorAuthorized(address,address)\":{\"notice\":\"Returns whether a given operator has been authorized for a given account.\"},\"isAccountStatusCheckDeferred(address)\":{\"notice\":\"Checks whether the status check is deferred for a given account.\"},\"isCollateralEnabled(address,address)\":{\"notice\":\"Returns whether a collateral is enabled for an account.\"},\"isControlCollateralInProgress()\":{\"notice\":\"Checks if control collateral is in progress.\"},\"isControllerEnabled(address,address)\":{\"notice\":\"Returns whether a controller is enabled for an account.\"},\"isLockdownMode(bytes19)\":{\"notice\":\"Checks if lockdown mode is enabled for a given address prefix.\"},\"isOperatorAuthenticated()\":{\"notice\":\"Checks if an operator is authenticated.\"},\"isPermitDisabledMode(bytes19)\":{\"notice\":\"Checks if permit functionality is disabled for a given address prefix.\"},\"isSimulationInProgress()\":{\"notice\":\"Checks if a simulation is in progress.\"},\"isVaultStatusCheckDeferred(address)\":{\"notice\":\"Checks whether the status check is deferred for a given vault.\"},\"name()\":{\"notice\":\"Name of the Ethereum Vault Connector.\"},\"permit(address,address,uint256,uint256,uint256,uint256,bytes,bytes)\":{\"notice\":\"Executes signed arbitrary data by self-calling into the EVC.\"},\"reorderCollaterals(address,uint8,uint8)\":{\"notice\":\"Swaps the position of two collaterals so that they appear switched in the array of collaterals for a given account obtained by calling getCollaterals function.\"},\"requireAccountAndVaultStatusCheck(address)\":{\"notice\":\"Checks the status of an account and a vault and reverts if it is not valid.\"},\"requireAccountStatusCheck(address)\":{\"notice\":\"Checks the status of an account and reverts if it is not valid.\"},\"requireVaultStatusCheck()\":{\"notice\":\"Checks the status of a vault and reverts if it is not valid.\"},\"setAccountOperator(address,address,bool)\":{\"notice\":\"Authorizes or deauthorizes an operator for the account.\"},\"setLockdownMode(bytes19,bool)\":{\"notice\":\"Enables or disables lockdown mode for a given address prefix.\"},\"setNonce(bytes19,uint256,uint256)\":{\"notice\":\"Sets the nonce for a given address prefix and nonce namespace.\"},\"setOperator(bytes19,address,uint256)\":{\"notice\":\"Sets the bit field for a given address prefix and operator.\"},\"setPermitDisabledMode(bytes19,bool)\":{\"notice\":\"Enables or disables permit functionality for a given address prefix.\"}},\"notice\":\"This contract implements the Ethereum Vault Connector.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/ethereum-vault-connector/src/EthereumVaultConnector.sol\":\"EthereumVaultConnector\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/\",\":@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/\",\":@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/\",\":@solady/=lib/euler-price-oracle/lib/solady/src/\",\":@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/\",\":@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/\",\":axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/\",\":axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":ethereum-vault-connector/=lib/ethereum-vault-connector/src/\",\":euler-price-oracle-test/=lib/euler-price-oracle/test/\",\":euler-price-oracle/=lib/euler-price-oracle/src/\",\":euler-vault-kit/=lib/euler-vault-kit/src/\",\":evc/=lib/ethereum-vault-connector/src/\",\":evk-test/=lib/euler-vault-kit/test/\",\":evk/=lib/euler-vault-kit/src/\",\":fee-flow/=lib/fee-flow/src/\",\":forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/\",\":permit2/=lib/euler-vault-kit/lib/permit2/\",\":pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":redstone-oracles-monorepo/=lib/euler-price-oracle/lib/\",\":reward-streams/=lib/reward-streams/src/\",\":solady/=lib/euler-price-oracle/lib/solady/src/\",\":solmate/=lib/fee-flow/lib/solmate/src/\",\":v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/\",\":v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/\"]},\"sources\":{\"lib/ethereum-vault-connector/src/Errors.sol\":{\"keccak256\":\"0xa7d94c772557da05e275d9fd5c5e01d036c1655b8905652a7d2f3fd7e66908fc\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://44e47dd75cfa92b5a8e7654f5cd25eafedfe6d355afd9020191b56bc41b55b71\",\"dweb:/ipfs/QmW63wJNJZbLdR6dCiwdDeXkNMTNyjE3KXcHhEjJk2QLLH\"]},\"lib/ethereum-vault-connector/src/EthereumVaultConnector.sol\":{\"keccak256\":\"0x06d94f21d28c53799d983893c0f82fe10efc5cf044d9e70ff359ac5883e80d1c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0991ae79005675bc5686fdeba19cbc4585cdc2f7860243437b0ba1a2445e9b67\",\"dweb:/ipfs/QmfEn68zQiM4BidK85mb3n3DFdQMbVCtoxnhm9epC654EB\"]},\"lib/ethereum-vault-connector/src/Events.sol\":{\"keccak256\":\"0x6d96052757d52708d2dd7ae711f56d1dd635277d634e9e9b5f856d28b092e84e\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://807cd166ff0e42321154f6e7c72b04921b6b7ef9375d7dcac0b1aafb51e21849\",\"dweb:/ipfs/Qmdxm6SS9QFzPErriT5Wt6Ae1QkUukbtrkekBDnJ6eU9iS\"]},\"lib/ethereum-vault-connector/src/ExecutionContext.sol\":{\"keccak256\":\"0x3aac641b64fd072d277dbf1cf4e2d264a124efa84df8b896181232ad9338ef54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b390a6511bbce7e097844e8df0a6f27b625c79b3dc81cd500ad0c30647e7b858\",\"dweb:/ipfs/QmQ4DNA5AotHxnMg5NJuBNeMw69KFb64HgM3Nq2f5jMKD3\"]},\"lib/ethereum-vault-connector/src/Set.sol\":{\"keccak256\":\"0xdb1f8a40e36316662f16ae751e355435d8889b95892938a745abc5a794aefe58\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://16fd4a4b847b1ab330c0c57f252063124d3cc17eb491927b3e5055bdfa58f747\",\"dweb:/ipfs/QmcYbrM6DPp4oqKP4cbYQAXgpGkAXuAQAhAUwacJrzpzZk\"]},\"lib/ethereum-vault-connector/src/TransientStorage.sol\":{\"keccak256\":\"0xea97e65c8f492aeacf0e17667b5962bed2996c21b074aebbbe3c92c546adeb8a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://a04ac80167d408b927742559d68c9abe059207cc7f98fe11be6796267f524741\",\"dweb:/ipfs/QmRUUj62EfqqM21FYwyATn89qSN44JtTn1txtJZHyiFZd2\"]},\"lib/ethereum-vault-connector/src/interfaces/IERC1271.sol\":{\"keccak256\":\"0xb60b06dc42dc3882c8b1ec5bf6c103015522dea77f4f733213a7da4b239b1015\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e7005dc4b5d0f7a6ebc0c0ea2f61066f2d49142f05646e385d9e77a2ca7bb964\",\"dweb:/ipfs/QmQREqVSyWcVtFAkNYtE8HepCE8qLinfSc6QyC9VgFPkDe\"]},\"lib/ethereum-vault-connector/src/interfaces/IEthereumVaultConnector.sol\":{\"keccak256\":\"0x2d7b4cf0a3346feada4b7bc2c661c89fa60a485f498f374078a934cd4ece7c7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e8c832fdc952913ffeec92cdbf06266b427c66d87ad1b5d027c73b22fc4fc82d\",\"dweb:/ipfs/QmPEcrWAR85tMKBFQDnTZxgXPVENRU2B6MBgzgRBhbV8oP\"]},\"lib/ethereum-vault-connector/src/interfaces/IVault.sol\":{\"keccak256\":\"0xb04fe66deccf8baa3e5c850f2ecf32e948393d7a42e78b59b037141b205edf42\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://11acaad66e9a42deec1f9328abe9f2662bfb109568baa20a79317ae707b94016\",\"dweb:/ipfs/QmQbAtvrk9cqXJJZgMRjdxrMDXiZPz37m6PGZYEpbtN8to\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"EVC_BatchPanic"},{"inputs":[],"type":"error","name":"EVC_ChecksReentrancy"},{"inputs":[],"type":"error","name":"EVC_ControlCollateralReentrancy"},{"inputs":[],"type":"error","name":"EVC_ControllerViolation"},{"inputs":[],"type":"error","name":"EVC_EmptyError"},{"inputs":[],"type":"error","name":"EVC_InvalidAddress"},{"inputs":[],"type":"error","name":"EVC_InvalidData"},{"inputs":[],"type":"error","name":"EVC_InvalidNonce"},{"inputs":[],"type":"error","name":"EVC_InvalidOperatorStatus"},{"inputs":[],"type":"error","name":"EVC_InvalidTimestamp"},{"inputs":[],"type":"error","name":"EVC_InvalidValue"},{"inputs":[],"type":"error","name":"EVC_LockdownMode"},{"inputs":[],"type":"error","name":"EVC_NotAuthorized"},{"inputs":[],"type":"error","name":"EVC_OnBehalfOfAccountNotAuthenticated"},{"inputs":[],"type":"error","name":"EVC_PermitDisabledMode"},{"inputs":[{"internalType":"struct IEVC.BatchItemResult[]","name":"batchItemsResult","type":"tuple[]","components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}]},{"internalType":"struct IEVC.StatusCheckResult[]","name":"accountsStatusResult","type":"tuple[]","components":[{"internalType":"address","name":"checkedAddress","type":"address"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}]},{"internalType":"struct IEVC.StatusCheckResult[]","name":"vaultsStatusResult","type":"tuple[]","components":[{"internalType":"address","name":"checkedAddress","type":"address"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}]}],"type":"error","name":"EVC_RevertedBatchResult"},{"inputs":[],"type":"error","name":"EVC_SimulationBatchNested"},{"inputs":[],"type":"error","name":"InvalidIndex"},{"inputs":[],"type":"error","name":"TooManyElements"},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"controller","type":"address","indexed":true}],"type":"event","name":"AccountStatusCheck","anonymous":false},{"inputs":[{"internalType":"address","name":"caller","type":"address","indexed":true},{"internalType":"bytes19","name":"onBehalfOfAddressPrefix","type":"bytes19","indexed":true},{"internalType":"address","name":"onBehalfOfAccount","type":"address","indexed":false},{"internalType":"address","name":"targetContract","type":"address","indexed":true},{"internalType":"bytes4","name":"selector","type":"bytes4","indexed":false}],"type":"event","name":"CallWithContext","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"collateral","type":"address","indexed":true},{"internalType":"bool","name":"enabled","type":"bool","indexed":false}],"type":"event","name":"CollateralStatus","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"address","name":"controller","type":"address","indexed":true},{"internalType":"bool","name":"enabled","type":"bool","indexed":false}],"type":"event","name":"ControllerStatus","anonymous":false},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19","indexed":true},{"internalType":"bool","name":"enabled","type":"bool","indexed":false}],"type":"event","name":"LockdownModeStatus","anonymous":false},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19","indexed":true},{"internalType":"uint256","name":"nonceNamespace","type":"uint256","indexed":true},{"internalType":"uint256","name":"oldNonce","type":"uint256","indexed":false},{"internalType":"uint256","name":"newNonce","type":"uint256","indexed":false}],"type":"event","name":"NonceStatus","anonymous":false},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19","indexed":true},{"internalType":"uint256","name":"nonceNamespace","type":"uint256","indexed":true},{"internalType":"uint256","name":"nonce","type":"uint256","indexed":false}],"type":"event","name":"NonceUsed","anonymous":false},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19","indexed":true},{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"uint256","name":"accountOperatorAuthorized","type":"uint256","indexed":false}],"type":"event","name":"OperatorStatus","anonymous":false},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19","indexed":true},{"internalType":"address","name":"owner","type":"address","indexed":true}],"type":"event","name":"OwnerRegistered","anonymous":false},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19","indexed":true},{"internalType":"bool","name":"enabled","type":"bool","indexed":false}],"type":"event","name":"PermitDisabledModeStatus","anonymous":false},{"inputs":[{"internalType":"address","name":"vault","type":"address","indexed":true}],"type":"event","name":"VaultStatusCheck","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"areChecksDeferred","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"areChecksInProgress","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct IEVC.BatchItem[]","name":"items","type":"tuple[]","components":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"onBehalfOfAccount","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"payable","type":"function","name":"batch"},{"inputs":[{"internalType":"struct IEVC.BatchItem[]","name":"items","type":"tuple[]","components":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"onBehalfOfAccount","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"payable","type":"function","name":"batchRevert"},{"inputs":[{"internalType":"struct IEVC.BatchItem[]","name":"items","type":"tuple[]","components":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"onBehalfOfAccount","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}]}],"stateMutability":"payable","type":"function","name":"batchSimulation","outputs":[{"internalType":"struct IEVC.BatchItemResult[]","name":"batchItemsResult","type":"tuple[]","components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}]},{"internalType":"struct IEVC.StatusCheckResult[]","name":"accountsStatusCheckResult","type":"tuple[]","components":[{"internalType":"address","name":"checkedAddress","type":"address"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}]},{"internalType":"struct IEVC.StatusCheckResult[]","name":"vaultsStatusCheckResult","type":"tuple[]","components":[{"internalType":"address","name":"checkedAddress","type":"address"},{"internalType":"bool","name":"isValid","type":"bool"},{"internalType":"bytes","name":"result","type":"bytes"}]}]},{"inputs":[{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"address","name":"onBehalfOfAccount","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"call","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"targetCollateral","type":"address"},{"internalType":"address","name":"onBehalfOfAccount","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"controlCollateral","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"payable","type":"function","name":"disableCollateral"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"payable","type":"function","name":"disableController"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"payable","type":"function","name":"enableCollateral"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"payable","type":"function","name":"enableController"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"payable","type":"function","name":"forgiveAccountStatusCheck"},{"inputs":[],"stateMutability":"payable","type":"function","name":"forgiveVaultStatusCheck"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getAccountOwner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"pure","type":"function","name":"getAddressPrefix","outputs":[{"internalType":"bytes19","name":"","type":"bytes19"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getCollaterals","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getControllers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}]},{"inputs":[{"internalType":"address","name":"controllerToCheck","type":"address"}],"stateMutability":"view","type":"function","name":"getCurrentOnBehalfOfAccount","outputs":[{"internalType":"address","name":"onBehalfOfAccount","type":"address"},{"internalType":"bool","name":"controllerEnabled","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"getLastAccountStatusCheckTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"},{"internalType":"uint256","name":"nonceNamespace","type":"uint256"}],"stateMutability":"view","type":"function","name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getRawExecutionContext","outputs":[{"internalType":"uint256","name":"context","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"otherAccount","type":"address"}],"stateMutability":"pure","type":"function","name":"haveCommonOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"isAccountOperatorAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"isAccountStatusCheckDeferred","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"view","type":"function","name":"isCollateralEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"isControlCollateralInProgress","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"view","type":"function","name":"isControllerEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"}],"stateMutability":"view","type":"function","name":"isLockdownMode","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"isOperatorAuthenticated","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"}],"stateMutability":"view","type":"function","name":"isPermitDisabledMode","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"isSimulationInProgress","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"view","type":"function","name":"isVaultStatusCheckDeferred","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonceNamespace","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"payable","type":"function","name":"permit"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index1","type":"uint8"},{"internalType":"uint8","name":"index2","type":"uint8"}],"stateMutability":"payable","type":"function","name":"reorderCollaterals"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"payable","type":"function","name":"requireAccountAndVaultStatusCheck"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"payable","type":"function","name":"requireAccountStatusCheck"},{"inputs":[],"stateMutability":"payable","type":"function","name":"requireVaultStatusCheck"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"authorized","type":"bool"}],"stateMutability":"payable","type":"function","name":"setAccountOperator"},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"payable","type":"function","name":"setLockdownMode"},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"},{"internalType":"uint256","name":"nonceNamespace","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"payable","type":"function","name":"setNonce"},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"operatorBitField","type":"uint256"}],"stateMutability":"payable","type":"function","name":"setOperator"},{"inputs":[{"internalType":"bytes19","name":"addressPrefix","type":"bytes19"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"payable","type":"function","name":"setPermitDisabledMode"},{"inputs":[],"stateMutability":"payable","type":"receive"}],"devdoc":{"kind":"dev","methods":{"areChecksDeferred()":{"returns":{"_0":"A boolean indicating whether checks are deferred."}},"areChecksInProgress()":{"returns":{"_0":"A boolean indicating whether checks are in progress."}},"batch((address,address,uint256,bytes)[])":{"details":"This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost call ends, the account and vault status checks are performed.The authentication rules for each batch item are the same as for the call function.","params":{"items":"An array of batch items to be executed."}},"batchRevert((address,address,uint256,bytes)[])":{"details":"This function always reverts as it's only used for simulation purposes. This function cannot be called within a checks-deferrable call.","params":{"items":"An array of batch items to be executed."}},"batchSimulation((address,address,uint256,bytes)[])":{"details":"This function does not modify state and should only be used for simulation purposes. This function cannot be called within a checks-deferrable call.","params":{"items":"An array of batch items to be executed."},"returns":{"accountsStatusCheckResult":"An array of account status check results for each account.","batchItemsResult":"An array of batch item results for each item.","vaultsStatusCheckResult":"An array of vault status check results for each vault."}},"call(address,address,uint256,bytes)":{"details":"This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost call ends, the account and vault status checks are performed.This function can be used to interact with any contract while checks are deferred. If the target contract is msg.sender, msg.sender is called back with the calldata provided and the context set up according to the account provided. If the target contract is not msg.sender, only the owner or the operator of the account provided can call this function.This function can be used to recover the remaining value from the EVC contract.","params":{"data":"The encoded data which is called on the target contract.","onBehalfOfAccount":"If the target contract is msg.sender, the address of the account which will be set in the context. It assumes msg.sender has authenticated the account themselves. If the target contract is not msg.sender, the address of the account for which it is checked whether msg.sender is authorized to act on behalf of.","targetContract":"The address of the contract to be called.","value":"The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole balance of the EVC contract will be forwarded."},"returns":{"result":"The result of the call."}},"controlCollateral(address,address,uint256,bytes)":{"details":"This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost call ends, the account and vault status checks are performed.This function can be used to interact with any contract while checks are deferred as long as the contract is enabled as a collateral of the account and the msg.sender is the only enabled controller of the account.","params":{"data":"The encoded data which is called on the target collateral.","onBehalfOfAccount":"The address of the account for which it is checked whether msg.sender is authorized to act on behalf.","targetCollateral":"The collateral address to be called.","value":"The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole balance of the EVC contract will be forwarded."},"returns":{"result":"The result of the call."}},"disableCollateral(address,address)":{"details":"This function does not preserve the order of collaterals in the array obtained using the getCollaterals function; the order may change. A collateral is a vault for which account’s balances are under the control of the currently enabled controller vault. Only the owner or an operator of the account can call this function. Disabling a collateral might change the order of collaterals in the array obtained using getCollaterals function. Account status checks are performed.","params":{"account":"The account address for which the collateral is being disabled.","vault":"The address of a collateral being disabled."}},"disableController(address)":{"details":"A controller is a vault that has been chosen for an account to have special control over account’s balances in the enabled collaterals vaults. Only the vault itself can call this function. Disabling a controller might change the order of controllers in the array obtained using getControllers function. Account status checks are performed.","params":{"account":"The address for which the calling controller is being disabled."}},"enableCollateral(address,address)":{"details":"A collaterals is a vault for which account's balances are under the control of the currently enabled controller vault. Only the owner or an operator of the account can call this function. Unless it's a duplicate, the collateral is added to the end of the array. There can be at most 10 unique collaterals enabled at a time. Account status checks are performed.","params":{"account":"The account address for which the collateral is being enabled.","vault":"The address being enabled as a collateral."}},"enableController(address,address)":{"details":"A controller is a vault that has been chosen for an account to have special control over account’s balances in the enabled collaterals vaults. Only the owner or an operator of the account can call this function. Unless it's a duplicate, the controller is added to the end of the array. Transiently, there can be at most 10 unique controllers enabled at a time, but at most one can be enabled after the outermost checks-deferrable call concludes. Account status checks are performed.","params":{"account":"The address for which the controller is being enabled.","vault":"The address of the controller being enabled."}},"forgiveAccountStatusCheck(address)":{"details":"Account address is removed from the set of addresses for which status checks are deferred. This function can only be called by the currently enabled controller of a given account. Depending on the vault implementation, may be needed in the liquidation flow.","params":{"account":"The address of the account for which the status check is forgiven."}},"forgiveVaultStatusCheck()":{"details":"Vault address is removed from the set of addresses for which status checks are deferred. This function can only be called by the vault itself."},"getAccountOwner(address)":{"details":"The function returns address(0) if the owner is not registered. Registration of the owner happens on the initial interaction with the EVC that requires authentication of an owner.","params":{"account":"The address of the account whose owner is being retrieved."},"returns":{"_0":"owner The address of the account owner. An account owner is an EOA/smart contract which address matches the first 19 bytes of the account address."}},"getAddressPrefix(address)":{"details":"The address prefix is the first 19 bytes of the account address.","params":{"account":"The address of the account whose address prefix is being retrieved."},"returns":{"_0":"A bytes19 value that represents the address prefix of the account."}},"getCollaterals(address)":{"details":"A collateral is a vault for which an account's balances are under the control of the currently enabled controller vault.","params":{"account":"The address of the account whose collaterals are being queried."},"returns":{"_0":"An array of addresses that are enabled collaterals for the account."}},"getControllers(address)":{"details":"A controller is a vault that has been chosen for an account to have special control over the account's balances in enabled collaterals vaults. A user can have multiple controllers during a call execution, but at most one can be selected when the account status check is performed.","params":{"account":"The address of the account whose controllers are being queried."},"returns":{"_0":"An array of addresses that are the enabled controllers for the account."}},"getCurrentOnBehalfOfAccount(address)":{"details":"This function should only be used by external smart contracts if msg.sender is the EVC. Otherwise, the account address returned must not be trusted.When checks in progress, on behalf of account is always address(0). When address is zero, the function reverts to protect the consumer from ever relying on the on behalf of account address which is in its default state.","params":{"controllerToCheck":"The address of the controller for which it is checked whether it is an enabled controller for the account on behalf of which the operation is being executed at the moment."},"returns":{"controllerEnabled":"A boolean value that indicates whether controllerToCheck is an enabled controller for the account on behalf of which the operation is being executed at the moment. Always false if controllerToCheck is address(0).","onBehalfOfAccount":"An account that has been authenticated and on behalf of which the operation is being executed at the moment."}},"getLastAccountStatusCheckTimestamp(address)":{"details":"This function reverts if the checks are in progress.The account status check is considered to be successful if it calls into the selected controller vault and obtains expected magic value. This timestamp does not change if the account status is considered valid when no controller enabled. When consuming, one might need to ensure that the account status check is not deferred at the moment.","params":{"account":"The address of the account for which the last status check timestamp is being queried."},"returns":{"_0":"The timestamp of the last status check as a uint256."}},"getNonce(bytes19,uint256)":{"details":"Each nonce namespace provides 256 bit nonce that has to be used sequentially. There's no requirement to use all the nonces for a given nonce namespace before moving to the next one which allows to use permit messages in a non-sequential manner.","params":{"addressPrefix":"The address prefix for which the nonce is being retrieved.","nonceNamespace":"The nonce namespace for which the nonce is being retrieved."},"returns":{"_0":"The current nonce for the given address prefix and nonce namespace."}},"getOperator(bytes19,address)":{"details":"The bit field is used to store information about authorized operators for a given address prefix. Each bit in the bit field corresponds to one account belonging to the same owner. If the bit is set, the operator is authorized for the account.","params":{"addressPrefix":"The address prefix for which the bit field is being retrieved.","operator":"The address of the operator for which the bit field is being retrieved."},"returns":{"_0":"The bit field for the given address prefix and operator. The bit field defines which accounts the operator is authorized for. It is a 256-position binary array like 0...010...0, marking the account positionally in a uint256. The position in the bit field corresponds to the account ID (0-255), where 0 is the owner account's ID."}},"getRawExecutionContext()":{"details":"When checks in progress, on behalf of account is always address(0).","returns":{"context":"Current raw execution context."}},"haveCommonOwner(address,address)":{"details":"The function is used to check whether one account is authorized to perform operations on behalf of the other. Accounts are considered to have a common owner if they share the first 19 bytes of their address.","params":{"account":"The address of the account that is being checked.","otherAccount":"The address of the other account that is being checked."},"returns":{"_0":"A boolean flag that indicates whether the accounts have the same owner."}},"isAccountOperatorAuthorized(address,address)":{"params":{"account":"The address of the account whose operator is being checked.","operator":"The address of the operator that is being checked."},"returns":{"_0":"A boolean value that indicates whether the operator is authorized for the account."}},"isAccountStatusCheckDeferred(address)":{"details":"This function reverts if the checks are in progress.","params":{"account":"The address of the account for which it is checked whether the status check is deferred."},"returns":{"_0":"A boolean flag that indicates whether the status check is deferred or not."}},"isCollateralEnabled(address,address)":{"details":"A collateral is a vault for which account's balances are under the control of the currently enabled controller vault.","params":{"account":"The address of the account that is being checked.","vault":"The address of the collateral that is being checked."},"returns":{"_0":"A boolean value that indicates whether the vault is an enabled collateral for the account or not."}},"isControlCollateralInProgress()":{"returns":{"_0":"A boolean indicating whether control collateral is in progress."}},"isControllerEnabled(address,address)":{"details":"A controller is a vault that has been chosen for an account to have special control over account’s balances in the enabled collaterals vaults.","params":{"account":"The address of the account that is being checked.","vault":"The address of the controller that is being checked."},"returns":{"_0":"A boolean value that indicates whether the vault is enabled controller for the account or not."}},"isLockdownMode(bytes19)":{"params":{"addressPrefix":"The address prefix to check for lockdown mode status."},"returns":{"_0":"A boolean indicating whether lockdown mode is enabled."}},"isOperatorAuthenticated()":{"returns":{"_0":"A boolean indicating whether an operator is authenticated."}},"isPermitDisabledMode(bytes19)":{"params":{"addressPrefix":"The address prefix to check for permit functionality status."},"returns":{"_0":"A boolean indicating whether permit functionality is disabled."}},"isSimulationInProgress()":{"returns":{"_0":"A boolean indicating whether a simulation is in progress."}},"isVaultStatusCheckDeferred(address)":{"details":"This function reverts if the checks are in progress.","params":{"vault":"The address of the vault for which it is checked whether the status check is deferred."},"returns":{"_0":"A boolean flag that indicates whether the status check is deferred or not."}},"permit(address,address,uint256,uint256,uint256,uint256,bytes,bytes)":{"details":"Low-level call function is used to execute the arbitrary data signed by the owner or the operator on the EVC contract. During that call, EVC becomes msg.sender.","params":{"data":"The encoded data which is self-called on the EVC contract.","deadline":"The timestamp after which the permit is considered expired.","nonce":"The nonce for the given account and nonce namespace. A valid nonce value is considered to be the value currently stored and can take any value between 0 and type(uint256).max - 1.","nonceNamespace":"The nonce namespace for which the nonce is being used.","sender":"The address of the msg.sender which is expected to execute the data signed by the signer. If address(0) is passed, the msg.sender is ignored.","signature":"The signature of the data signed by the signer.","signer":"The address signing the permit message (ECDSA) or verifying the permit message signature (ERC-1271). It's also the owner or the operator of all the accounts for which authentication will be needed during the execution of the arbitrary data call.","value":"The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole balance of the EVC contract will be forwarded."}},"reorderCollaterals(address,uint8,uint8)":{"details":"A collateral is a vault for which account’s balances are under the control of the currently enabled controller vault. Only the owner or an operator of the account can call this function. The order of collaterals can be changed by specifying the indices of the two collaterals to be swapped. Indices are zero-based and must be in the range of 0 to the number of collaterals minus 1. index1 must be lower than index2. Account status checks are performed.","params":{"account":"The address of the account for which the collaterals are being reordered.","index1":"The index of the first collateral to be swapped.","index2":"The index of the second collateral to be swapped."}},"requireAccountAndVaultStatusCheck(address)":{"details":"If checks deferred, the account and the vault are added to the respective sets of accounts and vaults to be checked at the end of the outermost checks-deferrable call. Account status check is performed by calling into selected controller vault and passing the array of currently enabled collaterals. If controller is not selected, the account is always considered valid. This function can only be called by the vault itself.","params":{"account":"The address of the account to be checked."}},"requireAccountStatusCheck(address)":{"details":"If checks deferred, the account is added to the set of accounts to be checked at the end of the outermost checks-deferrable call. There can be at most 10 unique accounts added to the set at a time. Account status check is performed by calling into the selected controller vault and passing the array of currently enabled collaterals. If controller is not selected, the account is always considered valid.","params":{"account":"The address of the account to be checked."}},"requireVaultStatusCheck()":{"details":"If checks deferred, the vault is added to the set of vaults to be checked at the end of the outermost checks-deferrable call. There can be at most 10 unique vaults added to the set at a time. This function can only be called by the vault itself."},"setAccountOperator(address,address,bool)":{"details":"Uses authenticateCaller() function instead of onlyOwnerOrOperator() modifier to authenticate and get the caller address at once.","params":{"account":"The address of the account whose operator is being set or unset.","authorized":"A boolean value that indicates whether the operator is being authorized or deauthorized. Reverts if the provided value is equal to the currently stored value.","operator":"The address of the operator that is being installed or uninstalled. Can neither be the EVC address nor an address belonging to the same owner as the account."}},"setLockdownMode(bytes19,bool)":{"details":"This function can only be called by the owner of the address prefix. To disable this mode, the EVC must be called directly. It is not possible to disable this mode by using checks-deferrable call or permit message.","params":{"addressPrefix":"The address prefix for which the lockdown mode is being set.","enabled":"A boolean indicating whether to enable or disable lockdown mode."}},"setNonce(bytes19,uint256,uint256)":{"details":"This function can only be called by the owner of the address prefix. Each nonce namespace provides a 256 bit nonce that has to be used sequentially. There's no requirement to use all the nonces for a given nonce namespace before moving to the next one which allows the use of permit messages in a non-sequential manner. To invalidate signed permit messages, set the nonce for a given nonce namespace accordingly. To invalidate all the permit messages for a given nonce namespace, set the nonce to type(uint).max.","params":{"addressPrefix":"The address prefix for which the nonce is being set.","nonce":"The new nonce for the given address prefix and nonce namespace.","nonceNamespace":"The nonce namespace for which the nonce is being set."}},"setOperator(bytes19,address,uint256)":{"details":"Uses authenticateCaller() function instead of onlyOwner() modifier to authenticate and get the caller address at once.","params":{"addressPrefix":"The address prefix for which the bit field is being set.","operator":"The address of the operator for which the bit field is being set. Can neither be the EVC address nor an address belonging to the same address prefix.","operatorBitField":"The new bit field for the given address prefix and operator. Reverts if the provided value is equal to the currently stored value."}},"setPermitDisabledMode(bytes19,bool)":{"details":"This function can only be called by the owner of the address prefix. To disable this mode, the EVC must be called directly. It is not possible to disable this mode by using checks-deferrable call or (by definition) permit message. To support permit functionality by default, note that the logic was inverted here. To disable the permit functionality, one must pass true as the second argument. To enable the permit functionality, one must pass false as the second argument.","params":{"addressPrefix":"The address prefix for which the permit functionality is being set.","enabled":"A boolean indicating whether to enable or disable the disable-permit mode."}}},"version":1},"userdoc":{"kind":"user","methods":{"areChecksDeferred()":{"notice":"Checks if checks are deferred."},"areChecksInProgress()":{"notice":"Checks if checks are in progress."},"batch((address,address,uint256,bytes)[])":{"notice":"Executes multiple calls into the target contracts while checks deferred as per batch items provided."},"batchRevert((address,address,uint256,bytes)[])":{"notice":"Executes multiple calls into the target contracts while checks deferred as per batch items provided."},"batchSimulation((address,address,uint256,bytes)[])":{"notice":"Executes multiple calls into the target contracts while checks deferred as per batch items provided."},"call(address,address,uint256,bytes)":{"notice":"Calls into a target contract as per data encoded."},"controlCollateral(address,address,uint256,bytes)":{"notice":"For a given account, calls into one of the enabled collateral vaults from the currently enabled controller vault as per data encoded."},"disableCollateral(address,address)":{"notice":"Disables a collateral for an account."},"disableController(address)":{"notice":"Disables a controller for an account."},"enableCollateral(address,address)":{"notice":"Enables a collateral for an account."},"enableController(address,address)":{"notice":"Enables a controller for an account."},"forgiveAccountStatusCheck(address)":{"notice":"Forgives previously deferred account status check."},"forgiveVaultStatusCheck()":{"notice":"Forgives previously deferred vault status check."},"getAccountOwner(address)":{"notice":"Returns the owner for the specified account."},"getAddressPrefix(address)":{"notice":"Returns the address prefix of the specified account."},"getCollaterals(address)":{"notice":"Returns an array of collaterals enabled for an account."},"getControllers(address)":{"notice":"Returns an array of enabled controllers for an account."},"getCurrentOnBehalfOfAccount(address)":{"notice":"Returns an account on behalf of which the operation is being executed at the moment and whether the controllerToCheck is an enabled controller for that account."},"getLastAccountStatusCheckTimestamp(address)":{"notice":"Retrieves the timestamp of the last successful account status check performed for a specific account."},"getNonce(bytes19,uint256)":{"notice":"Returns the current nonce for a given address prefix and nonce namespace."},"getOperator(bytes19,address)":{"notice":"Returns the bit field for a given address prefix and operator."},"getRawExecutionContext()":{"notice":"Returns current raw execution context."},"haveCommonOwner(address,address)":{"notice":"Checks whether the specified account and the other account have the same owner."},"isAccountOperatorAuthorized(address,address)":{"notice":"Returns whether a given operator has been authorized for a given account."},"isAccountStatusCheckDeferred(address)":{"notice":"Checks whether the status check is deferred for a given account."},"isCollateralEnabled(address,address)":{"notice":"Returns whether a collateral is enabled for an account."},"isControlCollateralInProgress()":{"notice":"Checks if control collateral is in progress."},"isControllerEnabled(address,address)":{"notice":"Returns whether a controller is enabled for an account."},"isLockdownMode(bytes19)":{"notice":"Checks if lockdown mode is enabled for a given address prefix."},"isOperatorAuthenticated()":{"notice":"Checks if an operator is authenticated."},"isPermitDisabledMode(bytes19)":{"notice":"Checks if permit functionality is disabled for a given address prefix."},"isSimulationInProgress()":{"notice":"Checks if a simulation is in progress."},"isVaultStatusCheckDeferred(address)":{"notice":"Checks whether the status check is deferred for a given vault."},"name()":{"notice":"Name of the Ethereum Vault Connector."},"permit(address,address,uint256,uint256,uint256,uint256,bytes,bytes)":{"notice":"Executes signed arbitrary data by self-calling into the EVC."},"reorderCollaterals(address,uint8,uint8)":{"notice":"Swaps the position of two collaterals so that they appear switched in the array of collaterals for a given account obtained by calling getCollaterals function."},"requireAccountAndVaultStatusCheck(address)":{"notice":"Checks the status of an account and a vault and reverts if it is not valid."},"requireAccountStatusCheck(address)":{"notice":"Checks the status of an account and reverts if it is not valid."},"requireVaultStatusCheck()":{"notice":"Checks the status of a vault and reverts if it is not valid."},"setAccountOperator(address,address,bool)":{"notice":"Authorizes or deauthorizes an operator for the account."},"setLockdownMode(bytes19,bool)":{"notice":"Enables or disables lockdown mode for a given address prefix."},"setNonce(bytes19,uint256,uint256)":{"notice":"Sets the nonce for a given address prefix and nonce namespace."},"setOperator(bytes19,address,uint256)":{"notice":"Sets the bit field for a given address prefix and operator."},"setPermitDisabledMode(bytes19,bool)":{"notice":"Enables or disables permit functionality for a given address prefix."}},"version":1}},"settings":{"remappings":["@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/","@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/","@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/","@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/","@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/","@solady/=lib/euler-price-oracle/lib/solady/src/","@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/","@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/","axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/","axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/","ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","ethereum-vault-connector/=lib/ethereum-vault-connector/src/","euler-price-oracle-test/=lib/euler-price-oracle/test/","euler-price-oracle/=lib/euler-price-oracle/src/","euler-vault-kit/=lib/euler-vault-kit/src/","evc/=lib/ethereum-vault-connector/src/","evk-test/=lib/euler-vault-kit/test/","evk/=lib/euler-vault-kit/src/","fee-flow/=lib/fee-flow/src/","forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/","openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/","permit2/=lib/euler-vault-kit/lib/permit2/","pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/","redstone-oracles-monorepo/=lib/euler-price-oracle/lib/","reward-streams/=lib/reward-streams/src/","solady/=lib/euler-price-oracle/lib/solady/src/","solmate/=lib/fee-flow/lib/solmate/src/","v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/","v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/"],"optimizer":{"enabled":true,"runs":20000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/ethereum-vault-connector/src/EthereumVaultConnector.sol":"EthereumVaultConnector"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/ethereum-vault-connector/src/Errors.sol":{"keccak256":"0xa7d94c772557da05e275d9fd5c5e01d036c1655b8905652a7d2f3fd7e66908fc","urls":["bzz-raw://44e47dd75cfa92b5a8e7654f5cd25eafedfe6d355afd9020191b56bc41b55b71","dweb:/ipfs/QmW63wJNJZbLdR6dCiwdDeXkNMTNyjE3KXcHhEjJk2QLLH"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/EthereumVaultConnector.sol":{"keccak256":"0x06d94f21d28c53799d983893c0f82fe10efc5cf044d9e70ff359ac5883e80d1c","urls":["bzz-raw://0991ae79005675bc5686fdeba19cbc4585cdc2f7860243437b0ba1a2445e9b67","dweb:/ipfs/QmfEn68zQiM4BidK85mb3n3DFdQMbVCtoxnhm9epC654EB"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/Events.sol":{"keccak256":"0x6d96052757d52708d2dd7ae711f56d1dd635277d634e9e9b5f856d28b092e84e","urls":["bzz-raw://807cd166ff0e42321154f6e7c72b04921b6b7ef9375d7dcac0b1aafb51e21849","dweb:/ipfs/Qmdxm6SS9QFzPErriT5Wt6Ae1QkUukbtrkekBDnJ6eU9iS"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/ExecutionContext.sol":{"keccak256":"0x3aac641b64fd072d277dbf1cf4e2d264a124efa84df8b896181232ad9338ef54","urls":["bzz-raw://b390a6511bbce7e097844e8df0a6f27b625c79b3dc81cd500ad0c30647e7b858","dweb:/ipfs/QmQ4DNA5AotHxnMg5NJuBNeMw69KFb64HgM3Nq2f5jMKD3"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/Set.sol":{"keccak256":"0xdb1f8a40e36316662f16ae751e355435d8889b95892938a745abc5a794aefe58","urls":["bzz-raw://16fd4a4b847b1ab330c0c57f252063124d3cc17eb491927b3e5055bdfa58f747","dweb:/ipfs/QmcYbrM6DPp4oqKP4cbYQAXgpGkAXuAQAhAUwacJrzpzZk"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/TransientStorage.sol":{"keccak256":"0xea97e65c8f492aeacf0e17667b5962bed2996c21b074aebbbe3c92c546adeb8a","urls":["bzz-raw://a04ac80167d408b927742559d68c9abe059207cc7f98fe11be6796267f524741","dweb:/ipfs/QmRUUj62EfqqM21FYwyATn89qSN44JtTn1txtJZHyiFZd2"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/interfaces/IERC1271.sol":{"keccak256":"0xb60b06dc42dc3882c8b1ec5bf6c103015522dea77f4f733213a7da4b239b1015","urls":["bzz-raw://e7005dc4b5d0f7a6ebc0c0ea2f61066f2d49142f05646e385d9e77a2ca7bb964","dweb:/ipfs/QmQREqVSyWcVtFAkNYtE8HepCE8qLinfSc6QyC9VgFPkDe"],"license":"MIT"},"lib/ethereum-vault-connector/src/interfaces/IEthereumVaultConnector.sol":{"keccak256":"0x2d7b4cf0a3346feada4b7bc2c661c89fa60a485f498f374078a934cd4ece7c7b","urls":["bzz-raw://e8c832fdc952913ffeec92cdbf06266b427c66d87ad1b5d027c73b22fc4fc82d","dweb:/ipfs/QmPEcrWAR85tMKBFQDnTZxgXPVENRU2B6MBgzgRBhbV8oP"],"license":"GPL-2.0-or-later"},"lib/ethereum-vault-connector/src/interfaces/IVault.sol":{"keccak256":"0xb04fe66deccf8baa3e5c850f2ecf32e948393d7a42e78b59b037141b205edf42","urls":["bzz-raw://11acaad66e9a42deec1f9328abe9f2662bfb109568baa20a79317ae707b94016","dweb:/ipfs/QmQbAtvrk9cqXJJZgMRjdxrMDXiZPz37m6PGZYEpbtN8to"],"license":"GPL-2.0-or-later"}},"version":1},"id":1} \ No newline at end of file diff --git a/contracts/EulerRouter.json b/contracts/EulerRouter.json new file mode 100644 index 0000000..8c15e42 --- /dev/null +++ b/contracts/EulerRouter.json @@ -0,0 +1,800 @@ +{ + "abi": [ + { + "type": "constructor", + "inputs": [ + { "name": "_evc", "type": "address", "internalType": "address" }, + { "name": "_governor", "type": "address", "internalType": "address" } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "EVC", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "fallbackOracle", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConfiguredOracle", + "inputs": [ + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getQuote", + "inputs": [ + { "name": "inAmount", "type": "uint256", "internalType": "uint256" }, + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getQuotes", + "inputs": [ + { "name": "inAmount", "type": "uint256", "internalType": "uint256" }, + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [ + { "name": "", "type": "uint256", "internalType": "uint256" }, + { "name": "", "type": "uint256", "internalType": "uint256" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "govSetConfig", + "inputs": [ + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" }, + { "name": "oracle", "type": "address", "internalType": "address" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "govSetFallbackOracle", + "inputs": [ + { + "name": "_fallbackOracle", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "govSetResolvedVault", + "inputs": [ + { "name": "vault", "type": "address", "internalType": "address" }, + { "name": "set", "type": "bool", "internalType": "bool" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "governor", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "resolveOracle", + "inputs": [ + { "name": "inAmount", "type": "uint256", "internalType": "uint256" }, + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [ + { "name": "", "type": "uint256", "internalType": "uint256" }, + { "name": "", "type": "address", "internalType": "address" }, + { "name": "", "type": "address", "internalType": "address" }, + { "name": "", "type": "address", "internalType": "address" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "resolvedVaults", + "inputs": [ + { "name": "vault", "type": "address", "internalType": "address" } + ], + "outputs": [ + { "name": "asset", "type": "address", "internalType": "address" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferGovernance", + "inputs": [ + { "name": "newGovernor", "type": "address", "internalType": "address" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "ConfigSet", + "inputs": [ + { + "name": "asset0", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "asset1", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "oracle", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FallbackOracleSet", + "inputs": [ + { + "name": "fallbackOracle", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "GovernorSet", + "inputs": [ + { + "name": "oldGovernor", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newGovernor", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ResolvedVaultSet", + "inputs": [ + { + "name": "vault", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "asset", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { "type": "error", "name": "ControllerDisabled", "inputs": [] }, + { "type": "error", "name": "EVC_InvalidAddress", "inputs": [] }, + { "type": "error", "name": "Governance_CallerNotGovernor", "inputs": [] }, + { "type": "error", "name": "NotAuthorized", "inputs": [] }, + { + "type": "error", + "name": "PriceOracle_InvalidConfiguration", + "inputs": [] + }, + { + "type": "error", + "name": "PriceOracle_NotSupported", + "inputs": [ + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ] + } + ], + "bytecode": { + "object": "0x60a060405234801562000010575f80fd5b5060405162001bdd38038062001bdd83398101604081905262000033916200011c565b8181816001600160a01b0381166200005e57604051638133abd160e01b815260040160405180910390fd5b6001600160a01b03166080526200007581620000a7565b50506001600160a01b0381166200009f576040516301a4c16560e21b815260040160405180910390fd5b505062000152565b5f80546040516001600160a01b03808516939216917ff31bb200dbf42bb9cecaa49dceb87eae178b024ad3cf2930b4aaac5cb0f96ec091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b80516001600160a01b038116811462000117575f80fd5b919050565b5f80604083850312156200012e575f80fd5b620001398362000100565b9150620001496020840162000100565b90509250929050565b608051611a10620001cd5f395f8181610266015281816103e9015281816104120152818161059a01528181610b2d01528181610b5601528181610cde01528181610e6501528181610e8e015281816110160152818161128c015281816112b50152818161143d01528181611628015261167c0152611a105ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80638418e6f311610088578063ae68676c11610063578063ae68676c1461028a578063d38bfff4146102ab578063d6c02926146102be578063eab49501146102d1575f80fd5b80638418e6f3146102025780638aa7760814610251578063a70354a114610264575f80fd5b80630c340a24116100b85780630c340a24146101695780635ca40017146101ad578063629838e5146101e2575f80fd5b80630579e61f146100de57806306c570c11461010b57806306fdde0314610120575b5f80fd5b6100f16100ec3660046117f8565b6102e4565b604080519283526020830191909152015b60405180910390f35b61011e610119366004611837565b6103d2565b005b61015c6040518060400160405280600b81526020017f45756c6572526f7574657200000000000000000000000000000000000000000081525081565b6040516101029190611864565b5f546101889073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b6101886101bb3660046118ce565b60026020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6001546101889073ffffffffffffffffffffffffffffffffffffffff1681565b6102156102103660046117f8565b610803565b6040805194855273ffffffffffffffffffffffffffffffffffffffff938416602086015291831691840191909152166060820152608001610102565b61018861025f3660046118e9565b6109e5565b7f0000000000000000000000000000000000000000000000000000000000000000610188565b61029d6102983660046117f8565b610a2e565b604051908152602001610102565b61011e6102b93660046118ce565b610b16565b61011e6102cc36600461192d565b610e4e565b61011e6102df3660046118ce565b611275565b5f805f6102f2868686610803565b9298509096509450905073ffffffffffffffffffffffffffffffffffffffff8085169086160361032857858692509250506103ca565b6040517f0579e61f0000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff86811660248301528581166044830152821690630579e61f906064016040805180830381865afa1580156103a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c49190611959565b92509250505b935093915050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610691575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610479573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049d919061197b565b905077ff000000000000000000000000000000000000000000000081161515806104df575076ff00000000000000000000000000000000000000000000811615155b80610501575075ff000000000000000000000000000000000000000000811615155b15610538576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa1580156105df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106039190611992565b905073ffffffffffffffffffffffffffffffffffffffff81161580159061065657508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561068d576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff166106b161160f565b73ffffffffffffffffffffffffffffffffffffffff16146106fe576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610763576040517f0693059400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061076f8585611702565b73ffffffffffffffffffffffffffffffffffffffff8281165f818152600360209081526040808320868616808552925280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016958b16958617905551959750939550919390917f4ac83f39568b63f952374c82351889b07aff4f7e261232a20ba5a2a6d82b9ce091a45050505050565b5f805f808473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff160361084a57508592508491508390505f6109dc565b5f61085587876109e5565b905073ffffffffffffffffffffffffffffffffffffffff8116156108835787945086935085925090506109dc565b73ffffffffffffffffffffffffffffffffffffffff8088165f90815260026020526040902054168015610959576040517f07a2d13a000000000000000000000000000000000000000000000000000000008152600481018a905273ffffffffffffffffffffffffffffffffffffffff8916906307a2d13a90602401602060405180830381865afa158015610919573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093d919061197b565b985061094a898289610803565b955095509550955050506109dc565b60015473ffffffffffffffffffffffffffffffffffffffff169150816109cf576040517f4ca22af000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808a1660048301528816602482015260440160405180910390fd5b5087945086935085925090505b93509350935093565b5f805f6109f28585611702565b73ffffffffffffffffffffffffffffffffffffffff9182165f908152600360209081526040808320938516835292905220541695945050505050565b5f80610a3b858585610803565b9297509095509350905073ffffffffffffffffffffffffffffffffffffffff80841690851603610a6e5784915050610b0f565b6040517fae68676c0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff8581166024830152848116604483015282169063ae68676c90606401602060405180830381865afa158015610ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0b919061197b565b9150505b9392505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610dd5575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be1919061197b565b905077ff00000000000000000000000000000000000000000000008116151580610c23575076ff00000000000000000000000000000000000000000000811615155b80610c45575075ff000000000000000000000000000000000000000000811615155b15610c7c576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa158015610d23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d479190611992565b905073ffffffffffffffffffffffffffffffffffffffff811615801590610d9a57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15610dd1576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff16610df561160f565b73ffffffffffffffffffffffffffffffffffffffff1614610e42576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4b8161174c565b50565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361110d575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f19919061197b565b905077ff00000000000000000000000000000000000000000000008116151580610f5b575076ff00000000000000000000000000000000000000000000811615155b80610f7d575075ff000000000000000000000000000000000000000000811615155b15610fb4576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa15801561105b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107f9190611992565b905073ffffffffffffffffffffffffffffffffffffffff8116158015906110d257508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611109576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff1661112d61160f565b73ffffffffffffffffffffffffffffffffffffffff161461117a576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81611186575f6111f3565b8273ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f39190611992565b73ffffffffffffffffffffffffffffffffffffffff8481165f8181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948616948517905551939450919290917f15beaec71c94ee69b5a824e905ca6d1260da10196b715c38b565b80180f630ce91a3505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303611534575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561131c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611340919061197b565b905077ff00000000000000000000000000000000000000000000008116151580611382575076ff00000000000000000000000000000000000000000000811615155b806113a4575075ff000000000000000000000000000000000000000000811615155b156113db576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa158015611482573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a69190611992565b905073ffffffffffffffffffffffffffffffffffffffff8116158015906114f957508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611530576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff1661155461160f565b73ffffffffffffffffffffffffffffffffffffffff16146115a1576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fef21cd88756d665855f56a2652b7eda229d6f3102988a95975e46964d24d478a905f90a250565b5f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681036116fd576040517f18503a1e0000000000000000000000000000000000000000000000000000000081525f60048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906318503a1e906024016040805180830381865afa1580156116d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f991906119ad565b5090505b919050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061173e578284611741565b83835b915091509250929050565b5f805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917ff31bb200dbf42bb9cecaa49dceb87eae178b024ad3cf2930b4aaac5cb0f96ec091a35f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610e4b575f80fd5b5f805f6060848603121561180a575f80fd5b83359250602084013561181c816117d7565b9150604084013561182c816117d7565b809150509250925092565b5f805f60608486031215611849575f80fd5b8335611854816117d7565b9250602084013561181c816117d7565b5f602080835283518060208501525f5b8181101561189057858101830151858201604001528201611874565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f602082840312156118de575f80fd5b8135610b0f816117d7565b5f80604083850312156118fa575f80fd5b8235611905816117d7565b91506020830135611915816117d7565b809150509250929050565b8015158114610e4b575f80fd5b5f806040838503121561193e575f80fd5b8235611949816117d7565b9150602083013561191581611920565b5f806040838503121561196a575f80fd5b505080516020909101519092909150565b5f6020828403121561198b575f80fd5b5051919050565b5f602082840312156119a2575f80fd5b8151610b0f816117d7565b5f80604083850312156119be575f80fd5b82516119c9816117d7565b60208401519092506119158161192056fea2646970667358221220d71b678db67805238737a693bdeb1d631c306ac5cfc0a7e825ebbdb41998540a64736f6c63430008180033", + "sourceMap": "773:7648:37:-:0;;;2727:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2783:4;2789:9;2783:4;-1:-1:-1;;;;;867:18:9;;863:51;;894:20;;-1:-1:-1;;;894:20:9;;;;;;;;;;;863:51;-1:-1:-1;;;;;925:16:9;;;871:23:240::1;884:9:::0;871:12:::1;:23::i;:::-;-1:-1:-1::0;;;;;;;2814:23:37;::::1;2810:77;;2846:41;;-1:-1:-1::0;;;2846:41:37::1;;;;;;;;;;;2810:77;2727:167:::0;;773:7648;;1618:140:240;1697:8;;;1685:34;;-1:-1:-1;;;;;1685:34:240;;;;1697:8;;;1685:34;;;1729:8;:22;;-1:-1:-1;;;;;;1729:22:240;-1:-1:-1;;;;;1729:22:240;;;;;;;;;;1618:140::o;14:177:270:-;93:13;;-1:-1:-1;;;;;135:31:270;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;:::-;773:7648:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x608060405234801561000f575f80fd5b50600436106100da575f3560e01c80638418e6f311610088578063ae68676c11610063578063ae68676c1461028a578063d38bfff4146102ab578063d6c02926146102be578063eab49501146102d1575f80fd5b80638418e6f3146102025780638aa7760814610251578063a70354a114610264575f80fd5b80630c340a24116100b85780630c340a24146101695780635ca40017146101ad578063629838e5146101e2575f80fd5b80630579e61f146100de57806306c570c11461010b57806306fdde0314610120575b5f80fd5b6100f16100ec3660046117f8565b6102e4565b604080519283526020830191909152015b60405180910390f35b61011e610119366004611837565b6103d2565b005b61015c6040518060400160405280600b81526020017f45756c6572526f7574657200000000000000000000000000000000000000000081525081565b6040516101029190611864565b5f546101889073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b6101886101bb3660046118ce565b60026020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6001546101889073ffffffffffffffffffffffffffffffffffffffff1681565b6102156102103660046117f8565b610803565b6040805194855273ffffffffffffffffffffffffffffffffffffffff938416602086015291831691840191909152166060820152608001610102565b61018861025f3660046118e9565b6109e5565b7f0000000000000000000000000000000000000000000000000000000000000000610188565b61029d6102983660046117f8565b610a2e565b604051908152602001610102565b61011e6102b93660046118ce565b610b16565b61011e6102cc36600461192d565b610e4e565b61011e6102df3660046118ce565b611275565b5f805f6102f2868686610803565b9298509096509450905073ffffffffffffffffffffffffffffffffffffffff8085169086160361032857858692509250506103ca565b6040517f0579e61f0000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff86811660248301528581166044830152821690630579e61f906064016040805180830381865afa1580156103a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c49190611959565b92509250505b935093915050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610691575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610479573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049d919061197b565b905077ff000000000000000000000000000000000000000000000081161515806104df575076ff00000000000000000000000000000000000000000000811615155b80610501575075ff000000000000000000000000000000000000000000811615155b15610538576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa1580156105df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106039190611992565b905073ffffffffffffffffffffffffffffffffffffffff81161580159061065657508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561068d576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff166106b161160f565b73ffffffffffffffffffffffffffffffffffffffff16146106fe576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610763576040517f0693059400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061076f8585611702565b73ffffffffffffffffffffffffffffffffffffffff8281165f818152600360209081526040808320868616808552925280832080547fffffffffffffffffffffffff000000000000000000000000000000000000000016958b16958617905551959750939550919390917f4ac83f39568b63f952374c82351889b07aff4f7e261232a20ba5a2a6d82b9ce091a45050505050565b5f805f808473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff160361084a57508592508491508390505f6109dc565b5f61085587876109e5565b905073ffffffffffffffffffffffffffffffffffffffff8116156108835787945086935085925090506109dc565b73ffffffffffffffffffffffffffffffffffffffff8088165f90815260026020526040902054168015610959576040517f07a2d13a000000000000000000000000000000000000000000000000000000008152600481018a905273ffffffffffffffffffffffffffffffffffffffff8916906307a2d13a90602401602060405180830381865afa158015610919573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093d919061197b565b985061094a898289610803565b955095509550955050506109dc565b60015473ffffffffffffffffffffffffffffffffffffffff169150816109cf576040517f4ca22af000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808a1660048301528816602482015260440160405180910390fd5b5087945086935085925090505b93509350935093565b5f805f6109f28585611702565b73ffffffffffffffffffffffffffffffffffffffff9182165f908152600360209081526040808320938516835292905220541695945050505050565b5f80610a3b858585610803565b9297509095509350905073ffffffffffffffffffffffffffffffffffffffff80841690851603610a6e5784915050610b0f565b6040517fae68676c0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff8581166024830152848116604483015282169063ae68676c90606401602060405180830381865afa158015610ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0b919061197b565b9150505b9392505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610dd5575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be1919061197b565b905077ff00000000000000000000000000000000000000000000008116151580610c23575076ff00000000000000000000000000000000000000000000811615155b80610c45575075ff000000000000000000000000000000000000000000811615155b15610c7c576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa158015610d23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d479190611992565b905073ffffffffffffffffffffffffffffffffffffffff811615801590610d9a57508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15610dd1576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff16610df561160f565b73ffffffffffffffffffffffffffffffffffffffff1614610e42576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4b8161174c565b50565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361110d575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f19919061197b565b905077ff00000000000000000000000000000000000000000000008116151580610f5b575076ff00000000000000000000000000000000000000000000811615155b80610f7d575075ff000000000000000000000000000000000000000000811615155b15610fb4576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa15801561105b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107f9190611992565b905073ffffffffffffffffffffffffffffffffffffffff8116158015906110d257508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611109576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff1661112d61160f565b73ffffffffffffffffffffffffffffffffffffffff161461117a576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81611186575f6111f3565b8273ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f39190611992565b73ffffffffffffffffffffffffffffffffffffffff8481165f8181526002602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016948616948517905551939450919290917f15beaec71c94ee69b5a824e905ca6d1260da10196b715c38b565b80180f630ce91a3505050565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303611534575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a1a3a1d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561131c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611340919061197b565b905077ff00000000000000000000000000000000000000000000008116151580611382575076ff00000000000000000000000000000000000000000000811615155b806113a4575075ff000000000000000000000000000000000000000000811615155b156113db576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82166040517f442b172c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063442b172c90602401602060405180830381865afa158015611482573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a69190611992565b905073ffffffffffffffffffffffffffffffffffffffff8116158015906114f957508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15611530576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5f5473ffffffffffffffffffffffffffffffffffffffff1661155461160f565b73ffffffffffffffffffffffffffffffffffffffff16146115a1576040517ff9e36c0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fef21cd88756d665855f56a2652b7eda229d6f3102988a95975e46964d24d478a905f90a250565b5f3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681036116fd576040517f18503a1e0000000000000000000000000000000000000000000000000000000081525f60048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906318503a1e906024016040805180830381865afa1580156116d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f991906119ad565b5090505b919050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061173e578284611741565b83835b915091509250929050565b5f805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917ff31bb200dbf42bb9cecaa49dceb87eae178b024ad3cf2930b4aaac5cb0f96ec091a35f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff81168114610e4b575f80fd5b5f805f6060848603121561180a575f80fd5b83359250602084013561181c816117d7565b9150604084013561182c816117d7565b809150509250925092565b5f805f60608486031215611849575f80fd5b8335611854816117d7565b9250602084013561181c816117d7565b5f602080835283518060208501525f5b8181101561189057858101830151858201604001528201611874565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f602082840312156118de575f80fd5b8135610b0f816117d7565b5f80604083850312156118fa575f80fd5b8235611905816117d7565b91506020830135611915816117d7565b809150509250929050565b8015158114610e4b575f80fd5b5f806040838503121561193e575f80fd5b8235611949816117d7565b9150602083013561191581611920565b5f806040838503121561196a575f80fd5b505080516020909101519092909150565b5f6020828403121561198b575f80fd5b5051919050565b5f602082840312156119a2575f80fd5b8151610b0f816117d7565b5f80604083850312156119be575f80fd5b82516119c9816117d7565b60208401519092506119158161192056fea2646970667358221220d71b678db67805238737a693bdeb1d631c306ac5cfc0a7e825ebbdb41998540a64736f6c63430008180033", + "sourceMap": "773:7648:37:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5089:344;;;;;;:::i;:::-;;:::i;:::-;;;;808:25:270;;;864:2;849:18;;842:34;;;;781:18;5089:344:37;;;;;;;;3200:398;;;;;;:::i;:::-;;:::i;:::-;;861:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;503:23:240:-;;;;;;;;;;;;2209:42:270;2197:55;;;2179:74;;2167:2;2152:18;503:23:240;2033:226:270;1174:61:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1055:29;;;;;;;;;6942:1031;;;;;;:::i;:::-;;:::i;:::-;;;;2747:25:270;;;2791:42;2869:15;;;2864:2;2849:18;;2842:43;2921:15;;;2901:18;;;2894:43;;;;2973:15;2968:2;2953:18;;2946:43;2734:3;2719:19;6942:1031:37;2516:479:270;5708:198:37;;;;;;:::i;:::-;;:::i;1100:83:9:-;1172:3;1100:83;;4729:321:37;;;;;;:::i;:::-;;:::i;:::-;;;3539:25:270;;;3527:2;3512:18;4729:321:37;3393:177:270;1088:133:240;;;;;;:::i;:::-;;:::i;3985:255:37:-;;;;;;:::i;:::-;;:::i;4495:195::-;;;;;;:::i;:::-;;:::i;5089:344::-;5178:7;5187;5206:14;5264:36;5278:8;5288:4;5294:5;5264:13;:36::i;:::-;5230:70;;-1:-1:-1;5230:70:37;;-1:-1:-1;5230:70:37;-1:-1:-1;5230:70:37;-1:-1:-1;5314:13:37;;;;;;;;5310:46;;5337:8;5347;5329:27;;;;;;;5310:46;5373:53;;;;;;;;4287:25:270;;;5373:30:37;4409:15:270;;;4389:18;;;4382:43;4461:15;;;4441:18;;;4434:43;5373:30:37;;;;;4260:18:270;;5373:53:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5366:60;;;;;5089:344;;;;;;;:::o;3200:398::-;4222:26:9;4244:3;4222:26;:10;:26;4218:531;;4264:5;4280:3;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4264:45;-1:-1:-1;1854:66:3;3796:45;;:50;;4328:66:9;;;-1:-1:-1;1718:66:3;3441:58;;:63;;4360:34:9;4328:94;;;-1:-1:-1;1569:66:3;3125:41;;:46;;4398:24:9;4324:155;;;4449:15;;;;;;;;;;;;;;4324:155;4493:25;1316:66:3;2482:43;;4576:38:9;;;;;:19;2197:55:270;;;4576:38:9;;;2179:74:270;4493:53:9;;-1:-1:-1;4560:13:9;;4576:3;:19;;;;2152:18:270;;4576:38:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4560:54;-1:-1:-1;4633:19:9;;;;;;;:49;;;4665:17;4656:26;;:5;:26;;;;4633:49;4629:110;;;4709:15;;;;;;;;;;;;;;4629:110;4250:499;;;4218:531;1414:8:240::1;::::0;::::1;;1398:12;:10;:12::i;:::-;:24;;;1394:99;;1445:37;;;;;;;;;;;;;;1394:99;3383:5:37::2;3375:13;;:4;:13;;::::0;3371:67:::2;;3397:41;;;;;;;;;;;;;;3371:67;3449:14;3465::::0;3483:18:::2;3489:4;3495:5;3483;:18::i;:::-;3511:15;::::0;;::::2;;::::0;;;:7:::2;:15;::::0;;;;;;;:23;;::::2;::::0;;;;;;;;:32;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;3558:33;3511:15;;-1:-1:-1;3511:23:37;;-1:-1:-1;3511:32:37;;:15;;3558:33:::2;::::0;::::2;3309:289;;3200:398:::0;;;:::o;6942:1031::-;7057:7;7087;7107;7128;7212:5;7204:13;;:4;:13;;;7200:61;;-1:-1:-1;7227:8:37;;-1:-1:-1;7237:4:37;;-1:-1:-1;7243:5:37;;-1:-1:-1;7258:1:37;7219:42;;7200:61;7344:14;7361:32;7381:4;7387:5;7361:19;:32::i;:::-;7344:49;-1:-1:-1;7407:20:37;;;;7403:64;;7437:8;;-1:-1:-1;7447:4:37;;-1:-1:-1;7453:5:37;;-1:-1:-1;7460:6:37;-1:-1:-1;7429:38:37;;7403:64;7539:20;;;;7519:17;7539:20;;;:14;:20;;;;;;;7573:23;;7569:167;;7623:40;;;;;;;;3539:25:270;;;7623:30:37;;;;;;3512:18:270;;7623:40:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7612:51;;7684:41;7698:8;7708:9;7719:5;7684:13;:41::i;:::-;7677:48;;;;;;;;;;;;7569:167;7817:14;;;;;-1:-1:-1;7817:14:37;7841:77;;7874:44;;;;;5367:42:270;5436:15;;;7874:44:37;;;5418:34:270;5488:15;;5468:18;;;5461:43;5330:18;;7874:44:37;;;;;;;7841:77;-1:-1:-1;7936:8:37;;-1:-1:-1;7946:4:37;;-1:-1:-1;7952:5:37;;-1:-1:-1;7959:6:37;-1:-1:-1;6942:1031:37;;;;;;;;:::o;5708:198::-;5787:7;5807:14;5823;5841:18;5847:4;5853:5;5841;:18::i;:::-;5876:15;;;;;;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;5708:198;-1:-1:-1;;;;;5708:198:37:o;4729:321::-;4817:7;4836:14;4894:36;4908:8;4918:4;4924:5;4894:13;:36::i;:::-;4860:70;;-1:-1:-1;4860:70:37;;-1:-1:-1;4860:70:37;-1:-1:-1;4860:70:37;-1:-1:-1;4944:13:37;;;;;;;;4940:34;;4966:8;4959:15;;;;;4940:34;4991:52;;;;;;;;4287:25:270;;;4991:29:37;4409:15:270;;;4389:18;;;4382:43;4461:15;;;4441:18;;;4434:43;4991:29:37;;;;;4260:18:270;;4991:52:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4984:59;;;4729:321;;;;;;:::o;1088:133:240:-;4222:26:9;4244:3;4222:26;:10;:26;4218:531;;4264:5;4280:3;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4264:45;-1:-1:-1;1854:66:3;3796:45;;:50;;4328:66:9;;;-1:-1:-1;1718:66:3;3441:58;;:63;;4360:34:9;4328:94;;;-1:-1:-1;1569:66:3;3125:41;;:46;;4398:24:9;4324:155;;;4449:15;;;;;;;;;;;;;;4324:155;4493:25;1316:66:3;2482:43;;4576:38:9;;;;;:19;2197:55:270;;;4576:38:9;;;2179:74:270;4493:53:9;;-1:-1:-1;4560:13:9;;4576:3;:19;;;;2152:18:270;;4576:38:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4560:54;-1:-1:-1;4633:19:9;;;;;;;:49;;;4665:17;4656:26;;:5;:26;;;;4633:49;4629:110;;;4709:15;;;;;;;;;;;;;;4629:110;4250:499;;;4218:531;1414:8:240::1;::::0;::::1;;1398:12;:10;:12::i;:::-;:24;;;1394:99;;1445:37;;;;;;;;;;;;;;1394:99;1189:25:::2;1202:11;1189:12;:25::i;:::-;1088:133:::0;:::o;3985:255:37:-;4222:26:9;4244:3;4222:26;:10;:26;4218:531;;4264:5;4280:3;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4264:45;-1:-1:-1;1854:66:3;3796:45;;:50;;4328:66:9;;;-1:-1:-1;1718:66:3;3441:58;;:63;;4360:34:9;4328:94;;;-1:-1:-1;1569:66:3;3125:41;;:46;;4398:24:9;4324:155;;;4449:15;;;;;;;;;;;;;;4324:155;4493:25;1316:66:3;2482:43;;4576:38:9;;;;;:19;2197:55:270;;;4576:38:9;;;2179:74:270;4493:53:9;;-1:-1:-1;4560:13:9;;4576:3;:19;;;;2152:18:270;;4576:38:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4560:54;-1:-1:-1;4633:19:9;;;;;;;:49;;;4665:17;4656:26;;:5;:26;;;;4633:49;4629:110;;;4709:15;;;;;;;;;;;;;;4629:110;4250:499;;;4218:531;1414:8:240::1;::::0;::::1;;1398:12;:10;:12::i;:::-;:24;;;1394:99;;1445:37;;;;;;;;;;;;;;1394:99;4091:13:37::2;4107:3;:42;;4147:1;4107:42;;;4122:5;4113:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4159:21;::::0;;::::2;;::::0;;;:14:::2;:21;::::0;;;;;:29;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;4203:30;4159:29;;-1:-1:-1;4159:29:37;;:21;;4203:30:::2;::::0;::::2;4081:159;3985:255:::0;;:::o;4495:195::-;4222:26:9;4244:3;4222:26;:10;:26;4218:531;;4264:5;4280:3;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4264:45;-1:-1:-1;1854:66:3;3796:45;;:50;;4328:66:9;;;-1:-1:-1;1718:66:3;3441:58;;:63;;4360:34:9;4328:94;;;-1:-1:-1;1569:66:3;3125:41;;:46;;4398:24:9;4324:155;;;4449:15;;;;;;;;;;;;;;4324:155;4493:25;1316:66:3;2482:43;;4576:38:9;;;;;:19;2197:55:270;;;4576:38:9;;;2179:74:270;4493:53:9;;-1:-1:-1;4560:13:9;;4576:3;:19;;;;2152:18:270;;4576:38:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4560:54;-1:-1:-1;4633:19:9;;;;;;;:49;;;4665:17;4656:26;;:5;:26;;;;4633:49;4629:110;;;4709:15;;;;;;;;;;;;;;4629:110;4250:499;;;4218:531;1414:8:240::1;::::0;::::1;;1398:12;:10;:12::i;:::-;:24;;;1394:99;;1445:37;;;;;;;;;;;;;;1394:99;4602:14:37::2;:32:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;4649:34:::2;::::0;::::2;::::0;-1:-1:-1;;4649:34:37::2;4495:195:::0;:::o;6371:248:9:-;6424:7;6460:10;6485:22;6503:3;6485:22;;;6481:108;;6535:43;;;;;6575:1;6535:43;;;2179:74:270;6535:3:9;:31;;;;;2152:18:270;;6535:43:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6523:55:9;-1:-1:-1;6481:108:9;6606:6;6371:248;-1:-1:-1;6371:248:9:o;8254:165:37:-;8324:7;8333;8368:6;8359:15;;:6;:15;;;:53;;8397:6;8405;8359:53;;;8378:6;8386;8359:53;8352:60;;;;8254:165;;;;;:::o;1618:140:240:-;1697:8;;;1685:34;;;;;;;1697:8;;;1685:34;;;1729:8;:22;;;;;;;;;;;;;;;1618:140::o;14:154:270:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:456;250:6;258;266;319:2;307:9;298:7;294:23;290:32;287:52;;;335:1;332;325:12;287:52;371:9;358:23;348:33;;431:2;420:9;416:18;403:32;444:31;469:5;444:31;:::i;:::-;494:5;-1:-1:-1;551:2:270;536:18;;523:32;564:33;523:32;564:33;:::i;:::-;616:7;606:17;;;173:456;;;;;:::o;887:529::-;964:6;972;980;1033:2;1021:9;1012:7;1008:23;1004:32;1001:52;;;1049:1;1046;1039:12;1001:52;1088:9;1075:23;1107:31;1132:5;1107:31;:::i;:::-;1157:5;-1:-1:-1;1214:2:270;1199:18;;1186:32;1227:33;1186:32;1227:33;:::i;1421:607::-;1533:4;1562:2;1591;1580:9;1573:21;1623:6;1617:13;1666:6;1661:2;1650:9;1646:18;1639:34;1691:1;1701:140;1715:6;1712:1;1709:13;1701:140;;;1810:14;;;1806:23;;1800:30;1776:17;;;1795:2;1772:26;1765:66;1730:10;;1701:140;;;1705:3;1890:1;1885:2;1876:6;1865:9;1861:22;1857:31;1850:42;2019:2;1949:66;1944:2;1936:6;1932:15;1928:88;1917:9;1913:104;1909:113;1901:121;;;;1421:607;;;;:::o;2264:247::-;2323:6;2376:2;2364:9;2355:7;2351:23;2347:32;2344:52;;;2392:1;2389;2382:12;2344:52;2431:9;2418:23;2450:31;2475:5;2450:31;:::i;3000:388::-;3068:6;3076;3129:2;3117:9;3108:7;3104:23;3100:32;3097:52;;;3145:1;3142;3135:12;3097:52;3184:9;3171:23;3203:31;3228:5;3203:31;:::i;:::-;3253:5;-1:-1:-1;3310:2:270;3295:18;;3282:32;3323:33;3282:32;3323:33;:::i;:::-;3375:7;3365:17;;;3000:388;;;;;:::o;3575:118::-;3661:5;3654:13;3647:21;3640:5;3637:32;3627:60;;3683:1;3680;3673:12;3698:382;3763:6;3771;3824:2;3812:9;3803:7;3799:23;3795:32;3792:52;;;3840:1;3837;3830:12;3792:52;3879:9;3866:23;3898:31;3923:5;3898:31;:::i;:::-;3948:5;-1:-1:-1;4005:2:270;3990:18;;3977:32;4018:30;3977:32;4018:30;:::i;4488:245::-;4567:6;4575;4628:2;4616:9;4607:7;4603:23;4599:32;4596:52;;;4644:1;4641;4634:12;4596:52;-1:-1:-1;;4667:16:270;;4723:2;4708:18;;;4702:25;4667:16;;4702:25;;-1:-1:-1;4488:245:270:o;4738:184::-;4808:6;4861:2;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;-1:-1:-1;4900:16:270;;4738:184;-1:-1:-1;4738:184:270:o;4927:251::-;4997:6;5050:2;5038:9;5029:7;5025:23;5021:32;5018:52;;;5066:1;5063;5056:12;5018:52;5098:9;5092:16;5117:31;5142:5;5117:31;:::i;5515:379::-;5591:6;5599;5652:2;5640:9;5631:7;5627:23;5623:32;5620:52;;;5668:1;5665;5658:12;5620:52;5700:9;5694:16;5719:31;5744:5;5719:31;:::i;:::-;5819:2;5804:18;;5798:25;5769:5;;-1:-1:-1;5832:30:270;5798:25;5832:30;:::i", + "linkReferences": {}, + "immutableReferences": { + "4898": [ + { "start": 614, "length": 32 }, + { "start": 1001, "length": 32 }, + { "start": 1042, "length": 32 }, + { "start": 1434, "length": 32 }, + { "start": 2861, "length": 32 }, + { "start": 2902, "length": 32 }, + { "start": 3294, "length": 32 }, + { "start": 3685, "length": 32 }, + { "start": 3726, "length": 32 }, + { "start": 4118, "length": 32 }, + { "start": 4748, "length": 32 }, + { "start": 4789, "length": 32 }, + { "start": 5181, "length": 32 }, + { "start": 5672, "length": 32 }, + { "start": 5756, "length": 32 } + ] + } + }, + "methodIdentifiers": { + "EVC()": "a70354a1", + "fallbackOracle()": "629838e5", + "getConfiguredOracle(address,address)": "8aa77608", + "getQuote(uint256,address,address)": "ae68676c", + "getQuotes(uint256,address,address)": "0579e61f", + "govSetConfig(address,address,address)": "06c570c1", + "govSetFallbackOracle(address)": "eab49501", + "govSetResolvedVault(address,bool)": "d6c02926", + "governor()": "0c340a24", + "name()": "06fdde03", + "resolveOracle(uint256,address,address)": "8418e6f3", + "resolvedVaults(address)": "5ca40017", + "transferGovernance(address)": "d38bfff4" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_evc\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_governor\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ControllerDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EVC_InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Governance_CallerNotGovernor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAuthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PriceOracle_InvalidConfiguration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"PriceOracle_NotSupported\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset0\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset1\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fallbackOracle\",\"type\":\"address\"}],\"name\":\"FallbackOracleSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldGovernor\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newGovernor\",\"type\":\"address\"}],\"name\":\"GovernorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ResolvedVaultSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"EVC\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackOracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"getConfiguredOracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"getQuote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"getQuotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"}],\"name\":\"govSetConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_fallbackOracle\",\"type\":\"address\"}],\"name\":\"govSetFallbackOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"set\",\"type\":\"bool\"}],\"name\":\"govSetResolvedVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"resolveOracle\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vault\",\"type\":\"address\"}],\"name\":\"resolvedVaults\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newGovernor\",\"type\":\"address\"}],\"name\":\"transferGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Euler Labs (https://www.eulerlabs.com/)\",\"custom:security-contact\":\"security@euler.xyz\",\"details\":\"Integration Note: The router supports pricing via `convertToAssets` for trusted `resolvedVaults`. By ERC4626 spec `convert*` ignores liquidity restrictions, fees, slippage and per-user restrictions. Therefore the reported price may not be realizable through `redeem` or `withdraw`.\",\"errors\":{\"PriceOracle_NotSupported(address,address)\":[{\"params\":{\"base\":\"The address of the base asset.\",\"quote\":\"The address of the quote asset.\"}}]},\"events\":{\"ConfigSet(address,address,address)\":{\"details\":\"If `oracle` is `address(0)` then the configuration was removed. The keys are lexicographically sorted (asset0 < asset1).\",\"params\":{\"asset0\":\"The address first in lexicographic order.\",\"asset1\":\"The address second in lexicographic order.\",\"oracle\":\"The address of the PriceOracle that resolves the pair.\"}},\"FallbackOracleSet(address)\":{\"details\":\"If `fallbackOracle` is `address(0)` then there is no fallback resolver.\",\"params\":{\"fallbackOracle\":\"The address of the PriceOracle that is called when base/quote is not configured.\"}},\"GovernorSet(address,address)\":{\"params\":{\"newGovernor\":\"The address of the newly appointed governor.\",\"oldGovernor\":\"The address of the previous governor.\"}},\"ResolvedVaultSet(address,address)\":{\"details\":\"If `asset` is `address(0)` then the configuration was removed.\",\"params\":{\"asset\":\"The address of the vault's asset.\",\"vault\":\"The address of the ERC4626 vault.\"}}},\"kind\":\"dev\",\"methods\":{\"EVC()\":{\"returns\":{\"_0\":\"The address of the EVC contract.\"}},\"constructor\":{\"params\":{\"_governor\":\"The address of the governor.\"}},\"getConfiguredOracle(address,address)\":{\"params\":{\"base\":\"The address of the base token.\",\"quote\":\"The address of the quote token.\"},\"returns\":{\"_0\":\"The configured `PriceOracle` for the pair or `address(0)` if no oracle is configured.\"}},\"getQuote(uint256,address,address)\":{\"params\":{\"base\":\"The token that is being priced.\",\"inAmount\":\"The amount of `base` to convert.\",\"quote\":\"The token that is the unit of account.\"},\"returns\":{\"_0\":\"The amount of `quote` that is equivalent to `inAmount` of `base`.\"}},\"getQuotes(uint256,address,address)\":{\"params\":{\"base\":\"The token that is being priced.\",\"inAmount\":\"The amount of `base` to convert.\",\"quote\":\"The token that is the unit of account.\"},\"returns\":{\"_0\":\"The amount of `quote` you would get for selling `inAmount` of `base`.\",\"_1\":\"The amount of `quote` you would spend for buying `inAmount` of `base`.\"}},\"govSetConfig(address,address,address)\":{\"details\":\"Callable only by the governor.\",\"params\":{\"base\":\"The address of the base token.\",\"oracle\":\"The address of the PriceOracle to resolve the pair.\",\"quote\":\"The address of the quote token.\"}},\"govSetFallbackOracle(address)\":{\"details\":\"Callable only by the governor. `address(0)` removes the fallback.\",\"params\":{\"_fallbackOracle\":\"The address of the PriceOracle that is called when base/quote is not configured.\"}},\"govSetResolvedVault(address,bool)\":{\"details\":\"Callable only by the governor. Vault must implement ERC4626. Note: Before configuring a vault verify that its `convertToAssets` is secure.\",\"params\":{\"set\":\"True to configure the vault, false to clear the record.\",\"vault\":\"The address of the ERC4626 vault.\"}},\"resolveOracle(uint256,address,address)\":{\"details\":\"Implements the following resolution logic: 1. Check the base case: `base == quote` and terminate if true. 2. If a PriceOracle is configured for base/quote in the `oracles` mapping, return it. 3. If `base` is configured as a resolved ERC4626 vault, call `convertToAssets(inAmount)` and continue the recursion, substituting the ERC4626 `asset` for `base`. 4. As a last resort, return the fallback oracle or revert if it is not set.\",\"params\":{\"base\":\"The token that is being priced.\",\"inAmount\":\"The amount of `base` to convert.\",\"quote\":\"The token that is the unit of account.\"},\"returns\":{\"_0\":\"The resolved amount. This value may be different from the original `inAmount` if the resolution path included an ERC4626 vault present in `resolvedVaults`.\",\"_1\":\"The resolved base.\",\"_2\":\"The resolved quote.\",\"_3\":\"The resolved PriceOracle to call.\"}},\"transferGovernance(address)\":{\"details\":\"Can only be called by the current governor.\",\"params\":{\"newGovernor\":\"The address of the next governor.\"}}},\"stateVariables\":{\"fallbackOracle\":{\"details\":\"If `address(0)` then there is no fallback.\"},\"name\":{\"return\":\"The name of the oracle.\",\"returns\":{\"_0\":\"The name of the oracle.\"}},\"oracles\":{\"details\":\"The keys are lexicographically sorted (asset0 < asset1).\"}},\"title\":\"EulerRouter\",\"version\":1},\"userdoc\":{\"errors\":{\"Governance_CallerNotGovernor()\":[{\"notice\":\"The method can only be called by the governor.\"}],\"PriceOracle_InvalidConfiguration()\":[{\"notice\":\"The configuration parameters for the PriceOracle are invalid.\"}],\"PriceOracle_NotSupported(address,address)\":[{\"notice\":\"The base/quote path is not supported.\"}]},\"events\":{\"ConfigSet(address,address,address)\":{\"notice\":\"Configure a PriceOracle to resolve an asset pair.\"},\"FallbackOracleSet(address)\":{\"notice\":\"Set a PriceOracle as a fallback resolver.\"},\"GovernorSet(address,address)\":{\"notice\":\"Set the governor of the contract.\"},\"ResolvedVaultSet(address,address)\":{\"notice\":\"Mark an ERC4626 vault to be resolved to its `asset` via its `convert*` methods.\"}},\"kind\":\"user\",\"methods\":{\"EVC()\":{\"notice\":\"Returns the address of the Ethereum Vault Connector (EVC) used by this contract.\"},\"constructor\":{\"notice\":\"Deploy EulerRouter.\"},\"fallbackOracle()\":{\"notice\":\"The PriceOracle to call if this router is not configured for base/quote.\"},\"getConfiguredOracle(address,address)\":{\"notice\":\"Get the PriceOracle configured for base/quote.\"},\"getQuote(uint256,address,address)\":{\"notice\":\"One-sided price: How much quote token you would get for inAmount of base token, assuming no price spread.\"},\"getQuotes(uint256,address,address)\":{\"notice\":\"Two-sided price: How much quote token you would get/spend for selling/buying inAmount of base token.\"},\"govSetConfig(address,address,address)\":{\"notice\":\"Configure a PriceOracle to resolve base/quote and quote/base.\"},\"govSetFallbackOracle(address)\":{\"notice\":\"Set a PriceOracle as a fallback resolver.\"},\"govSetResolvedVault(address,bool)\":{\"notice\":\"Configure an ERC4626 vault to use internal pricing via `convert*` methods.\"},\"governor()\":{\"notice\":\"The active governor address. If `address(0)` then the role is renounced.\"},\"name()\":{\"notice\":\"Get the name of the oracle.\"},\"resolveOracle(uint256,address,address)\":{\"notice\":\"Resolve the PriceOracle to call for a given base/quote pair.\"},\"resolvedVaults(address)\":{\"notice\":\"ERC4626 vaults resolved using internal pricing (`convertToAssets`).\"},\"transferGovernance(address)\":{\"notice\":\"Transfer the governor role to another address.\"}},\"notice\":\"Default Oracle resolver for Euler lending products.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/euler-price-oracle/src/EulerRouter.sol\":\"EulerRouter\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/\",\":@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/\",\":@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/\",\":@solady/=lib/euler-price-oracle/lib/solady/src/\",\":@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/\",\":@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/\",\":axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/\",\":axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":ethereum-vault-connector/=lib/ethereum-vault-connector/src/\",\":euler-price-oracle-test/=lib/euler-price-oracle/test/\",\":euler-price-oracle/=lib/euler-price-oracle/src/\",\":euler-vault-kit/=lib/euler-vault-kit/src/\",\":evc/=lib/ethereum-vault-connector/src/\",\":evk-test/=lib/euler-vault-kit/test/\",\":evk/=lib/euler-vault-kit/src/\",\":fee-flow/=lib/fee-flow/src/\",\":forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/\",\":permit2/=lib/euler-vault-kit/lib/permit2/\",\":pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":redstone-oracles-monorepo/=lib/euler-price-oracle/lib/\",\":reward-streams/=lib/reward-streams/src/\",\":solady/=lib/euler-price-oracle/lib/solady/src/\",\":solmate/=lib/fee-flow/lib/solmate/src/\",\":v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/\",\":v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/\"]},\"sources\":{\"lib/ethereum-vault-connector/src/ExecutionContext.sol\":{\"keccak256\":\"0x3aac641b64fd072d277dbf1cf4e2d264a124efa84df8b896181232ad9338ef54\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b390a6511bbce7e097844e8df0a6f27b625c79b3dc81cd500ad0c30647e7b858\",\"dweb:/ipfs/QmQ4DNA5AotHxnMg5NJuBNeMw69KFb64HgM3Nq2f5jMKD3\"]},\"lib/ethereum-vault-connector/src/interfaces/IEthereumVaultConnector.sol\":{\"keccak256\":\"0x2d7b4cf0a3346feada4b7bc2c661c89fa60a485f498f374078a934cd4ece7c7b\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e8c832fdc952913ffeec92cdbf06266b427c66d87ad1b5d027c73b22fc4fc82d\",\"dweb:/ipfs/QmPEcrWAR85tMKBFQDnTZxgXPVENRU2B6MBgzgRBhbV8oP\"]},\"lib/ethereum-vault-connector/src/utils/EVCUtil.sol\":{\"keccak256\":\"0xf36dc84b186ae90745ebb78b6ee59f9971d098309bbb041c589edfebb5441e3f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://046734dff2a3323902550f58bc03238570574daa5f9abbf7c2dbf9d2211a1ce8\",\"dweb:/ipfs/QmWSCff8GUSxw7YY5KMiMVgSH8AMUKpkJYrtx1uuRCzSoT\"]},\"lib/euler-price-oracle/src/EulerRouter.sol\":{\"keccak256\":\"0xee19338e004710b4d63aa93cfdd45937a7d6317fc3b242a2ad7e26b1da1916e4\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://2ff0a8a79f85d188d86c5ecf28e9e14e89360d90118bf9c6f99096508277854f\",\"dweb:/ipfs/QmayYDVhH6tckTPgZw8mPf6FRnacNYuWmHkaGQ3EjnLKUS\"]},\"lib/forge-std/src/interfaces/IERC20.sol\":{\"keccak256\":\"0x4cab887298790f908c27de107e4e2907ca5413aee482ef776f8d2f353c5ef947\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bb715e0c4a2bdbe432bb624501506041f06e878e0b72675aebba30ad2c2b72e7\",\"dweb:/ipfs/QmWhhLSvkxS2NrukJJHqFY8gDVE5r9rD4PfHvR24pwdKv9\"]},\"lib/forge-std/src/interfaces/IERC4626.sol\":{\"keccak256\":\"0x324b43bdb94d78fe11220102056ba27362b7083fbc394fddc86dd68f75c0e46e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://182634c0295b6ce25fb524a614a534de2ef805d68712ca6cefb0f02f25dbcb65\",\"dweb:/ipfs/QmcpXKznSpfMLAzUitdVVUL2FXMx35RWWBcUcaenjwdUij\"]},\"src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0x03567dd4084dc74a9e2f9eeffce4d9047989b0d2122820716c3bc75891484308\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://23965a79475c85a0a8a3a137a76424f60debd9e592bc9127d463392fad7df30f\",\"dweb:/ipfs/QmPc1bV3kZ3ynLGTqG6xRbZ3E5AstYdfipXbysSqYGhJYA\"]},\"src/lib/Errors.sol\":{\"keccak256\":\"0x2551662bcef8d4a5cb7cdc8cd404f28c726af1bcfe7ef371b22d53322a932698\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://1641b99e0c907950448d62205fc23b5550c44899ba8c0bc0274a6b0a501981b9\",\"dweb:/ipfs/QmZvDhw4Ao3m8jRjNjT8Xq8imCPecJyytUTtCUjt5RoB4v\"]},\"src/lib/Governable.sol\":{\"keccak256\":\"0xce41206071ab1b37c0dc9510ea75482df90904cb48766a8d23acb7f47d6e2808\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://64eca98dd6719d83d0d0958804d03ea4210d7a65e678273b466d0d91101acf37\",\"dweb:/ipfs/QmZ2ibPPHm2uvUcBiYF34fHWz6wv1AAErP8xgHuuun6puo\"]}},\"version\":1}", + "metadata": { + "compiler": { "version": "0.8.24+commit.e11b9ed9" }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "_evc", "type": "address" }, + { + "internalType": "address", + "name": "_governor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "type": "error", "name": "ControllerDisabled" }, + { "inputs": [], "type": "error", "name": "EVC_InvalidAddress" }, + { + "inputs": [], + "type": "error", + "name": "Governance_CallerNotGovernor" + }, + { "inputs": [], "type": "error", "name": "NotAuthorized" }, + { + "inputs": [], + "type": "error", + "name": "PriceOracle_InvalidConfiguration" + }, + { + "inputs": [ + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "type": "error", + "name": "PriceOracle_NotSupported" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset0", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "asset1", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "oracle", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ConfigSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "fallbackOracle", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "FallbackOracleSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oldGovernor", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "newGovernor", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "GovernorSet", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address", + "indexed": true + }, + { + "internalType": "address", + "name": "asset", + "type": "address", + "indexed": true + } + ], + "type": "event", + "name": "ResolvedVaultSet", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "EVC", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "fallbackOracle", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "getConfiguredOracle", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inAmount", + "type": "uint256" + }, + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "getQuote", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inAmount", + "type": "uint256" + }, + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "getQuotes", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" }, + { "internalType": "address", "name": "oracle", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "govSetConfig" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_fallbackOracle", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "govSetFallbackOracle" + }, + { + "inputs": [ + { "internalType": "address", "name": "vault", "type": "address" }, + { "internalType": "bool", "name": "set", "type": "bool" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "govSetResolvedVault" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "governor", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { "internalType": "string", "name": "", "type": "string" } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inAmount", + "type": "uint256" + }, + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "resolveOracle", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "vault", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "resolvedVaults", + "outputs": [ + { "internalType": "address", "name": "asset", "type": "address" } + ] + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferGovernance" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "EVC()": { "returns": { "_0": "The address of the EVC contract." } }, + "constructor": { + "params": { "_governor": "The address of the governor." } + }, + "getConfiguredOracle(address,address)": { + "params": { + "base": "The address of the base token.", + "quote": "The address of the quote token." + }, + "returns": { + "_0": "The configured `PriceOracle` for the pair or `address(0)` if no oracle is configured." + } + }, + "getQuote(uint256,address,address)": { + "params": { + "base": "The token that is being priced.", + "inAmount": "The amount of `base` to convert.", + "quote": "The token that is the unit of account." + }, + "returns": { + "_0": "The amount of `quote` that is equivalent to `inAmount` of `base`." + } + }, + "getQuotes(uint256,address,address)": { + "params": { + "base": "The token that is being priced.", + "inAmount": "The amount of `base` to convert.", + "quote": "The token that is the unit of account." + }, + "returns": { + "_0": "The amount of `quote` you would get for selling `inAmount` of `base`.", + "_1": "The amount of `quote` you would spend for buying `inAmount` of `base`." + } + }, + "govSetConfig(address,address,address)": { + "details": "Callable only by the governor.", + "params": { + "base": "The address of the base token.", + "oracle": "The address of the PriceOracle to resolve the pair.", + "quote": "The address of the quote token." + } + }, + "govSetFallbackOracle(address)": { + "details": "Callable only by the governor. `address(0)` removes the fallback.", + "params": { + "_fallbackOracle": "The address of the PriceOracle that is called when base/quote is not configured." + } + }, + "govSetResolvedVault(address,bool)": { + "details": "Callable only by the governor. Vault must implement ERC4626. Note: Before configuring a vault verify that its `convertToAssets` is secure.", + "params": { + "set": "True to configure the vault, false to clear the record.", + "vault": "The address of the ERC4626 vault." + } + }, + "resolveOracle(uint256,address,address)": { + "details": "Implements the following resolution logic: 1. Check the base case: `base == quote` and terminate if true. 2. If a PriceOracle is configured for base/quote in the `oracles` mapping, return it. 3. If `base` is configured as a resolved ERC4626 vault, call `convertToAssets(inAmount)` and continue the recursion, substituting the ERC4626 `asset` for `base`. 4. As a last resort, return the fallback oracle or revert if it is not set.", + "params": { + "base": "The token that is being priced.", + "inAmount": "The amount of `base` to convert.", + "quote": "The token that is the unit of account." + }, + "returns": { + "_0": "The resolved amount. This value may be different from the original `inAmount` if the resolution path included an ERC4626 vault present in `resolvedVaults`.", + "_1": "The resolved base.", + "_2": "The resolved quote.", + "_3": "The resolved PriceOracle to call." + } + }, + "transferGovernance(address)": { + "details": "Can only be called by the current governor.", + "params": { "newGovernor": "The address of the next governor." } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "EVC()": { + "notice": "Returns the address of the Ethereum Vault Connector (EVC) used by this contract." + }, + "constructor": { "notice": "Deploy EulerRouter." }, + "fallbackOracle()": { + "notice": "The PriceOracle to call if this router is not configured for base/quote." + }, + "getConfiguredOracle(address,address)": { + "notice": "Get the PriceOracle configured for base/quote." + }, + "getQuote(uint256,address,address)": { + "notice": "One-sided price: How much quote token you would get for inAmount of base token, assuming no price spread." + }, + "getQuotes(uint256,address,address)": { + "notice": "Two-sided price: How much quote token you would get/spend for selling/buying inAmount of base token." + }, + "govSetConfig(address,address,address)": { + "notice": "Configure a PriceOracle to resolve base/quote and quote/base." + }, + "govSetFallbackOracle(address)": { + "notice": "Set a PriceOracle as a fallback resolver." + }, + "govSetResolvedVault(address,bool)": { + "notice": "Configure an ERC4626 vault to use internal pricing via `convert*` methods." + }, + "governor()": { + "notice": "The active governor address. If `address(0)` then the role is renounced." + }, + "name()": { "notice": "Get the name of the oracle." }, + "resolveOracle(uint256,address,address)": { + "notice": "Resolve the PriceOracle to call for a given base/quote pair." + }, + "resolvedVaults(address)": { + "notice": "ERC4626 vaults resolved using internal pricing (`convertToAssets`)." + }, + "transferGovernance(address)": { + "notice": "Transfer the governor role to another address." + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/", + "@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/", + "@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/", + "@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/", + "@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/", + "@solady/=lib/euler-price-oracle/lib/solady/src/", + "@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/", + "@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/", + "axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/", + "axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/", + "ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", + "ethereum-vault-connector/=lib/ethereum-vault-connector/src/", + "euler-price-oracle-test/=lib/euler-price-oracle/test/", + "euler-price-oracle/=lib/euler-price-oracle/src/", + "euler-vault-kit/=lib/euler-vault-kit/src/", + "evc/=lib/ethereum-vault-connector/src/", + "evk-test/=lib/euler-vault-kit/test/", + "evk/=lib/euler-vault-kit/src/", + "fee-flow/=lib/fee-flow/src/", + "forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", + "openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/", + "permit2/=lib/euler-vault-kit/lib/permit2/", + "pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/", + "redstone-oracles-monorepo/=lib/euler-price-oracle/lib/", + "reward-streams/=lib/reward-streams/src/", + "solady/=lib/euler-price-oracle/lib/solady/src/", + "solmate/=lib/fee-flow/lib/solmate/src/", + "v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/", + "v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/" + ], + "optimizer": { "enabled": true, "runs": 20000 }, + "metadata": { "bytecodeHash": "ipfs" }, + "compilationTarget": { + "lib/euler-price-oracle/src/EulerRouter.sol": "EulerRouter" + }, + "evmVersion": "cancun", + "libraries": {} + }, + "sources": { + "lib/ethereum-vault-connector/src/ExecutionContext.sol": { + "keccak256": "0x3aac641b64fd072d277dbf1cf4e2d264a124efa84df8b896181232ad9338ef54", + "urls": [ + "bzz-raw://b390a6511bbce7e097844e8df0a6f27b625c79b3dc81cd500ad0c30647e7b858", + "dweb:/ipfs/QmQ4DNA5AotHxnMg5NJuBNeMw69KFb64HgM3Nq2f5jMKD3" + ], + "license": "GPL-2.0-or-later" + }, + "lib/ethereum-vault-connector/src/interfaces/IEthereumVaultConnector.sol": { + "keccak256": "0x2d7b4cf0a3346feada4b7bc2c661c89fa60a485f498f374078a934cd4ece7c7b", + "urls": [ + "bzz-raw://e8c832fdc952913ffeec92cdbf06266b427c66d87ad1b5d027c73b22fc4fc82d", + "dweb:/ipfs/QmPEcrWAR85tMKBFQDnTZxgXPVENRU2B6MBgzgRBhbV8oP" + ], + "license": "GPL-2.0-or-later" + }, + "lib/ethereum-vault-connector/src/utils/EVCUtil.sol": { + "keccak256": "0xf36dc84b186ae90745ebb78b6ee59f9971d098309bbb041c589edfebb5441e3f", + "urls": [ + "bzz-raw://046734dff2a3323902550f58bc03238570574daa5f9abbf7c2dbf9d2211a1ce8", + "dweb:/ipfs/QmWSCff8GUSxw7YY5KMiMVgSH8AMUKpkJYrtx1uuRCzSoT" + ], + "license": "MIT" + }, + "lib/euler-price-oracle/src/EulerRouter.sol": { + "keccak256": "0xee19338e004710b4d63aa93cfdd45937a7d6317fc3b242a2ad7e26b1da1916e4", + "urls": [ + "bzz-raw://2ff0a8a79f85d188d86c5ecf28e9e14e89360d90118bf9c6f99096508277854f", + "dweb:/ipfs/QmayYDVhH6tckTPgZw8mPf6FRnacNYuWmHkaGQ3EjnLKUS" + ], + "license": "GPL-2.0-or-later" + }, + "lib/forge-std/src/interfaces/IERC20.sol": { + "keccak256": "0x4cab887298790f908c27de107e4e2907ca5413aee482ef776f8d2f353c5ef947", + "urls": [ + "bzz-raw://bb715e0c4a2bdbe432bb624501506041f06e878e0b72675aebba30ad2c2b72e7", + "dweb:/ipfs/QmWhhLSvkxS2NrukJJHqFY8gDVE5r9rD4PfHvR24pwdKv9" + ], + "license": "MIT" + }, + "lib/forge-std/src/interfaces/IERC4626.sol": { + "keccak256": "0x324b43bdb94d78fe11220102056ba27362b7083fbc394fddc86dd68f75c0e46e", + "urls": [ + "bzz-raw://182634c0295b6ce25fb524a614a534de2ef805d68712ca6cefb0f02f25dbcb65", + "dweb:/ipfs/QmcpXKznSpfMLAzUitdVVUL2FXMx35RWWBcUcaenjwdUij" + ], + "license": "MIT" + }, + "src/interfaces/IPriceOracle.sol": { + "keccak256": "0x03567dd4084dc74a9e2f9eeffce4d9047989b0d2122820716c3bc75891484308", + "urls": [ + "bzz-raw://23965a79475c85a0a8a3a137a76424f60debd9e592bc9127d463392fad7df30f", + "dweb:/ipfs/QmPc1bV3kZ3ynLGTqG6xRbZ3E5AstYdfipXbysSqYGhJYA" + ], + "license": "GPL-2.0-or-later" + }, + "src/lib/Errors.sol": { + "keccak256": "0x2551662bcef8d4a5cb7cdc8cd404f28c726af1bcfe7ef371b22d53322a932698", + "urls": [ + "bzz-raw://1641b99e0c907950448d62205fc23b5550c44899ba8c0bc0274a6b0a501981b9", + "dweb:/ipfs/QmZvDhw4Ao3m8jRjNjT8Xq8imCPecJyytUTtCUjt5RoB4v" + ], + "license": "GPL-2.0-or-later" + }, + "src/lib/Governable.sol": { + "keccak256": "0xce41206071ab1b37c0dc9510ea75482df90904cb48766a8d23acb7f47d6e2808", + "urls": [ + "bzz-raw://64eca98dd6719d83d0d0958804d03ea4210d7a65e678273b466d0d91101acf37", + "dweb:/ipfs/QmZ2ibPPHm2uvUcBiYF34fHWz6wv1AAErP8xgHuuun6puo" + ], + "license": "GPL-2.0-or-later" + } + }, + "version": 1 + }, + "id": 37 +} diff --git a/contracts/IEVC.sol b/contracts/IEVC.sol new file mode 100644 index 0000000..0b9229c --- /dev/null +++ b/contracts/IEVC.sol @@ -0,0 +1,426 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.8.19; + +/// @title IEVC +/// @custom:security-contact security@euler.xyz +/// @author Euler Labs (https://www.eulerlabs.com/) +/// @notice This interface defines the methods for the Ethereum Vault Connector. +interface IEVC { + /// @notice A struct representing a batch item. + /// @dev Each batch item represents a single operation to be performed within a checks deferred context. + struct BatchItem { + /// @notice The target contract to be called. + address targetContract; + /// @notice The account on behalf of which the operation is to be performed. msg.sender must be authorized to + /// act on behalf of this account. Must be address(0) if the target contract is the EVC itself. + address onBehalfOfAccount; + /// @notice The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole + /// balance of the EVC contract will be forwarded. Must be 0 if the target contract is the EVC itself. + uint256 value; + /// @notice The encoded data which is called on the target contract. + bytes data; + } + + /// @notice A struct representing the result of a batch item operation. + /// @dev Used only for simulation purposes. + struct BatchItemResult { + /// @notice A boolean indicating whether the operation was successful. + bool success; + /// @notice The result of the operation. + bytes result; + } + + /// @notice A struct representing the result of the account or vault status check. + /// @dev Used only for simulation purposes. + struct StatusCheckResult { + /// @notice The address of the account or vault for which the check was performed. + address checkedAddress; + /// @notice A boolean indicating whether the status of the account or vault is valid. + bool isValid; + /// @notice The result of the check. + bytes result; + } + + /// @notice Returns current raw execution context. + /// @dev When checks in progress, on behalf of account is always address(0). + /// @return context Current raw execution context. + function getRawExecutionContext() external view returns (uint256 context); + + /// @notice Returns an account on behalf of which the operation is being executed at the moment and whether the + /// controllerToCheck is an enabled controller for that account. + /// @dev This function should only be used by external smart contracts if msg.sender is the EVC. Otherwise, the + /// account address returned must not be trusted. + /// @dev When checks in progress, on behalf of account is always address(0). When address is zero, the function + /// reverts to protect the consumer from ever relying on the on behalf of account address which is in its default + /// state. + /// @param controllerToCheck The address of the controller for which it is checked whether it is an enabled + /// controller for the account on behalf of which the operation is being executed at the moment. + /// @return onBehalfOfAccount An account that has been authenticated and on behalf of which the operation is being + /// executed at the moment. + /// @return controllerEnabled A boolean value that indicates whether controllerToCheck is an enabled controller for + /// the account on behalf of which the operation is being executed at the moment. Always false if controllerToCheck + /// is address(0). + function getCurrentOnBehalfOfAccount(address controllerToCheck) + external + view + returns (address onBehalfOfAccount, bool controllerEnabled); + + /// @notice Checks if checks are deferred. + /// @return A boolean indicating whether checks are deferred. + function areChecksDeferred() external view returns (bool); + + /// @notice Checks if checks are in progress. + /// @return A boolean indicating whether checks are in progress. + function areChecksInProgress() external view returns (bool); + + /// @notice Checks if control collateral is in progress. + /// @return A boolean indicating whether control collateral is in progress. + function isControlCollateralInProgress() external view returns (bool); + + /// @notice Checks if an operator is authenticated. + /// @return A boolean indicating whether an operator is authenticated. + function isOperatorAuthenticated() external view returns (bool); + + /// @notice Checks if a simulation is in progress. + /// @return A boolean indicating whether a simulation is in progress. + function isSimulationInProgress() external view returns (bool); + + /// @notice Checks whether the specified account and the other account have the same owner. + /// @dev The function is used to check whether one account is authorized to perform operations on behalf of the + /// other. Accounts are considered to have a common owner if they share the first 19 bytes of their address. + /// @param account The address of the account that is being checked. + /// @param otherAccount The address of the other account that is being checked. + /// @return A boolean flag that indicates whether the accounts have the same owner. + function haveCommonOwner(address account, address otherAccount) external pure returns (bool); + + /// @notice Returns the address prefix of the specified account. + /// @dev The address prefix is the first 19 bytes of the account address. + /// @param account The address of the account whose address prefix is being retrieved. + /// @return A bytes19 value that represents the address prefix of the account. + function getAddressPrefix(address account) external pure returns (bytes19); + + /// @notice Returns the owner for the specified account. + /// @dev The function returns address(0) if the owner is not registered. Registration of the owner happens on the + /// initial + /// interaction with the EVC that requires authentication of an owner. + /// @param account The address of the account whose owner is being retrieved. + /// @return owner The address of the account owner. An account owner is an EOA/smart contract which address matches + /// the first 19 bytes of the account address. + function getAccountOwner(address account) external view returns (address); + + /// @notice Checks if lockdown mode is enabled for a given address prefix. + /// @param addressPrefix The address prefix to check for lockdown mode status. + /// @return A boolean indicating whether lockdown mode is enabled. + function isLockdownMode(bytes19 addressPrefix) external view returns (bool); + + /// @notice Checks if permit functionality is disabled for a given address prefix. + /// @param addressPrefix The address prefix to check for permit functionality status. + /// @return A boolean indicating whether permit functionality is disabled. + function isPermitDisabledMode(bytes19 addressPrefix) external view returns (bool); + + /// @notice Returns the current nonce for a given address prefix and nonce namespace. + /// @dev Each nonce namespace provides 256 bit nonce that has to be used sequentially. There's no requirement to use + /// all the nonces for a given nonce namespace before moving to the next one which allows to use permit messages in + /// a non-sequential manner. + /// @param addressPrefix The address prefix for which the nonce is being retrieved. + /// @param nonceNamespace The nonce namespace for which the nonce is being retrieved. + /// @return nonce The current nonce for the given address prefix and nonce namespace. + function getNonce(bytes19 addressPrefix, uint256 nonceNamespace) external view returns (uint256 nonce); + + /// @notice Returns the bit field for a given address prefix and operator. + /// @dev The bit field is used to store information about authorized operators for a given address prefix. Each bit + /// in the bit field corresponds to one account belonging to the same owner. If the bit is set, the operator is + /// authorized for the account. + /// @param addressPrefix The address prefix for which the bit field is being retrieved. + /// @param operator The address of the operator for which the bit field is being retrieved. + /// @return operatorBitField The bit field for the given address prefix and operator. The bit field defines which + /// accounts the operator is authorized for. It is a 256-position binary array like 0...010...0, marking the account + /// positionally in a uint256. The position in the bit field corresponds to the account ID (0-255), where 0 is the + /// owner account's ID. + function getOperator(bytes19 addressPrefix, address operator) external view returns (uint256 operatorBitField); + + /// @notice Returns whether a given operator has been authorized for a given account. + /// @param account The address of the account whose operator is being checked. + /// @param operator The address of the operator that is being checked. + /// @return authorized A boolean value that indicates whether the operator is authorized for the account. + function isAccountOperatorAuthorized(address account, address operator) external view returns (bool authorized); + + /// @notice Enables or disables lockdown mode for a given address prefix. + /// @dev This function can only be called by the owner of the address prefix. To disable this mode, the EVC + /// must be called directly. It is not possible to disable this mode by using checks-deferrable call or + /// permit message. + /// @param addressPrefix The address prefix for which the lockdown mode is being set. + /// @param enabled A boolean indicating whether to enable or disable lockdown mode. + function setLockdownMode(bytes19 addressPrefix, bool enabled) external payable; + + /// @notice Enables or disables permit functionality for a given address prefix. + /// @dev This function can only be called by the owner of the address prefix. To disable this mode, the EVC + /// must be called directly. It is not possible to disable this mode by using checks-deferrable call or (by + /// definition) permit message. To support permit functionality by default, note that the logic was inverted here. To + /// disable the permit functionality, one must pass true as the second argument. To enable the permit + /// functionality, one must pass false as the second argument. + /// @param addressPrefix The address prefix for which the permit functionality is being set. + /// @param enabled A boolean indicating whether to enable or disable the disable-permit mode. + function setPermitDisabledMode(bytes19 addressPrefix, bool enabled) external payable; + + /// @notice Sets the nonce for a given address prefix and nonce namespace. + /// @dev This function can only be called by the owner of the address prefix. Each nonce namespace provides a 256 + /// bit nonce that has to be used sequentially. There's no requirement to use all the nonces for a given nonce + /// namespace before moving to the next one which allows the use of permit messages in a non-sequential manner. To + /// invalidate signed permit messages, set the nonce for a given nonce namespace accordingly. To invalidate all the + /// permit messages for a given nonce namespace, set the nonce to type(uint).max. + /// @param addressPrefix The address prefix for which the nonce is being set. + /// @param nonceNamespace The nonce namespace for which the nonce is being set. + /// @param nonce The new nonce for the given address prefix and nonce namespace. + function setNonce(bytes19 addressPrefix, uint256 nonceNamespace, uint256 nonce) external payable; + + /// @notice Sets the bit field for a given address prefix and operator. + /// @dev This function can only be called by the owner of the address prefix. Each bit in the bit field corresponds + /// to one account belonging to the same owner. If the bit is set, the operator is authorized for the account. + /// @param addressPrefix The address prefix for which the bit field is being set. + /// @param operator The address of the operator for which the bit field is being set. Can neither be the EVC address + /// nor an address belonging to the same address prefix. + /// @param operatorBitField The new bit field for the given address prefix and operator. Reverts if the provided + /// value is equal to the currently stored value. + function setOperator(bytes19 addressPrefix, address operator, uint256 operatorBitField) external payable; + + /// @notice Authorizes or deauthorizes an operator for the account. + /// @dev Only the owner or authorized operator of the account can call this function. An operator is an address that + /// can perform actions for an account on behalf of the owner. If it's an operator calling this function, it can + /// only deauthorize itself. + /// @param account The address of the account whose operator is being set or unset. + /// @param operator The address of the operator that is being installed or uninstalled. Can neither be the EVC + /// address nor an address belonging to the same owner as the account. + /// @param authorized A boolean value that indicates whether the operator is being authorized or deauthorized. + /// Reverts if the provided value is equal to the currently stored value. + function setAccountOperator(address account, address operator, bool authorized) external payable; + + /// @notice Returns an array of collaterals enabled for an account. + /// @dev A collateral is a vault for which an account's balances are under the control of the currently enabled + /// controller vault. + /// @param account The address of the account whose collaterals are being queried. + /// @return An array of addresses that are enabled collaterals for the account. + function getCollaterals(address account) external view returns (address[] memory); + + /// @notice Returns whether a collateral is enabled for an account. + /// @dev A collateral is a vault for which account's balances are under the control of the currently enabled + /// controller vault. + /// @param account The address of the account that is being checked. + /// @param vault The address of the collateral that is being checked. + /// @return A boolean value that indicates whether the vault is an enabled collateral for the account or not. + function isCollateralEnabled(address account, address vault) external view returns (bool); + + /// @notice Enables a collateral for an account. + /// @dev A collaterals is a vault for which account's balances are under the control of the currently enabled + /// controller vault. Only the owner or an operator of the account can call this function. Unless it's a duplicate, + /// the collateral is added to the end of the array. There can be at most 10 unique collaterals enabled at a time. + /// Account status checks are performed. + /// @param account The account address for which the collateral is being enabled. + /// @param vault The address being enabled as a collateral. + function enableCollateral(address account, address vault) external payable; + + /// @notice Disables a collateral for an account. + /// @dev This function does not preserve the order of collaterals in the array obtained using the getCollaterals + /// function; the order may change. A collateral is a vault for which account’s balances are under the control of + /// the currently enabled controller vault. Only the owner or an operator of the account can call this function. + /// Disabling a collateral might change the order of collaterals in the array obtained using getCollaterals + /// function. Account status checks are performed. + /// @param account The account address for which the collateral is being disabled. + /// @param vault The address of a collateral being disabled. + function disableCollateral(address account, address vault) external payable; + + /// @notice Swaps the position of two collaterals so that they appear switched in the array of collaterals for a + /// given account obtained by calling getCollaterals function. + /// @dev A collateral is a vault for which account’s balances are under the control of the currently enabled + /// controller vault. Only the owner or an operator of the account can call this function. The order of collaterals + /// can be changed by specifying the indices of the two collaterals to be swapped. Indices are zero-based and must + /// be in the range of 0 to the number of collaterals minus 1. index1 must be lower than index2. Account status + /// checks are performed. + /// @param account The address of the account for which the collaterals are being reordered. + /// @param index1 The index of the first collateral to be swapped. + /// @param index2 The index of the second collateral to be swapped. + function reorderCollaterals(address account, uint8 index1, uint8 index2) external payable; + + /// @notice Returns an array of enabled controllers for an account. + /// @dev A controller is a vault that has been chosen for an account to have special control over the account's + /// balances in enabled collaterals vaults. A user can have multiple controllers during a call execution, but at + /// most one can be selected when the account status check is performed. + /// @param account The address of the account whose controllers are being queried. + /// @return An array of addresses that are the enabled controllers for the account. + function getControllers(address account) external view returns (address[] memory); + + /// @notice Returns whether a controller is enabled for an account. + /// @dev A controller is a vault that has been chosen for an account to have special control over account’s + /// balances in the enabled collaterals vaults. + /// @param account The address of the account that is being checked. + /// @param vault The address of the controller that is being checked. + /// @return A boolean value that indicates whether the vault is enabled controller for the account or not. + function isControllerEnabled(address account, address vault) external view returns (bool); + + /// @notice Enables a controller for an account. + /// @dev A controller is a vault that has been chosen for an account to have special control over account’s + /// balances in the enabled collaterals vaults. Only the owner or an operator of the account can call this function. + /// Unless it's a duplicate, the controller is added to the end of the array. Transiently, there can be at most 10 + /// unique controllers enabled at a time, but at most one can be enabled after the outermost checks-deferrable + /// call concludes. Account status checks are performed. + /// @param account The address for which the controller is being enabled. + /// @param vault The address of the controller being enabled. + function enableController(address account, address vault) external payable; + + /// @notice Disables a controller for an account. + /// @dev A controller is a vault that has been chosen for an account to have special control over account’s + /// balances in the enabled collaterals vaults. Only the vault itself can call this function. Disabling a controller + /// might change the order of controllers in the array obtained using getControllers function. Account status checks + /// are performed. + /// @param account The address for which the calling controller is being disabled. + function disableController(address account) external payable; + + /// @notice Executes signed arbitrary data by self-calling into the EVC. + /// @dev Low-level call function is used to execute the arbitrary data signed by the owner or the operator on the + /// EVC contract. During that call, EVC becomes msg.sender. + /// @param signer The address signing the permit message (ECDSA) or verifying the permit message signature + /// (ERC-1271). It's also the owner or the operator of all the accounts for which authentication will be needed + /// during the execution of the arbitrary data call. + /// @param sender The address of the msg.sender which is expected to execute the data signed by the signer. If + /// address(0) is passed, the msg.sender is ignored. + /// @param nonceNamespace The nonce namespace for which the nonce is being used. + /// @param nonce The nonce for the given account and nonce namespace. A valid nonce value is considered to be the + /// value currently stored and can take any value between 0 and type(uint256).max - 1. + /// @param deadline The timestamp after which the permit is considered expired. + /// @param value The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole + /// balance of the EVC contract will be forwarded. + /// @param data The encoded data which is self-called on the EVC contract. + /// @param signature The signature of the data signed by the signer. + function permit( + address signer, + address sender, + uint256 nonceNamespace, + uint256 nonce, + uint256 deadline, + uint256 value, + bytes calldata data, + bytes calldata signature + ) external payable; + + /// @notice Calls into a target contract as per data encoded. + /// @dev This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost + /// call ends, the account and vault status checks are performed. + /// @dev This function can be used to interact with any contract while checks are deferred. If the target contract + /// is msg.sender, msg.sender is called back with the calldata provided and the context set up according to the + /// account provided. If the target contract is not msg.sender, only the owner or the operator of the account + /// provided can call this function. + /// @dev This function can be used to recover the remaining value from the EVC contract. + /// @param targetContract The address of the contract to be called. + /// @param onBehalfOfAccount If the target contract is msg.sender, the address of the account which will be set + /// in the context. It assumes msg.sender has authenticated the account themselves. If the target contract is + /// not msg.sender, the address of the account for which it is checked whether msg.sender is authorized to act + /// on behalf of. + /// @param value The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole + /// balance of the EVC contract will be forwarded. + /// @param data The encoded data which is called on the target contract. + /// @return result The result of the call. + function call(address targetContract, address onBehalfOfAccount, uint256 value, bytes calldata data) + external + payable + returns (bytes memory result); + + /// @notice For a given account, calls into one of the enabled collateral vaults from the currently enabled + /// controller vault as per data encoded. + /// @dev This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost + /// call ends, the account and vault status checks are performed. + /// @dev This function can be used to interact with any contract while checks are deferred as long as the contract + /// is enabled as a collateral of the account and the msg.sender is the only enabled controller of the account. + /// @param targetCollateral The collateral address to be called. + /// @param onBehalfOfAccount The address of the account for which it is checked whether msg.sender is authorized to + /// act on behalf. + /// @param value The amount of value to be forwarded with the call. If the value is type(uint256).max, the whole + /// balance of the EVC contract will be forwarded. + /// @param data The encoded data which is called on the target collateral. + /// @return result The result of the call. + function controlCollateral(address targetCollateral, address onBehalfOfAccount, uint256 value, bytes calldata data) + external + payable + returns (bytes memory result); + + /// @notice Executes multiple calls into the target contracts while checks deferred as per batch items provided. + /// @dev This function defers the account and vault status checks (it's a checks-deferrable call). If the outermost + /// call ends, the account and vault status checks are performed. + /// @dev The authentication rules for each batch item are the same as for the call function. + /// @param items An array of batch items to be executed. + function batch(BatchItem[] calldata items) external payable; + + /// @notice Executes multiple calls into the target contracts while checks deferred as per batch items provided. + /// @dev This function always reverts as it's only used for simulation purposes. This function cannot be called + /// within a checks-deferrable call. + /// @param items An array of batch items to be executed. + function batchRevert(BatchItem[] calldata items) external payable; + + /// @notice Executes multiple calls into the target contracts while checks deferred as per batch items provided. + /// @dev This function does not modify state and should only be used for simulation purposes. This function cannot + /// be called within a checks-deferrable call. + /// @param items An array of batch items to be executed. + /// @return batchItemsResult An array of batch item results for each item. + /// @return accountsStatusCheckResult An array of account status check results for each account. + /// @return vaultsStatusCheckResult An array of vault status check results for each vault. + function batchSimulation(BatchItem[] calldata items) + external + payable + returns ( + BatchItemResult[] memory batchItemsResult, + StatusCheckResult[] memory accountsStatusCheckResult, + StatusCheckResult[] memory vaultsStatusCheckResult + ); + + /// @notice Retrieves the timestamp of the last account status check performed for a specific account. + /// @dev This function reverts if the checks are in progress. + /// @param account The address of the account for which the last status check timestamp is being queried. + /// @return The timestamp of the last status check as a uint256. + function getLastAccountStatusCheckTimestamp(address account) external view returns (uint256); + + /// @notice Checks whether the status check is deferred for a given account. + /// @dev This function reverts if the checks are in progress. + /// @param account The address of the account for which it is checked whether the status check is deferred. + /// @return A boolean flag that indicates whether the status check is deferred or not. + function isAccountStatusCheckDeferred(address account) external view returns (bool); + + /// @notice Checks the status of an account and reverts if it is not valid. + /// @dev If checks deferred, the account is added to the set of accounts to be checked at the end of the outermost + /// checks-deferrable call. There can be at most 10 unique accounts added to the set at a time. Account status + /// check is performed by calling into the selected controller vault and passing the array of currently enabled + /// collaterals. If controller is not selected, the account is always considered valid. + /// @param account The address of the account to be checked. + function requireAccountStatusCheck(address account) external payable; + + /// @notice Forgives previously deferred account status check. + /// @dev Account address is removed from the set of addresses for which status checks are deferred. This function + /// can only be called by the currently enabled controller of a given account. Depending on the vault + /// implementation, may be needed in the liquidation flow. + /// @param account The address of the account for which the status check is forgiven. + function forgiveAccountStatusCheck(address account) external payable; + + /// @notice Checks whether the status check is deferred for a given vault. + /// @dev This function reverts if the checks are in progress. + /// @param vault The address of the vault for which it is checked whether the status check is deferred. + /// @return A boolean flag that indicates whether the status check is deferred or not. + function isVaultStatusCheckDeferred(address vault) external view returns (bool); + + /// @notice Checks the status of a vault and reverts if it is not valid. + /// @dev If checks deferred, the vault is added to the set of vaults to be checked at the end of the outermost + /// checks-deferrable call. There can be at most 10 unique vaults added to the set at a time. This function can + /// only be called by the vault itself. + function requireVaultStatusCheck() external payable; + + /// @notice Forgives previously deferred vault status check. + /// @dev Vault address is removed from the set of addresses for which status checks are deferred. This function can + /// only be called by the vault itself. + function forgiveVaultStatusCheck() external payable; + + /// @notice Checks the status of an account and a vault and reverts if it is not valid. + /// @dev If checks deferred, the account and the vault are added to the respective sets of accounts and vaults to be + /// checked at the end of the outermost checks-deferrable call. Account status check is performed by calling into + /// selected controller vault and passing the array of currently enabled collaterals. If controller is not selected, + /// the account is always considered valid. This function can only be called by the vault itself. + /// @param account The address of the account to be checked. + function requireAccountAndVaultStatusCheck(address account) external payable; +} diff --git a/contracts/IEVault.sol b/contracts/IEVault.sol new file mode 100644 index 0000000..3c038bd --- /dev/null +++ b/contracts/IEVault.sol @@ -0,0 +1,558 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity >=0.8.0; + +import {IVault as IEVCVault} from "./IVault.sol"; + +// Full interface of EVault and all it's modules + +/// @title IInitialize +/// @notice Interface of the initialization module of EVault +interface IInitialize { + /// @notice Initialization of the newly deployed proxy contract + /// @param proxyCreator Account which created the proxy or should be the initial governor + function initialize(address proxyCreator) external; +} + +/// @title IERC20 +/// @notice Interface of the EVault's Initialize module +interface IERC20 { + /// @notice Vault share token (eToken) name, ie "Euler Vault: DAI" + /// @return The name of the eToken + function name() external view returns (string memory); + + /// @notice Vault share token (eToken) symbol, ie "eDAI" + /// @return The symbol of the eToken + function symbol() external view returns (string memory); + + /// @notice Decimals, the same as the asset's or 18 if the asset doesn't implement `decimals()` + /// @return The decimals of the eToken + function decimals() external view returns (uint8); + + /// @notice Sum of all eToken balances + /// @return The total supply of the eToken + function totalSupply() external view returns (uint256); + + /// @notice Balance of a particular account, in eTokens + /// @param account Address to query + /// @return The balance of the account + function balanceOf(address account) external view returns (uint256); + + /// @notice Retrieve the current allowance + /// @param holder The account holding the eTokens + /// @param spender Trusted address + /// @return The allowance from holder for spender + function allowance(address holder, address spender) external view returns (uint256); + + /// @notice Transfer eTokens to another address + /// @param to Recipient account + /// @param amount In shares. + /// @return True if transfer succeeded + function transfer(address to, uint256 amount) external returns (bool); + + /// @notice Transfer eTokens from one address to another + /// @param from This address must've approved the to address + /// @param to Recipient account + /// @param amount In shares + /// @return True if transfer succeeded + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + /// @notice Allow spender to access an amount of your eTokens + /// @param spender Trusted address + /// @param amount Use max uint for "infinite" allowance + /// @return True if approval succeeded + function approve(address spender, uint256 amount) external returns (bool); +} + +/// @title IToken +/// @notice Interface of the EVault's Token module +interface IToken is IERC20 { + /// @notice Transfer the full eToken balance of an address to another + /// @param from This address must've approved the to address + /// @param to Recipient account + /// @return True if transfer succeeded + function transferFromMax(address from, address to) external returns (bool); +} + +/// @title IERC4626 +/// @notice Interface of an ERC4626 vault +interface IERC4626 { + /// @notice Vault's underlying asset + /// @return The vault's underlying asset + function asset() external view returns (address); + + /// @notice Total amount of managed assets, cash and borrows + /// @return The total amount of assets + function totalAssets() external view returns (uint256); + + /// @notice Calculate amount of assets corresponding to the requested shares amount + /// @param shares Amount of shares to convert + /// @return The amount of assets + function convertToAssets(uint256 shares) external view returns (uint256); + + /// @notice Calculate amount of shares corresponding to the requested assets amount + /// @param assets Amount of assets to convert + /// @return The amount of shares + function convertToShares(uint256 assets) external view returns (uint256); + + /// @notice Fetch the maximum amount of assets a user can deposit + /// @param account Address to query + /// @return The max amount of assets the account can deposit + function maxDeposit(address account) external view returns (uint256); + + /// @notice Calculate an amount of shares that would be created by depositing assets + /// @param assets Amount of assets deposited + /// @return Amount of shares received + function previewDeposit(uint256 assets) external view returns (uint256); + + /// @notice Fetch the maximum amount of shares a user can mint + /// @param account Address to query + /// @return The max amount of shares the account can mint + function maxMint(address account) external view returns (uint256); + + /// @notice Calculate an amount of assets that would be required to mint requested amount of shares + /// @param shares Amount of shares to be minted + /// @return Required amount of assets + function previewMint(uint256 shares) external view returns (uint256); + + /// @notice Fetch the maximum amount of assets a user is allowed to withdraw + /// @param owner Account holding the shares + /// @return The maximum amount of assets the owner is allowed to withdraw + function maxWithdraw(address owner) external view returns (uint256); + + /// @notice Calculate the amount of shares that will be burned when withdrawing requested amount of assets + /// @param assets Amount of assets withdrawn + /// @return Amount of shares burned + function previewWithdraw(uint256 assets) external view returns (uint256); + + /// @notice Fetch the maximum amount of shares a user is allowed to redeem for assets + /// @param owner Account holding the shares + /// @return The maximum amount of shares the owner is allowed to redeem + function maxRedeem(address owner) external view returns (uint256); + + /// @notice Calculate the amount of assets that will be transferred when redeeming requested amount of shares + /// @param shares Amount of shares redeemed + /// @return Amount of assets transferred + function previewRedeem(uint256 shares) external view returns (uint256); + + /// @notice Transfer requested amount of underlying tokens from sender to the vault pool in return for shares + /// @param amount Amount of assets to deposit (use max uint256 for full underlying token balance) + /// @param receiver An account to receive the shares + /// @return Amount of shares minted + /// @dev Deposit will round down the amount of assets that are converted to shares. To prevent losses consider using + /// mint instead. + function deposit(uint256 amount, address receiver) external returns (uint256); + + /// @notice Transfer underlying tokens from sender to the vault pool in return for requested amount of shares + /// @param amount Amount of shares to be minted + /// @param receiver An account to receive the shares + /// @return Amount of assets deposited + function mint(uint256 amount, address receiver) external returns (uint256); + + /// @notice Transfer requested amount of underlying tokens from the vault and decrease account's shares balance + /// @param amount Amount of assets to withdraw + /// @param receiver Account to receive the withdrawn assets + /// @param owner Account holding the shares to burn + /// @return Amount of shares burned + function withdraw(uint256 amount, address receiver, address owner) external returns (uint256); + + /// @notice Burn requested shares and transfer corresponding underlying tokens from the vault to the receiver + /// @param amount Amount of shares to burn (use max uint256 to burn full owner balance) + /// @param receiver Account to receive the withdrawn assets + /// @param owner Account holding the shares to burn. + /// @return Amount of assets transferred + function redeem(uint256 amount, address receiver, address owner) external returns (uint256); +} + +/// @title IVault +/// @notice Interface of the EVault's Vault module +interface IVault is IERC4626 { + /// @notice Balance of the fees accumulator, in shares + /// @return The accumulated fees in shares + function accumulatedFees() external view returns (uint256); + + /// @notice Balance of the fees accumulator, in underlying units + /// @return The accumulated fees in asset units + function accumulatedFeesAssets() external view returns (uint256); + + /// @notice Address of the original vault creator + /// @return The address of the creator + function creator() external view returns (address); + + /// @notice Creates shares for the receiver, from excess asset balances of the vault (not accounted for in `cash`) + /// @param amount Amount of assets to claim (use max uint256 to claim all available assets) + /// @param receiver An account to receive the shares + /// @return Amount of shares minted + /// @dev Could be used as an alternative deposit flow in certain scenarios. E.g. swap directly to the vault, call + /// `skim` to claim deposit. + function skim(uint256 amount, address receiver) external returns (uint256); +} + +/// @title IBorrowing +/// @notice Interface of the EVault's Borrowing module +interface IBorrowing { + /// @notice Sum of all outstanding debts, in underlying units (increases as interest is accrued) + /// @return The total borrows in asset units + function totalBorrows() external view returns (uint256); + + /// @notice Sum of all outstanding debts, in underlying units scaled up by shifting + /// INTERNAL_DEBT_PRECISION_SHIFT bits + /// @return The total borrows in internal debt precision + function totalBorrowsExact() external view returns (uint256); + + /// @notice Balance of vault assets as tracked by deposits/withdrawals and borrows/repays + /// @return The amount of assets the vault tracks as current direct holdings + function cash() external view returns (uint256); + + /// @notice Debt owed by a particular account, in underlying units + /// @param account Address to query + /// @return The debt of the account in asset units + function debtOf(address account) external view returns (uint256); + + /// @notice Debt owed by a particular account, in underlying units scaled up by shifting + /// INTERNAL_DEBT_PRECISION_SHIFT bits + /// @param account Address to query + /// @return The debt of the account in internal precision + function debtOfExact(address account) external view returns (uint256); + + /// @notice Retrieves the current interest rate for an asset + /// @return The interest rate in yield-per-second, scaled by 10**27 + function interestRate() external view returns (uint256); + + /// @notice Retrieves the current interest rate accumulator for an asset + /// @return An opaque accumulator that increases as interest is accrued + function interestAccumulator() external view returns (uint256); + + /// @notice Returns an address of the sidecar DToken + /// @return The address of the DToken + function dToken() external view returns (address); + + /// @notice Transfer underlying tokens from the vault to the sender, and increase sender's debt + /// @param amount Amount of assets to borrow (use max uint256 for all available tokens) + /// @param receiver Account receiving the borrowed tokens + /// @return Amount of assets borrowed + function borrow(uint256 amount, address receiver) external returns (uint256); + + /// @notice Transfer underlying tokens from the sender to the vault, and decrease receiver's debt + /// @param amount Amount of debt to repay in assets (use max uint256 for full debt) + /// @param receiver Account holding the debt to be repaid + /// @return Amount of assets repaid + function repay(uint256 amount, address receiver) external returns (uint256); + + /// @notice Pay off liability with shares ("self-repay") + /// @param amount In asset units (use max uint256 to repay the debt in full or up to the available deposit) + /// @param receiver Account to remove debt from by burning sender's shares + /// @return shares Amount of shares burned + /// @return debt Amount of debt removed in assets + /// @dev Equivalent to withdrawing and repaying, but no assets are needed to be present in the vault + function repayWithShares(uint256 amount, address receiver) external returns (uint256 shares, uint256 debt); + + /// @notice Take over debt from another account + /// @param amount Amount of debt in asset units (use max uint256 for all the account's debt) + /// @param from Account to pull the debt from + /// @return Amount of debt pulled in asset units. + function pullDebt(uint256 amount, address from) external returns (uint256); + + /// @notice Request a flash-loan. A onFlashLoan() callback in msg.sender will be invoked, which must repay the loan + /// to the main Euler address prior to returning. + /// @param amount In asset units + /// @param data Passed through to the onFlashLoan() callback, so contracts don't need to store transient data in + /// storage + function flashLoan(uint256 amount, bytes calldata data) external; + + /// @notice Updates interest accumulator and totalBorrows, credits reserves, re-targets interest rate, and logs + /// vault status + function touch() external; +} + +/// @title ILiquidation +/// @notice Interface of the EVault's Liquidation module +interface ILiquidation { + /// @notice Checks to see if a liquidation would be profitable, without actually doing anything + /// @param liquidator Address that will initiate the liquidation + /// @param violator Address that may be in collateral violation + /// @param collateral Collateral which is to be seized + /// @return maxRepay Max amount of debt that can be repaid, in asset units + /// @return maxYield Yield in collateral corresponding to max allowed amount of debt to be repaid, in collateral + /// balance (shares for vaults) + function checkLiquidation(address liquidator, address violator, address collateral) + external + view + returns (uint256 maxRepay, uint256 maxYield); + + /// @notice Attempts to perform a liquidation + /// @param violator Address that may be in collateral violation + /// @param collateral Collateral which is to be seized + /// @param repayAssets The amount of underlying debt to be transferred from violator to sender, in asset units (use + /// max uint256 to repay the maximum possible amount). + /// @param minYieldBalance The minimum acceptable amount of collateral to be transferred from violator to sender, in + /// collateral balance units (shares for vaults) + function liquidate(address violator, address collateral, uint256 repayAssets, uint256 minYieldBalance) external; +} + +/// @title IRiskManager +/// @notice Interface of the EVault's RiskManager module +interface IRiskManager is IEVCVault { + /// @notice Retrieve account's total liquidity + /// @param account Account holding debt in this vault + /// @param liquidation Flag to indicate if the calculation should be performed in liquidation vs account status + /// check mode, where different LTV values might apply. + /// @return collateralValue Total risk adjusted value of all collaterals in unit of account + /// @return liabilityValue Value of debt in unit of account + function accountLiquidity(address account, bool liquidation) + external + view + returns (uint256 collateralValue, uint256 liabilityValue); + + /// @notice Retrieve account's liquidity per collateral + /// @param account Account holding debt in this vault + /// @param liquidation Flag to indicate if the calculation should be performed in liquidation vs account status + /// check mode, where different LTV values might apply. + /// @return collaterals Array of collaterals enabled + /// @return collateralValues Array of risk adjusted collateral values corresponding to items in collaterals array. + /// In unit of account + /// @return liabilityValue Value of debt in unit of account + function accountLiquidityFull(address account, bool liquidation) + external + view + returns (address[] memory collaterals, uint256[] memory collateralValues, uint256 liabilityValue); + + /// @notice Release control of the account on EVC if no outstanding debt is present + function disableController() external; + + /// @notice Checks the status of an account and reverts if account is not healthy + /// @param account The address of the account to be checked + /// @return magicValue Must return the bytes4 magic value 0xb168c58f (which is a selector of this function) when + /// account status is valid, or revert otherwise. + /// @dev Only callable by EVC during status checks + function checkAccountStatus(address account, address[] calldata collaterals) external returns (bytes4); + + /// @notice Checks the status of the vault and reverts if caps are exceeded + /// @return magicValue Must return the bytes4 magic value 0x4b3d1223 (which is a selector of this function) when + /// account status is valid, or revert otherwise. + /// @dev Only callable by EVC during status checks + function checkVaultStatus() external returns (bytes4); +} + +/// @title IBalanceForwarder +/// @notice Interface of the EVault's BalanceForwarder module +interface IBalanceForwarder { + /// @notice Retrieve the address of rewards contract, tracking changes in account's balances + /// @return The balance tracker address + function balanceTrackerAddress() external view returns (address); + + /// @notice Retrieves boolean indicating if the account opted in to forward balance changes to the rewards contract + /// @param account Address to query + /// @return True if balance forwarder is enabled + function balanceForwarderEnabled(address account) external view returns (bool); + + /// @notice Enables balance forwarding for the authenticated account + /// @dev Only the authenticated account can enable balance forwarding for itself + /// @dev Should call the IBalanceTracker hook with the current account's balance + function enableBalanceForwarder() external; + + /// @notice Disables balance forwarding for the authenticated account + /// @dev Only the authenticated account can disable balance forwarding for itself + /// @dev Should call the IBalanceTracker hook with the account's balance of 0 + function disableBalanceForwarder() external; +} + +/// @title IGovernance +/// @notice Interface of the EVault's Governance module +interface IGovernance { + /// @notice Retrieves the address of the governor + /// @return The governor address + function governorAdmin() external view returns (address); + + /// @notice Retrieves address of the governance fee receiver + /// @return The fee receiver address + function feeReceiver() external view returns (address); + + /// @notice Retrieves the interest fee in effect for the vault + /// @return Amount of interest that is redirected as a fee, as a fraction scaled by 1e4 + function interestFee() external view returns (uint16); + + /// @notice Looks up an asset's currently configured interest rate model + /// @return Address of the interest rate contract or address zero to indicate 0% interest + function interestRateModel() external view returns (address); + + /// @notice Retrieves the ProtocolConfig address + /// @return The protocol config address + function protocolConfigAddress() external view returns (address); + + /// @notice Retrieves the protocol fee share + /// @return A percentage share of fees accrued belonging to the protocol. In wad scale (1e18) + function protocolFeeShare() external view returns (uint256); + + /// @notice Retrieves the address which will receive protocol's fees + /// @notice The protocol fee receiver address + function protocolFeeReceiver() external view returns (address); + + /// @notice Retrieves supply and borrow caps in AmountCap format + /// @return supplyCap The supply cap in AmountCap format + /// @return borrowCap The borrow cap in AmountCap format + function caps() external view returns (uint16 supplyCap, uint16 borrowCap); + + /// @notice Retrieves the borrow LTV of the collateral, which is used to determine if the account is healthy during + /// account status checks. + /// @param collateral The address of the collateral to query + /// @return Borrowing LTV in 1e4 scale + function LTVBorrow(address collateral) external view returns (uint16); + + /// @notice Retrieves the current liquidation LTV, which is used to determine if the account is eligible for + /// liquidation + /// @param collateral The address of the collateral to query + /// @return Liquidation LTV in 1e4 scale + function LTVLiquidation(address collateral) external view returns (uint16); + + /// @notice Retrieves LTV configuration for the collateral + /// @param collateral Collateral asset + /// @return borrowLTV The current value of borrow LTV for originating positions + /// @return liquidationLTV The value of fully converged liquidation LTV + /// @return initialLiquidationLTV The initial value of the liquidation LTV, when the ramp began + /// @return targetTimestamp The timestamp when the liquidation LTV is considered fully converged + /// @return rampDuration The time it takes for the liquidation LTV to converge from the initial value to the fully + /// converged value + function LTVFull(address collateral) + external + view + returns ( + uint16 borrowLTV, + uint16 liquidationLTV, + uint16 initialLiquidationLTV, + uint48 targetTimestamp, + uint32 rampDuration + ); + + /// @notice Retrieves a list of collaterals with configured LTVs + /// @return List of asset collaterals + /// @dev Returned assets could have the ltv disabled (set to zero) + function LTVList() external view returns (address[] memory); + + /// @notice Retrieves the maximum liquidation discount + /// @return The maximum liquidation discount in 1e4 scale + function maxLiquidationDiscount() external view returns (uint16); + + /// @notice Retrieves liquidation cool-off time, which must elapse after successful account status check before + /// account can be liquidated + /// @return The liquidation cool off time in seconds + function liquidationCoolOffTime() external view returns (uint16); + + /// @notice Retrieves a hook target and a bitmask indicating which operations call the hook target + /// @return hookTarget Address of the hook target contract + /// @return hookedOps Bitmask with operations that should call the hooks. See Constants.sol for a list of operations + function hookConfig() external view returns (address hookTarget, uint32 hookedOps); + + /// @notice Retrieves a bitmask indicating enabled config flags + /// @return Bitmask with config flags enabled + function configFlags() external view returns (uint32); + + /// @notice Address of EthereumVaultConnector contract + /// @return The EVC address + function EVC() external view returns (address); + + /// @notice Retrieves a reference asset used for liquidity calculations + /// @return The address of the reference asset + function unitOfAccount() external view returns (address); + + /// @notice Retrieves the address of the oracle contract + /// @return The address of the oracle + function oracle() external view returns (address); + + /// @notice Retrieves the Permit2 contract address + /// @return The address of the Permit2 contract + function permit2Address() external view returns (address); + + /// @notice Splits accrued fees balance according to protocol fee share and transfers shares to the governor fee + /// receiver and protocol fee receiver + function convertFees() external; + + /// @notice Set a new governor address + /// @param newGovernorAdmin The new governor address + /// @dev Set to zero address to renounce privileges and make the vault non-governed + function setGovernorAdmin(address newGovernorAdmin) external; + + /// @notice Set a new governor fee receiver address + /// @param newFeeReceiver The new fee receiver address + function setFeeReceiver(address newFeeReceiver) external; + + /// @notice Set a new LTV config + /// @param collateral Address of collateral to set LTV for + /// @param borrowLTV New borrow LTV, for assessing account's health during account status checks, in 1e4 scale + /// @param liquidationLTV New liquidation LTV after ramp ends in 1e4 scale + /// @param rampDuration Ramp duration in seconds + function setLTV(address collateral, uint16 borrowLTV, uint16 liquidationLTV, uint32 rampDuration) external; + + /// @notice Completely clears LTV configuratrion, signalling the collateral is not considered safe to liquidate + /// anymore + /// @param collateral Address of the collateral + function clearLTV(address collateral) external; + + /// @notice Set a new maximum liquidation discount + /// @param newDiscount New maximum liquidation discount in 1e4 scale + /// @dev If the discount is zero (the default), the liquidators will not be incentivized to liquidate unhealthy + /// accounts + function setMaxLiquidationDiscount(uint16 newDiscount) external; + + /// @notice Set a new liquidation cool off time, which must elapse after successful account status check before + /// account can be liquidated + /// @param newCoolOffTime The new liquidation cool off time in seconds + /// @dev Setting cool off time to zero allows liquidating the account in the same block as the last successful + /// account status check + function setLiquidationCoolOffTime(uint16 newCoolOffTime) external; + + /// @notice Set a new interest rate model contract + /// @param newModel The new IRM address + function setInterestRateModel(address newModel) external; + + /// @notice Set a new hook target and a new bitmap indicating which operations should call the hook target. + /// Operations are defined in Constants.sol + /// @param newHookTarget The new hook target address + /// @param newHookedOps Bitmask with the new hooked operations + function setHookConfig(address newHookTarget, uint32 newHookedOps) external; + + /// @notice Set new bitmap indicating which config flags should be enabled. Flags are defined in Constants.sol + /// @param newConfigFlags Bitmask with the new config flags + function setConfigFlags(uint32 newConfigFlags) external; + + /// @notice Set new supply and borrow caps in AmountCap format + /// @param supplyCap The new supply cap in AmountCap fromat + /// @param borrowCap The new borrow cap in AmountCap fromat + function setCaps(uint16 supplyCap, uint16 borrowCap) external; + + /// @notice Set a new interest fee + /// @param newFee The new interest fee + function setInterestFee(uint16 newFee) external; +} + +/// @title IEVault +/// @custom:security-contact security@euler.xyz +/// @author Euler Labs (https://www.eulerlabs.com/) +/// @notice Interface of the EVault, an EVC enabled lending vault +interface IEVault is + IInitialize, + IToken, + IVault, + IBorrowing, + ILiquidation, + IRiskManager, + IBalanceForwarder, + IGovernance +{ + /// @notice Fetch address of the `Initialize` module + function MODULE_INITIALIZE() external view returns (address); + /// @notice Fetch address of the `Token` module + function MODULE_TOKEN() external view returns (address); + /// @notice Fetch address of the `Vault` module + function MODULE_VAULT() external view returns (address); + /// @notice Fetch address of the `Borrowing` module + function MODULE_BORROWING() external view returns (address); + /// @notice Fetch address of the `Liquidation` module + function MODULE_LIQUIDATION() external view returns (address); + /// @notice Fetch address of the `RiskManager` module + function MODULE_RISKMANAGER() external view returns (address); + /// @notice Fetch address of the `BalanceForwarder` module + function MODULE_BALANCE_FORWARDER() external view returns (address); + /// @notice Fetch address of the `Governance` module + function MODULE_GOVERNANCE() external view returns (address); +} diff --git a/contracts/IOracle.json b/contracts/IOracle.json new file mode 100644 index 0000000..5bfe7f5 --- /dev/null +++ b/contracts/IOracle.json @@ -0,0 +1,736 @@ +{ + "abi": [ + { + "type": "function", + "name": "STETH", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "WSTETH", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "base", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "cache", + "inputs": [], + "outputs": [ + { "name": "", "type": "uint208", "internalType": "uint208" }, + { "name": "", "type": "uint48", "internalType": "uint48" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "cross", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "description", + "inputs": [], + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "fallbackOracle", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "fee", + "inputs": [], + "outputs": [{ "name": "", "type": "uint24", "internalType": "uint24" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "feed", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "feedDecimals", + "inputs": [], + "outputs": [{ "name": "", "type": "uint8", "internalType": "uint8" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "feedId", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getConfiguredOracle", + "inputs": [ + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getQuote", + "inputs": [ + { "name": "inAmount", "type": "uint256", "internalType": "uint256" }, + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [ + { "name": "outAmount", "type": "uint256", "internalType": "uint256" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getQuotes", + "inputs": [ + { "name": "inAmount", "type": "uint256", "internalType": "uint256" }, + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [ + { + "name": "bidOutAmount", + "type": "uint256", + "internalType": "uint256" + }, + { "name": "askOutAmount", "type": "uint256", "internalType": "uint256" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "governor", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxConfWidth", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "maxStaleness", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "oracleBaseCross", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "oracleCrossQuote", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pool", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pyth", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "quote", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "resolveOracle", + "inputs": [ + { "name": "inAmount", "type": "uint256", "internalType": "uint256" }, + { "name": "base", "type": "address", "internalType": "address" }, + { "name": "quote", "type": "address", "internalType": "address" } + ], + "outputs": [ + { "name": "", "type": "uint256", "internalType": "uint256" }, + { "name": "", "type": "address", "internalType": "address" }, + { "name": "", "type": "address", "internalType": "address" }, + { "name": "", "type": "address", "internalType": "address" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "resolvedVaults", + "inputs": [{ "name": "", "type": "address", "internalType": "address" }], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenA", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "tokenB", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "twapWindow", + "inputs": [], + "outputs": [{ "name": "", "type": "uint32", "internalType": "uint32" }], + "stateMutability": "view" + } + ], + "bytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} }, + "deployedBytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} }, + "methodIdentifiers": { + "STETH()": "e00bfe50", + "WSTETH()": "d9fb643a", + "base()": "5001f3b5", + "cache()": "60c7d295", + "cross()": "fa074d03", + "description()": "7284e416", + "fallbackOracle()": "629838e5", + "fee()": "ddca3f43", + "feed()": "37a7b7d8", + "feedDecimals()": "c23953d0", + "feedId()": "4a643499", + "getConfiguredOracle(address,address)": "8aa77608", + "getQuote(uint256,address,address)": "ae68676c", + "getQuotes(uint256,address,address)": "0579e61f", + "governor()": "0c340a24", + "maxConfWidth()": "88df1eff", + "maxStaleness()": "87cf4696", + "name()": "06fdde03", + "oracleBaseCross()": "fd886700", + "oracleCrossQuote()": "6f612f9a", + "pool()": "16f0115b", + "pyth()": "f98d06f0", + "quote()": "999b93af", + "resolveOracle(uint256,address,address)": "8418e6f3", + "resolvedVaults(address)": "5ca40017", + "tokenA()": "0fc63d10", + "tokenB()": "5f64b55b", + "twapWindow()": "8107e133" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"STETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WSTETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"base\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cache\",\"outputs\":[{\"internalType\":\"uint208\",\"name\":\"\",\"type\":\"uint208\"},{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cross\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackOracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feed\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"getConfiguredOracle\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"getQuote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"outAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"getQuotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bidOutAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askOutAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxConfWidth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxStaleness\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleBaseCross\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleCrossQuote\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pyth\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quote\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"inAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"base\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"quote\",\"type\":\"address\"}],\"name\":\"resolveOracle\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"resolvedVaults\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenA\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenB\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"twapWindow\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getQuote(uint256,address,address)\":{\"params\":{\"base\":\"The token that is being priced.\",\"inAmount\":\"The amount of `base` to convert.\",\"quote\":\"The token that is the unit of account.\"},\"returns\":{\"outAmount\":\"The amount of `quote` that is equivalent to `inAmount` of `base`.\"}},\"getQuotes(uint256,address,address)\":{\"params\":{\"base\":\"The token that is being priced.\",\"inAmount\":\"The amount of `base` to convert.\",\"quote\":\"The token that is the unit of account.\"},\"returns\":{\"askOutAmount\":\"The amount of `quote` you would spend for buying `inAmount` of `base`.\",\"bidOutAmount\":\"The amount of `quote` you would get for selling `inAmount` of `base`.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the oracle.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getQuote(uint256,address,address)\":{\"notice\":\"One-sided price: How much quote token you would get for inAmount of base token, assuming no price spread.\"},\"getQuotes(uint256,address,address)\":{\"notice\":\"Two-sided price: How much quote token you would get/spend for selling/buying inAmount of base token.\"},\"name()\":{\"notice\":\"Get the name of the oracle.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Lens/OracleLens.sol\":\"IOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/\",\":@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/\",\":@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/\",\":@solady/=lib/euler-price-oracle/lib/solady/src/\",\":@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/\",\":@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/\",\":axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/\",\":axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":ethereum-vault-connector/=lib/ethereum-vault-connector/src/\",\":euler-price-oracle-test/=lib/euler-price-oracle/test/\",\":euler-price-oracle/=lib/euler-price-oracle/src/\",\":euler-vault-kit/=lib/euler-vault-kit/src/\",\":evc/=lib/ethereum-vault-connector/src/\",\":evk-test/=lib/euler-vault-kit/test/\",\":evk/=lib/euler-vault-kit/src/\",\":fee-flow/=lib/fee-flow/src/\",\":forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/\",\":permit2/=lib/euler-vault-kit/lib/permit2/\",\":pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":redstone-oracles-monorepo/=lib/euler-price-oracle/lib/\",\":reward-streams/=lib/reward-streams/src/\",\":solady/=lib/euler-price-oracle/lib/solady/src/\",\":solmate/=lib/fee-flow/lib/solmate/src/\",\":v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/\",\":v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/\"]},\"sources\":{\"lib/ethereum-vault-connector/src/interfaces/IVault.sol\":{\"keccak256\":\"0xb04fe66deccf8baa3e5c850f2ecf32e948393d7a42e78b59b037141b205edf42\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://11acaad66e9a42deec1f9328abe9f2662bfb109568baa20a79317ae707b94016\",\"dweb:/ipfs/QmQbAtvrk9cqXJJZgMRjdxrMDXiZPz37m6PGZYEpbtN8to\"]},\"lib/euler-price-oracle/src/interfaces/IPriceOracle.sol\":{\"keccak256\":\"0x03567dd4084dc74a9e2f9eeffce4d9047989b0d2122820716c3bc75891484308\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://23965a79475c85a0a8a3a137a76424f60debd9e592bc9127d463392fad7df30f\",\"dweb:/ipfs/QmPc1bV3kZ3ynLGTqG6xRbZ3E5AstYdfipXbysSqYGhJYA\"]},\"lib/euler-vault-kit/src/EVault/IEVault.sol\":{\"keccak256\":\"0x1e41f0fe57683c65b27afa6b725ee2c68128b540f682bba93e2dc135522ac6b3\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://86bb1872eb9073214b853663fb136157bea709bbcf626bb0a2bb2748a43f941d\",\"dweb:/ipfs/QmSWQPjHBBahLM3AsoVjHHYEBiBj8WbkQqCQLPNUJVMX1k\"]},\"lib/euler-vault-kit/src/EVault/shared/lib/RPow.sol\":{\"keccak256\":\"0xb471fd40087fc710f7a53eb3b559fa446b8cdc3f866644b0d5575995cec614c2\",\"license\":\"AGPL-3.0-or-later\",\"urls\":[\"bzz-raw://e54ae3486d6f7dcd8bc18251231836750d57e2c66e8f47836c19e2eedd9d45a8\",\"dweb:/ipfs/QmXNUPLE42A4Eiw3wrgPVWV9Qp7buvu4nzWNVdNUQ2MHGm\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"src/Lens/LensTypes.sol\":{\"keccak256\":\"0xd7893f48d1fa5ba6d44ee8c6620f49a7c9feb7db56e6384f4188675286956af9\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0f635782d5f16d8f3afd07123e6d1f0e96b23da7051961108e56d4138cd512c0\",\"dweb:/ipfs/QmZtPpkfd5eKLDn5wLUYNWWLP8LSULm177ngJds82nYZSA\"]},\"src/Lens/OracleLens.sol\":{\"keccak256\":\"0xd622458da92aa88d69fb70a622c5808b10aee47579e03af3e4e45a92d6d01c0d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://e1849e1339f78c96ee652323973e673003f5feb7b475244c44775e1fe1ddfd59\",\"dweb:/ipfs/QmbjdbE25Bq8FhTQDtyXr3pgq4CakKWnMf6zuvER4rdJ1j\"]},\"src/Lens/Utils.sol\":{\"keccak256\":\"0x3d6d9ca0feb93c47542b7cf399635734700971a02500d465afc94e1136660a40\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://280d5821c2d00f42e5ea1f88df9a345994da9593cc6130e3b626b5316e36f84f\",\"dweb:/ipfs/QmaXDq3Rv5MVShQFo5C8cnuhNhUw9NMqQv3Zn63YuFfcLq\"]},\"src/SnapshotRegistry/SnapshotRegistry.sol\":{\"keccak256\":\"0x20216f4473c0085110eec3a00e28a69f3b7377e0289e7d302c2e08c8ec32c64a\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d1b5cc9ae71f217d1bd974afe7ee73fff058215ecfb1a63eb1ba2194f00f8e23\",\"dweb:/ipfs/QmPU5mBq4AvPwH38HrK6j52vEctM1forJgPzshwoaGjHYC\"]}},\"version\":1}", + "metadata": { + "compiler": { "version": "0.8.24+commit.e11b9ed9" }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "STETH", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "WSTETH", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "base", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "cache", + "outputs": [ + { "internalType": "uint208", "name": "", "type": "uint208" }, + { "internalType": "uint48", "name": "", "type": "uint48" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "cross", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "description", + "outputs": [ + { "internalType": "string", "name": "", "type": "string" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "fallbackOracle", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "fee", + "outputs": [ + { "internalType": "uint24", "name": "", "type": "uint24" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "feed", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "feedDecimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "feedId", + "outputs": [ + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "getConfiguredOracle", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inAmount", + "type": "uint256" + }, + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "getQuote", + "outputs": [ + { + "internalType": "uint256", + "name": "outAmount", + "type": "uint256" + } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inAmount", + "type": "uint256" + }, + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "getQuotes", + "outputs": [ + { + "internalType": "uint256", + "name": "bidOutAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askOutAmount", + "type": "uint256" + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "governor", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "maxConfWidth", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "maxStaleness", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "name", + "outputs": [ + { "internalType": "string", "name": "", "type": "string" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "oracleBaseCross", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "oracleCrossQuote", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "pool", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "pyth", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "quote", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "inAmount", + "type": "uint256" + }, + { "internalType": "address", "name": "base", "type": "address" }, + { "internalType": "address", "name": "quote", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "resolveOracle", + "outputs": [ + { "internalType": "uint256", "name": "", "type": "uint256" }, + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" }, + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "resolvedVaults", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "tokenA", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "tokenB", + "outputs": [ + { "internalType": "address", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "twapWindow", + "outputs": [ + { "internalType": "uint32", "name": "", "type": "uint32" } + ] + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "getQuote(uint256,address,address)": { + "params": { + "base": "The token that is being priced.", + "inAmount": "The amount of `base` to convert.", + "quote": "The token that is the unit of account." + }, + "returns": { + "outAmount": "The amount of `quote` that is equivalent to `inAmount` of `base`." + } + }, + "getQuotes(uint256,address,address)": { + "params": { + "base": "The token that is being priced.", + "inAmount": "The amount of `base` to convert.", + "quote": "The token that is the unit of account." + }, + "returns": { + "askOutAmount": "The amount of `quote` you would spend for buying `inAmount` of `base`.", + "bidOutAmount": "The amount of `quote` you would get for selling `inAmount` of `base`." + } + }, + "name()": { "returns": { "_0": "The name of the oracle." } } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getQuote(uint256,address,address)": { + "notice": "One-sided price: How much quote token you would get for inAmount of base token, assuming no price spread." + }, + "getQuotes(uint256,address,address)": { + "notice": "Two-sided price: How much quote token you would get/spend for selling/buying inAmount of base token." + }, + "name()": { "notice": "Get the name of the oracle." } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/", + "@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/", + "@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/", + "@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/", + "@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/", + "@solady/=lib/euler-price-oracle/lib/solady/src/", + "@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/", + "@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/", + "axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/", + "axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/", + "ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", + "ethereum-vault-connector/=lib/ethereum-vault-connector/src/", + "euler-price-oracle-test/=lib/euler-price-oracle/test/", + "euler-price-oracle/=lib/euler-price-oracle/src/", + "euler-vault-kit/=lib/euler-vault-kit/src/", + "evc/=lib/ethereum-vault-connector/src/", + "evk-test/=lib/euler-vault-kit/test/", + "evk/=lib/euler-vault-kit/src/", + "fee-flow/=lib/fee-flow/src/", + "forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", + "openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/", + "permit2/=lib/euler-vault-kit/lib/permit2/", + "pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/", + "redstone-oracles-monorepo/=lib/euler-price-oracle/lib/", + "reward-streams/=lib/reward-streams/src/", + "solady/=lib/euler-price-oracle/lib/solady/src/", + "solmate/=lib/fee-flow/lib/solmate/src/", + "v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/", + "v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/" + ], + "optimizer": { "enabled": true, "runs": 20000 }, + "metadata": { "bytecodeHash": "ipfs" }, + "compilationTarget": { "src/Lens/OracleLens.sol": "IOracle" }, + "evmVersion": "cancun", + "libraries": {} + }, + "sources": { + "lib/ethereum-vault-connector/src/interfaces/IVault.sol": { + "keccak256": "0xb04fe66deccf8baa3e5c850f2ecf32e948393d7a42e78b59b037141b205edf42", + "urls": [ + "bzz-raw://11acaad66e9a42deec1f9328abe9f2662bfb109568baa20a79317ae707b94016", + "dweb:/ipfs/QmQbAtvrk9cqXJJZgMRjdxrMDXiZPz37m6PGZYEpbtN8to" + ], + "license": "GPL-2.0-or-later" + }, + "lib/euler-price-oracle/src/interfaces/IPriceOracle.sol": { + "keccak256": "0x03567dd4084dc74a9e2f9eeffce4d9047989b0d2122820716c3bc75891484308", + "urls": [ + "bzz-raw://23965a79475c85a0a8a3a137a76424f60debd9e592bc9127d463392fad7df30f", + "dweb:/ipfs/QmPc1bV3kZ3ynLGTqG6xRbZ3E5AstYdfipXbysSqYGhJYA" + ], + "license": "GPL-2.0-or-later" + }, + "lib/euler-vault-kit/src/EVault/IEVault.sol": { + "keccak256": "0x1e41f0fe57683c65b27afa6b725ee2c68128b540f682bba93e2dc135522ac6b3", + "urls": [ + "bzz-raw://86bb1872eb9073214b853663fb136157bea709bbcf626bb0a2bb2748a43f941d", + "dweb:/ipfs/QmSWQPjHBBahLM3AsoVjHHYEBiBj8WbkQqCQLPNUJVMX1k" + ], + "license": "GPL-2.0-or-later" + }, + "lib/euler-vault-kit/src/EVault/shared/lib/RPow.sol": { + "keccak256": "0xb471fd40087fc710f7a53eb3b559fa446b8cdc3f866644b0d5575995cec614c2", + "urls": [ + "bzz-raw://e54ae3486d6f7dcd8bc18251231836750d57e2c66e8f47836c19e2eedd9d45a8", + "dweb:/ipfs/QmXNUPLE42A4Eiw3wrgPVWV9Qp7buvu4nzWNVdNUQ2MHGm" + ], + "license": "AGPL-3.0-or-later" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", + "urls": [ + "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", + "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ], + "license": "MIT" + }, + "src/Lens/LensTypes.sol": { + "keccak256": "0xd7893f48d1fa5ba6d44ee8c6620f49a7c9feb7db56e6384f4188675286956af9", + "urls": [ + "bzz-raw://0f635782d5f16d8f3afd07123e6d1f0e96b23da7051961108e56d4138cd512c0", + "dweb:/ipfs/QmZtPpkfd5eKLDn5wLUYNWWLP8LSULm177ngJds82nYZSA" + ], + "license": "GPL-2.0-or-later" + }, + "src/Lens/OracleLens.sol": { + "keccak256": "0xd622458da92aa88d69fb70a622c5808b10aee47579e03af3e4e45a92d6d01c0d", + "urls": [ + "bzz-raw://e1849e1339f78c96ee652323973e673003f5feb7b475244c44775e1fe1ddfd59", + "dweb:/ipfs/QmbjdbE25Bq8FhTQDtyXr3pgq4CakKWnMf6zuvER4rdJ1j" + ], + "license": "GPL-2.0-or-later" + }, + "src/Lens/Utils.sol": { + "keccak256": "0x3d6d9ca0feb93c47542b7cf399635734700971a02500d465afc94e1136660a40", + "urls": [ + "bzz-raw://280d5821c2d00f42e5ea1f88df9a345994da9593cc6130e3b626b5316e36f84f", + "dweb:/ipfs/QmaXDq3Rv5MVShQFo5C8cnuhNhUw9NMqQv3Zn63YuFfcLq" + ], + "license": "GPL-2.0-or-later" + }, + "src/SnapshotRegistry/SnapshotRegistry.sol": { + "keccak256": "0x20216f4473c0085110eec3a00e28a69f3b7377e0289e7d302c2e08c8ec32c64a", + "urls": [ + "bzz-raw://d1b5cc9ae71f217d1bd974afe7ee73fff058215ecfb1a63eb1ba2194f00f8e23", + "dweb:/ipfs/QmPU5mBq4AvPwH38HrK6j52vEctM1forJgPzshwoaGjHYC" + ], + "license": "GPL-2.0-or-later" + } + }, + "version": 1 + }, + "id": 205 +} diff --git a/contracts/IPyth.json b/contracts/IPyth.json new file mode 100644 index 0000000..fbfcdfc --- /dev/null +++ b/contracts/IPyth.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"getEmaPrice","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getEmaPriceNoOlderThan","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"age","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getEmaPriceUnsafe","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getPrice","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getPriceNoOlderThan","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"age","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getPriceUnsafe","inputs":[{"name":"id","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getUpdateFee","inputs":[{"name":"updateData","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"feeAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getValidTimePeriod","inputs":[],"outputs":[{"name":"validTimePeriod","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"parsePriceFeedUpdates","inputs":[{"name":"updateData","type":"bytes[]","internalType":"bytes[]"},{"name":"priceIds","type":"bytes32[]","internalType":"bytes32[]"},{"name":"minPublishTime","type":"uint64","internalType":"uint64"},{"name":"maxPublishTime","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"priceFeeds","type":"tuple[]","internalType":"struct PythStructs.PriceFeed[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"price","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]},{"name":"emaPrice","type":"tuple","internalType":"struct PythStructs.Price","components":[{"name":"price","type":"int64","internalType":"int64"},{"name":"conf","type":"uint64","internalType":"uint64"},{"name":"expo","type":"int32","internalType":"int32"},{"name":"publishTime","type":"uint256","internalType":"uint256"}]}]}],"stateMutability":"payable"},{"type":"function","name":"updatePriceFeeds","inputs":[{"name":"updateData","type":"bytes[]","internalType":"bytes[]"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"updatePriceFeedsIfNecessary","inputs":[{"name":"updateData","type":"bytes[]","internalType":"bytes[]"},{"name":"priceIds","type":"bytes32[]","internalType":"bytes32[]"},{"name":"publishTimes","type":"uint64[]","internalType":"uint64[]"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"BatchPriceFeedUpdate","inputs":[{"name":"chainId","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"sequenceNumber","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"PriceFeedUpdate","inputs":[{"name":"id","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"publishTime","type":"uint64","indexed":false,"internalType":"uint64"},{"name":"price","type":"int64","indexed":false,"internalType":"int64"},{"name":"conf","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"getEmaPrice(bytes32)":"b5dcc911","getEmaPriceNoOlderThan(bytes32,uint256)":"711a2e28","getEmaPriceUnsafe(bytes32)":"9474f45b","getPrice(bytes32)":"31d98b3f","getPriceNoOlderThan(bytes32,uint256)":"a4ae35e0","getPriceUnsafe(bytes32)":"96834ad3","getUpdateFee(bytes[])":"d47eed45","getValidTimePeriod()":"e18910a3","parsePriceFeedUpdates(bytes[],bytes32[],uint64,uint64)":"4716e9c5","updatePriceFeeds(bytes[])":"ef9e5e28","updatePriceFeedsIfNecessary(bytes[],bytes32[],uint64[])":"b9256d28"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"chainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"BatchPriceFeedUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"publishTime\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"}],\"name\":\"PriceFeedUpdate\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getEmaPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"age\",\"type\":\"uint256\"}],\"name\":\"getEmaPriceNoOlderThan\",\"outputs\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getEmaPriceUnsafe\",\"outputs\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"age\",\"type\":\"uint256\"}],\"name\":\"getPriceNoOlderThan\",\"outputs\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"getPriceUnsafe\",\"outputs\":[{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"updateData\",\"type\":\"bytes[]\"}],\"name\":\"getUpdateFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getValidTimePeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"validTimePeriod\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"updateData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"priceIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint64\",\"name\":\"minPublishTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxPublishTime\",\"type\":\"uint64\"}],\"name\":\"parsePriceFeedUpdates\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"price\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int64\",\"name\":\"price\",\"type\":\"int64\"},{\"internalType\":\"uint64\",\"name\":\"conf\",\"type\":\"uint64\"},{\"internalType\":\"int32\",\"name\":\"expo\",\"type\":\"int32\"},{\"internalType\":\"uint256\",\"name\":\"publishTime\",\"type\":\"uint256\"}],\"internalType\":\"struct PythStructs.Price\",\"name\":\"emaPrice\",\"type\":\"tuple\"}],\"internalType\":\"struct PythStructs.PriceFeed[]\",\"name\":\"priceFeeds\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"updateData\",\"type\":\"bytes[]\"}],\"name\":\"updatePriceFeeds\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"updateData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"priceIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint64[]\",\"name\":\"publishTimes\",\"type\":\"uint64[]\"}],\"name\":\"updatePriceFeedsIfNecessary\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Pyth Data Association\",\"details\":\"Please refer to the guidance at https://docs.pyth.network/consumers/best-practices for how to consume prices safely.\",\"events\":{\"BatchPriceFeedUpdate(uint16,uint64)\":{\"details\":\"Emitted when a batch price update is processed successfully.\",\"params\":{\"chainId\":\"ID of the source chain that the batch price update comes from.\",\"sequenceNumber\":\"Sequence number of the batch price update.\"}},\"PriceFeedUpdate(bytes32,uint64,int64,uint64)\":{\"details\":\"Emitted when the price feed with `id` has received a fresh update.\",\"params\":{\"conf\":\"Confidence interval of the given price update.\",\"id\":\"The Pyth Price Feed ID.\",\"price\":\"Price of the given price update.\",\"publishTime\":\"Publish time of the given price update.\"}}},\"kind\":\"dev\",\"methods\":{\"getEmaPrice(bytes32)\":{\"details\":\"Reverts if the EMA price is not available.\",\"params\":{\"id\":\"The Pyth Price Feed ID of which to fetch the EMA price and confidence interval.\"},\"returns\":{\"price\":\"- please read the documentation of PythStructs.Price to understand how to use this safely.\"}},\"getEmaPriceNoOlderThan(bytes32,uint256)\":{\"details\":\"This function is a sanity-checked version of `getEmaPriceUnsafe` which is useful in applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently recently.\",\"returns\":{\"price\":\"- please read the documentation of PythStructs.Price to understand how to use this safely.\"}},\"getEmaPriceUnsafe(bytes32)\":{\"details\":\"This function returns the same price as `getEmaPrice` in the case where the price is available. However, if the price is not recent this function returns the latest available price. The returned price can be from arbitrarily far in the past; this function makes no guarantees that the returned price is recent or useful for any particular application. Users of this function should check the `publishTime` in the price to ensure that the returned price is sufficiently recent for their application. If you are considering using this function, it may be safer / easier to use either `getEmaPrice` or `getEmaPriceNoOlderThan`.\",\"returns\":{\"price\":\"- please read the documentation of PythStructs.Price to understand how to use this safely.\"}},\"getPrice(bytes32)\":{\"details\":\"Reverts if the price has not been updated within the last `getValidTimePeriod()` seconds.\",\"params\":{\"id\":\"The Pyth Price Feed ID of which to fetch the price and confidence interval.\"},\"returns\":{\"price\":\"- please read the documentation of PythStructs.Price to understand how to use this safely.\"}},\"getPriceNoOlderThan(bytes32,uint256)\":{\"details\":\"This function is a sanity-checked version of `getPriceUnsafe` which is useful in applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently recently.\",\"returns\":{\"price\":\"- please read the documentation of PythStructs.Price to understand how to use this safely.\"}},\"getPriceUnsafe(bytes32)\":{\"details\":\"This function returns the most recent price update in this contract without any recency checks. This function is unsafe as the returned price update may be arbitrarily far in the past. Users of this function should check the `publishTime` in the price to ensure that the returned price is sufficiently recent for their application. If you are considering using this function, it may be safer / easier to use either `getPrice` or `getPriceNoOlderThan`.\",\"returns\":{\"price\":\"- please read the documentation of PythStructs.Price to understand how to use this safely.\"}},\"getUpdateFee(bytes[])\":{\"params\":{\"updateData\":\"Array of price update data.\"},\"returns\":{\"feeAmount\":\"The required fee in Wei.\"}},\"parsePriceFeedUpdates(bytes[],bytes32[],uint64,uint64)\":{\"details\":\"Reverts if the transferred fee is not sufficient or the updateData is invalid or there is no update for any of the given `priceIds` within the given time range.\",\"params\":{\"maxPublishTime\":\"maximum acceptable publishTime for the given `priceIds`.\",\"minPublishTime\":\"minimum acceptable publishTime for the given `priceIds`.\",\"priceIds\":\"Array of price ids.\",\"updateData\":\"Array of price update data.\"},\"returns\":{\"priceFeeds\":\"Array of the price feeds corresponding to the given `priceIds` (with the same order).\"}},\"updatePriceFeeds(bytes[])\":{\"details\":\"Reverts if the transferred fee is not sufficient or the updateData is invalid.\",\"params\":{\"updateData\":\"Array of price update data.\"}},\"updatePriceFeedsIfNecessary(bytes[],bytes32[],uint64[])\":{\"details\":\"Reverts if update is not needed or the transferred fee is not sufficient or the updateData is invalid.\",\"params\":{\"priceIds\":\"Array of price ids.\",\"publishTimes\":\"Array of publishTimes. `publishTimes[i]` corresponds to known `publishTime` of `priceIds[i]`\",\"updateData\":\"Array of price update data.\"}}},\"title\":\"Consume prices from the Pyth Network (https://pyth.network/).\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getEmaPrice(bytes32)\":{\"notice\":\"Returns the exponentially-weighted moving average price and confidence interval.\"},\"getEmaPriceNoOlderThan(bytes32,uint256)\":{\"notice\":\"Returns the exponentially-weighted moving average price that is no older than `age` seconds of the current time.\"},\"getEmaPriceUnsafe(bytes32)\":{\"notice\":\"Returns the exponentially-weighted moving average price of a price feed without any sanity checks.\"},\"getPrice(bytes32)\":{\"notice\":\"Returns the price and confidence interval.\"},\"getPriceNoOlderThan(bytes32,uint256)\":{\"notice\":\"Returns the price that is no older than `age` seconds of the current time.\"},\"getPriceUnsafe(bytes32)\":{\"notice\":\"Returns the price of a price feed without any sanity checks.\"},\"getUpdateFee(bytes[])\":{\"notice\":\"Returns the required fee to update an array of price updates.\"},\"getValidTimePeriod()\":{\"notice\":\"Returns the period (in seconds) that a price feed is considered valid since its publish time\"},\"parsePriceFeedUpdates(bytes[],bytes32[],uint64,uint64)\":{\"notice\":\"Parse `updateData` and return price feeds of the given `priceIds` if they are all published within `minPublishTime` and `maxPublishTime`. You can use this method if you want to use a Pyth price at a fixed time and not the most recent price; otherwise, please consider using `updatePriceFeeds`. This method does not store the price updates on-chain. This method requires the caller to pay a fee in wei; the required fee can be computed by calling `getUpdateFee` with the length of the `updateData` array.\"},\"updatePriceFeeds(bytes[])\":{\"notice\":\"Update price feeds with given update messages. This method requires the caller to pay a fee in wei; the required fee can be computed by calling `getUpdateFee` with the length of the `updateData` array. Prices will be updated if they are more recent than the current stored prices. The call will succeed even if the update is not the most recent.\"},\"updatePriceFeedsIfNecessary(bytes[],bytes32[],uint64[])\":{\"notice\":\"Wrapper around updatePriceFeeds that rejects fast if a price update is not necessary. A price update is necessary if the current on-chain publishTime is older than the given publishTime. It relies solely on the given `publishTimes` for the price feeds and does not read the actual price update publish time within `updateData`. This method requires the caller to pay a fee in wei; the required fee can be computed by calling `getUpdateFee` with the length of the `updateData` array. `priceIds` and `publishTimes` are two arrays with the same size that correspond to senders known publishTime of each priceId when calling this method. If all of price feeds within `priceIds` have updated and have a newer or equal publish time than the given publish time, it will reject the transaction to save gas. Otherwise, it calls updatePriceFeeds method to update the prices.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/euler-price-oracle/lib/pyth-sdk-solidity/IPyth.sol\":\"IPyth\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":20000},\"remappings\":[\":@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/\",\":@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/\",\":@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/\",\":@solady/=lib/euler-price-oracle/lib/solady/src/\",\":@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/\",\":@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/\",\":axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/\",\":axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/\",\":ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":ethereum-vault-connector/=lib/ethereum-vault-connector/src/\",\":euler-price-oracle-test/=lib/euler-price-oracle/test/\",\":euler-price-oracle/=lib/euler-price-oracle/src/\",\":euler-vault-kit/=lib/euler-vault-kit/src/\",\":evc/=lib/ethereum-vault-connector/src/\",\":evk-test/=lib/euler-vault-kit/test/\",\":evk/=lib/euler-vault-kit/src/\",\":fee-flow/=lib/fee-flow/src/\",\":forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/\",\":openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/\",\":permit2/=lib/euler-vault-kit/lib/permit2/\",\":pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/\",\":redstone-oracles-monorepo/=lib/euler-price-oracle/lib/\",\":reward-streams/=lib/reward-streams/src/\",\":solady/=lib/euler-price-oracle/lib/solady/src/\",\":solmate/=lib/fee-flow/lib/solmate/src/\",\":v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/\",\":v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/\"]},\"sources\":{\"lib/euler-price-oracle/lib/pyth-sdk-solidity/IPyth.sol\":{\"keccak256\":\"0x949c65c65fea0578c09a6fc068e09ed1165adede2c835984cefcb25d76de1de2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4d7cb071e08e81bb8b113a928f4c2d2b3cdf950ad64c6c7003ea3d874163ca77\",\"dweb:/ipfs/QmRbQchPxRTBMHi7WzLb8XnMGzPDQcWhu7i2u5naUsCRoZ\"]},\"lib/euler-price-oracle/lib/pyth-sdk-solidity/IPythEvents.sol\":{\"keccak256\":\"0x048a35526c2e77d107d43ba336f1dcf31f64cef25ba429ae1f7a0fbc11c23320\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b75be4c3643b22305995aba71fc92146dbf51fa82d2f9728c515d7749b32dca3\",\"dweb:/ipfs/QmRby4XA9jJQGhxoJ16BTUDuU7BzLFfadbfTgBiQsDgNyZ\"]},\"lib/euler-price-oracle/lib/pyth-sdk-solidity/PythStructs.sol\":{\"keccak256\":\"0x95ff0a6d64517348ef604b8bcf246b561a9445d7e607b8f48491c617cfda9b65\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://fb7f4ffe03be7379d3833c5946e38153de26aef4a4da0323a1ec603787de9eb7\",\"dweb:/ipfs/QmW4WkkLPGjDJrLrW4mYfxtFh8e9KAcPhrnNdxPQsfkS6t\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint16","name":"chainId","type":"uint16","indexed":false},{"internalType":"uint64","name":"sequenceNumber","type":"uint64","indexed":false}],"type":"event","name":"BatchPriceFeedUpdate","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32","indexed":true},{"internalType":"uint64","name":"publishTime","type":"uint64","indexed":false},{"internalType":"int64","name":"price","type":"int64","indexed":false},{"internalType":"uint64","name":"conf","type":"uint64","indexed":false}],"type":"event","name":"PriceFeedUpdate","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getEmaPrice","outputs":[{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"age","type":"uint256"}],"stateMutability":"view","type":"function","name":"getEmaPriceNoOlderThan","outputs":[{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getEmaPriceUnsafe","outputs":[{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getPrice","outputs":[{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"age","type":"uint256"}],"stateMutability":"view","type":"function","name":"getPriceNoOlderThan","outputs":[{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getPriceUnsafe","outputs":[{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]},{"inputs":[{"internalType":"bytes[]","name":"updateData","type":"bytes[]"}],"stateMutability":"view","type":"function","name":"getUpdateFee","outputs":[{"internalType":"uint256","name":"feeAmount","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getValidTimePeriod","outputs":[{"internalType":"uint256","name":"validTimePeriod","type":"uint256"}]},{"inputs":[{"internalType":"bytes[]","name":"updateData","type":"bytes[]"},{"internalType":"bytes32[]","name":"priceIds","type":"bytes32[]"},{"internalType":"uint64","name":"minPublishTime","type":"uint64"},{"internalType":"uint64","name":"maxPublishTime","type":"uint64"}],"stateMutability":"payable","type":"function","name":"parsePriceFeedUpdates","outputs":[{"internalType":"struct PythStructs.PriceFeed[]","name":"priceFeeds","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"struct PythStructs.Price","name":"price","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]},{"internalType":"struct PythStructs.Price","name":"emaPrice","type":"tuple","components":[{"internalType":"int64","name":"price","type":"int64"},{"internalType":"uint64","name":"conf","type":"uint64"},{"internalType":"int32","name":"expo","type":"int32"},{"internalType":"uint256","name":"publishTime","type":"uint256"}]}]}]},{"inputs":[{"internalType":"bytes[]","name":"updateData","type":"bytes[]"}],"stateMutability":"payable","type":"function","name":"updatePriceFeeds"},{"inputs":[{"internalType":"bytes[]","name":"updateData","type":"bytes[]"},{"internalType":"bytes32[]","name":"priceIds","type":"bytes32[]"},{"internalType":"uint64[]","name":"publishTimes","type":"uint64[]"}],"stateMutability":"payable","type":"function","name":"updatePriceFeedsIfNecessary"}],"devdoc":{"kind":"dev","methods":{"getEmaPrice(bytes32)":{"details":"Reverts if the EMA price is not available.","params":{"id":"The Pyth Price Feed ID of which to fetch the EMA price and confidence interval."},"returns":{"price":"- please read the documentation of PythStructs.Price to understand how to use this safely."}},"getEmaPriceNoOlderThan(bytes32,uint256)":{"details":"This function is a sanity-checked version of `getEmaPriceUnsafe` which is useful in applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently recently.","returns":{"price":"- please read the documentation of PythStructs.Price to understand how to use this safely."}},"getEmaPriceUnsafe(bytes32)":{"details":"This function returns the same price as `getEmaPrice` in the case where the price is available. However, if the price is not recent this function returns the latest available price. The returned price can be from arbitrarily far in the past; this function makes no guarantees that the returned price is recent or useful for any particular application. Users of this function should check the `publishTime` in the price to ensure that the returned price is sufficiently recent for their application. If you are considering using this function, it may be safer / easier to use either `getEmaPrice` or `getEmaPriceNoOlderThan`.","returns":{"price":"- please read the documentation of PythStructs.Price to understand how to use this safely."}},"getPrice(bytes32)":{"details":"Reverts if the price has not been updated within the last `getValidTimePeriod()` seconds.","params":{"id":"The Pyth Price Feed ID of which to fetch the price and confidence interval."},"returns":{"price":"- please read the documentation of PythStructs.Price to understand how to use this safely."}},"getPriceNoOlderThan(bytes32,uint256)":{"details":"This function is a sanity-checked version of `getPriceUnsafe` which is useful in applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently recently.","returns":{"price":"- please read the documentation of PythStructs.Price to understand how to use this safely."}},"getPriceUnsafe(bytes32)":{"details":"This function returns the most recent price update in this contract without any recency checks. This function is unsafe as the returned price update may be arbitrarily far in the past. Users of this function should check the `publishTime` in the price to ensure that the returned price is sufficiently recent for their application. If you are considering using this function, it may be safer / easier to use either `getPrice` or `getPriceNoOlderThan`.","returns":{"price":"- please read the documentation of PythStructs.Price to understand how to use this safely."}},"getUpdateFee(bytes[])":{"params":{"updateData":"Array of price update data."},"returns":{"feeAmount":"The required fee in Wei."}},"parsePriceFeedUpdates(bytes[],bytes32[],uint64,uint64)":{"details":"Reverts if the transferred fee is not sufficient or the updateData is invalid or there is no update for any of the given `priceIds` within the given time range.","params":{"maxPublishTime":"maximum acceptable publishTime for the given `priceIds`.","minPublishTime":"minimum acceptable publishTime for the given `priceIds`.","priceIds":"Array of price ids.","updateData":"Array of price update data."},"returns":{"priceFeeds":"Array of the price feeds corresponding to the given `priceIds` (with the same order)."}},"updatePriceFeeds(bytes[])":{"details":"Reverts if the transferred fee is not sufficient or the updateData is invalid.","params":{"updateData":"Array of price update data."}},"updatePriceFeedsIfNecessary(bytes[],bytes32[],uint64[])":{"details":"Reverts if update is not needed or the transferred fee is not sufficient or the updateData is invalid.","params":{"priceIds":"Array of price ids.","publishTimes":"Array of publishTimes. `publishTimes[i]` corresponds to known `publishTime` of `priceIds[i]`","updateData":"Array of price update data."}}},"version":1},"userdoc":{"kind":"user","methods":{"getEmaPrice(bytes32)":{"notice":"Returns the exponentially-weighted moving average price and confidence interval."},"getEmaPriceNoOlderThan(bytes32,uint256)":{"notice":"Returns the exponentially-weighted moving average price that is no older than `age` seconds of the current time."},"getEmaPriceUnsafe(bytes32)":{"notice":"Returns the exponentially-weighted moving average price of a price feed without any sanity checks."},"getPrice(bytes32)":{"notice":"Returns the price and confidence interval."},"getPriceNoOlderThan(bytes32,uint256)":{"notice":"Returns the price that is no older than `age` seconds of the current time."},"getPriceUnsafe(bytes32)":{"notice":"Returns the price of a price feed without any sanity checks."},"getUpdateFee(bytes[])":{"notice":"Returns the required fee to update an array of price updates."},"getValidTimePeriod()":{"notice":"Returns the period (in seconds) that a price feed is considered valid since its publish time"},"parsePriceFeedUpdates(bytes[],bytes32[],uint64,uint64)":{"notice":"Parse `updateData` and return price feeds of the given `priceIds` if they are all published within `minPublishTime` and `maxPublishTime`. You can use this method if you want to use a Pyth price at a fixed time and not the most recent price; otherwise, please consider using `updatePriceFeeds`. This method does not store the price updates on-chain. This method requires the caller to pay a fee in wei; the required fee can be computed by calling `getUpdateFee` with the length of the `updateData` array."},"updatePriceFeeds(bytes[])":{"notice":"Update price feeds with given update messages. This method requires the caller to pay a fee in wei; the required fee can be computed by calling `getUpdateFee` with the length of the `updateData` array. Prices will be updated if they are more recent than the current stored prices. The call will succeed even if the update is not the most recent."},"updatePriceFeedsIfNecessary(bytes[],bytes32[],uint64[])":{"notice":"Wrapper around updatePriceFeeds that rejects fast if a price update is not necessary. A price update is necessary if the current on-chain publishTime is older than the given publishTime. It relies solely on the given `publishTimes` for the price feeds and does not read the actual price update publish time within `updateData`. This method requires the caller to pay a fee in wei; the required fee can be computed by calling `getUpdateFee` with the length of the `updateData` array. `priceIds` and `publishTimes` are two arrays with the same size that correspond to senders known publishTime of each priceId when calling this method. If all of price feeds within `priceIds` have updated and have a newer or equal publish time than the given publish time, it will reject the transaction to save gas. Otherwise, it calls updatePriceFeeds method to update the prices."}},"version":1}},"settings":{"remappings":["@axiom-crypto/axiom-std/=lib/euler-price-oracle/lib/axiom-std/sr/","@axiom-crypto/v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/","@openzeppelin/contracts/utils/math/=lib/euler-price-oracle/lib/openzeppelin-contracts/contracts/utils/math/","@pyth/=lib/euler-price-oracle/lib/pyth-sdk-solidity/","@redstone/evm-connector/=lib/euler-price-oracle/lib/redstone-oracles-monorepo/packages/evm-connector/contracts/","@solady/=lib/euler-price-oracle/lib/solady/src/","@uniswap/v3-core/=lib/euler-price-oracle/lib/v3-core/","@uniswap/v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/","axiom-std/=lib/euler-price-oracle/lib/axiom-std/src/","axiom-v2-periphery/=lib/euler-price-oracle/lib/axiom-v2-periphery/src/","ds-test/=lib/ethereum-vault-connector/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","ethereum-vault-connector/=lib/ethereum-vault-connector/src/","euler-price-oracle-test/=lib/euler-price-oracle/test/","euler-price-oracle/=lib/euler-price-oracle/src/","euler-vault-kit/=lib/euler-vault-kit/src/","evc/=lib/ethereum-vault-connector/src/","evk-test/=lib/euler-vault-kit/test/","evk/=lib/euler-vault-kit/src/","fee-flow/=lib/fee-flow/src/","forge-gas-snapshot/=lib/euler-vault-kit/lib/permit2/lib/forge-gas-snapshot/src/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/","openzeppelin/=lib/ethereum-vault-connector/lib/openzeppelin-contracts/contracts/","permit2/=lib/euler-vault-kit/lib/permit2/","pyth-sdk-solidity/=lib/euler-price-oracle/lib/pyth-sdk-solidity/","redstone-oracles-monorepo/=lib/euler-price-oracle/lib/","reward-streams/=lib/reward-streams/src/","solady/=lib/euler-price-oracle/lib/solady/src/","solmate/=lib/fee-flow/lib/solmate/src/","v3-core/=lib/euler-price-oracle/lib/v3-core/contracts/","v3-periphery/=lib/euler-price-oracle/lib/v3-periphery/contracts/"],"optimizer":{"enabled":true,"runs":20000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/euler-price-oracle/lib/pyth-sdk-solidity/IPyth.sol":"IPyth"},"evmVersion":"cancun","libraries":{}},"sources":{"lib/euler-price-oracle/lib/pyth-sdk-solidity/IPyth.sol":{"keccak256":"0x949c65c65fea0578c09a6fc068e09ed1165adede2c835984cefcb25d76de1de2","urls":["bzz-raw://4d7cb071e08e81bb8b113a928f4c2d2b3cdf950ad64c6c7003ea3d874163ca77","dweb:/ipfs/QmRbQchPxRTBMHi7WzLb8XnMGzPDQcWhu7i2u5naUsCRoZ"],"license":"Apache-2.0"},"lib/euler-price-oracle/lib/pyth-sdk-solidity/IPythEvents.sol":{"keccak256":"0x048a35526c2e77d107d43ba336f1dcf31f64cef25ba429ae1f7a0fbc11c23320","urls":["bzz-raw://b75be4c3643b22305995aba71fc92146dbf51fa82d2f9728c515d7749b32dca3","dweb:/ipfs/QmRby4XA9jJQGhxoJ16BTUDuU7BzLFfadbfTgBiQsDgNyZ"],"license":"Apache-2.0"},"lib/euler-price-oracle/lib/pyth-sdk-solidity/PythStructs.sol":{"keccak256":"0x95ff0a6d64517348ef604b8bcf246b561a9445d7e607b8f48491c617cfda9b65","urls":["bzz-raw://fb7f4ffe03be7379d3833c5946e38153de26aef4a4da0323a1ec603787de9eb7","dweb:/ipfs/QmW4WkkLPGjDJrLrW4mYfxtFh8e9KAcPhrnNdxPQsfkS6t"],"license":"Apache-2.0"}},"version":1},"id":11} \ No newline at end of file diff --git a/contracts/IPyth.sol b/contracts/IPyth.sol new file mode 100644 index 0000000..71a6611 --- /dev/null +++ b/contracts/IPyth.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + + +/// @title Consume prices from the Pyth Network (https://pyth.network/). +/// @dev Please refer to the guidance at https://docs.pyth.network/consumers/best-practices for how to consume prices safely. +/// @author Pyth Data Association +interface IPyth { + /// @notice Update price feeds with given update messages. + /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling + /// `getUpdateFee` with the length of the `updateData` array. + /// Prices will be updated if they are more recent than the current stored prices. + /// The call will succeed even if the update is not the most recent. + /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid. + /// @param updateData Array of price update data. + function updatePriceFeeds(bytes[] calldata updateData) external payable; + + + /// @notice Returns the required fee to update an array of price updates. + /// @param updateData Array of price update data. + /// @return feeAmount The required fee in Wei. + function getUpdateFee( + bytes[] calldata updateData + ) external view returns (uint feeAmount); + +} diff --git a/contracts/ISwapper.sol b/contracts/ISwapper.sol new file mode 100644 index 0000000..90fa1dc --- /dev/null +++ b/contracts/ISwapper.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity >=0.8.0; + +/// @title ISwapper +/// @custom:security-contact security@euler.xyz +/// @author Euler Labs (https://www.eulerlabs.com/) +/// @notice Interface of helper contracts, which handle swapping of assets for Euler Vault Kit +interface ISwapper { + /// @title SwapParams + /// @notice This struct holds all the parameters needed to carry out a swap + struct SwapParams { + // An id of the swap handler to use + bytes32 handler; + // Swap mode to execute + // 0 - exact input swap + // 1 - exect output swap + // 2 - exact output swap and repay, targeting a debt amount of an account + uint256 mode; + // An EVC compatible account address, used e.g. as receiver of repay in swap and repay mode + address account; + // Sold asset + address tokenIn; + // Bought asset + address tokenOut; + // Vault to which the unused input in exact output swap will be deposited back + address vaultIn; + // In swapping modes (0 and 1) - address of the intended recipient of the bought tokens + // In swap and repay mode (2) - address of the liability vault of the account, where to repay debt + // Note that if the swap uses off-chain encoded payload, the receiver might be ignored. The user + // should verify the assets are in fact in the receiver address after the swap + address receiver; + // In exact input mode (0) - ignored + // In exact output mode (1) - amount of `tokenOut` to buy + // In swap and repay mode (2) - amount of debt the account should have after swap and repay + uint256 amountOut; + // Auxiliary payload for swap providers + bytes data; + } + + /// @notice Execute a swap (and possibly repay or deposit) according to the SwapParams configuration + /// @param params Configuration of the swap + function swap(SwapParams calldata params) external; + + /// @notice Use the contract's token balance to repay debt of the account in a lending vault + /// @param token The asset that is borrowed + /// @param vault The lending vault where the debt is tracked + /// @param repayAmount Amount of debt to repay + /// @param account Receiver of the repay + /// @dev If contract's balance is lower than requested repay amount, repay only the balance + function repay(address token, address vault, uint256 repayAmount, address account) external; + + /// @notice Use the contract's token balance to repay debt of the account in a lending vault + /// and deposit any remaining balance for the account in that same vault + /// @param token The asset that is borrowed + /// @param vault The lending vault where the debt is tracked + /// @param repayAmount Amount of debt to repay + /// @param account Receiver of the repay + /// @dev If contract's balance is lower than requested repay amount, repay only the balance + function repayAndDeposit(address token, address vault, uint256 repayAmount, address account) external; + + /// @notice Use all of the contract's token balance to execute a deposit for an account + /// @param token Asset to deposit + /// @param vault Vault to deposit the token to + /// @param amountMin A minimum amount of tokens to deposit. If unavailable, the operation is a no-op + /// @param account Receiver of the repay + /// @dev Use amountMin to ignore dust + function deposit(address token, address vault, uint256 amountMin, address account) external; + + /// @notice Transfer all tokens held by the contract + /// @param token Token to transfer + /// @param amountMin Minimum amount of tokens to transfer. If unavailable, the operation is a no-op + /// @param to Address to send the tokens to + function sweep(address token, uint256 amountMin, address to) external; + + /// @notice Call multiple functions of the contract + /// @param calls Array of encoded payloads + /// @dev Calls itself with regular external calls + function multicall(bytes[] memory calls) external; +} diff --git a/contracts/IVault.sol b/contracts/IVault.sol new file mode 100644 index 0000000..e17e834 --- /dev/null +++ b/contracts/IVault.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.8.19; + +/// @title IVault +/// @custom:security-contact security@euler.xyz +/// @author Euler Labs (https://www.eulerlabs.com/) +/// @notice This interface defines the methods for the Vault for the purpose of integration with the Ethereum Vault +/// Connector. +interface IVault { + /// @notice Disables a controller (this vault) for the authenticated account. + /// @dev A controller is a vault that has been chosen for an account to have special control over account’s + /// balances in the enabled collaterals vaults. User calls this function in order for the vault to disable itself + /// for the account if the conditions are met (i.e. user has repaid debt in full). If the conditions are not met, + /// the function reverts. + function disableController() external; + + /// @notice Checks the status of an account. + /// @dev This function must only deliberately revert if the account status is invalid. If this function reverts due + /// to any other reason, it may render the account unusable with possibly no way to recover funds. + /// @param account The address of the account to be checked. + /// @param collaterals The array of enabled collateral addresses to be considered for the account status check. + /// @return magicValue Must return the bytes4 magic value 0xb168c58f (which is a selector of this function) when + /// account status is valid, or revert otherwise. + function checkAccountStatus(address account, address[] calldata collaterals) external returns (bytes4 magicValue); + + /// @notice Checks the status of the vault. + /// @dev This function must only deliberately revert if the vault status is invalid. If this function reverts due to + /// any other reason, it may render some accounts unusable with possibly no way to recover funds. + /// @return magicValue Must return the bytes4 magic value 0x4b3d1223 (which is a selector of this function) when + /// account status is valid, or revert otherwise. + function checkVaultStatus() external returns (bytes4 magicValue); +} diff --git a/contracts/Liquidator.sol b/contracts/Liquidator.sol new file mode 100644 index 0000000..c1b7ce6 --- /dev/null +++ b/contracts/Liquidator.sol @@ -0,0 +1,603 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +import {ISwapper} from "./ISwapper.sol"; +import {SwapVerifier} from "./SwapVerifier.sol"; +import {IEVC} from "./IEVC.sol"; + +import {IERC4626, IERC20} from "./IEVault.sol"; +import {IEVault, IRiskManager, IBorrowing, ILiquidation} from "./IEVault.sol"; + +import {IPyth} from "./IPyth.sol"; + +contract Liquidator { + address public immutable owner; + address public immutable swapperAddress; + address public immutable swapVerifierAddress; + address public immutable evcAddress; + + address public immutable PYTH; + + bytes32 public constant HANDLER_ONE_INCH = bytes32("1Inch"); + bytes32 public constant HANDLER_UNISWAP_AUTOROUTER = bytes32("UniswapAutoRouter"); + + ISwapper swapper; + IEVC evc; + + error Unauthorized(); + error LessThanExpectedCollateralReceived(); + + constructor(address _owner, address _swapperAddress, address _swapVerifierAddress, address _evcAddress, address _pythAddress) { + owner = _owner; + swapperAddress = _swapperAddress; + swapVerifierAddress = _swapVerifierAddress; + evcAddress = _evcAddress; + PYTH = _pythAddress; + + swapper = ISwapper(_swapperAddress); + evc = IEVC(_evcAddress); + } + + modifier onlyOwner() { + require(msg.sender == owner, "Unauthorized"); + _; + } + + struct LiquidationParams { + address violatorAddress; + address vault; + address borrowedAsset; + address collateralVault; + address collateralAsset; + uint256 repayAmount; + uint256 seizedCollateralAmount; + uint256 swapAmount; + uint256 expectedRemainingCollateral; + uint256 swapType; + bytes swapData; + address receiver; + } + + event Liquidation( + address indexed violatorAddress, + address indexed vault, + address repaidBorrowAsset, + address seizedCollateralAsset, + uint256 amountRepaid, + uint256 amountCollaterallSeized + ); + + function liquidateSingleCollateral(LiquidationParams calldata params) external returns (bool success) { + bytes[] memory multicallItems = new bytes[](3); + + // Calls swap function of swapper which will swap some amount of seized collateral for borrowed asset + // Swaps via 1inch + if (params.swapType == 1){ + multicallItems[0] = abi.encodeCall( + ISwapper.swap, + ISwapper.SwapParams({ + handler: HANDLER_ONE_INCH, + mode: 0, + account: address(0), // ignored + tokenIn: params.collateralAsset, + tokenOut: params.borrowedAsset, + amountOut: 0, + vaultIn: address(0), // ignored + receiver: address(0), // ignored + data: params.swapData + }) + ); + } else { + multicallItems[0] = abi.encodeCall( + ISwapper.swap, + ISwapper.SwapParams({ + handler: HANDLER_UNISWAP_AUTOROUTER, + mode: 1, + account: swapperAddress, + tokenIn: params.collateralAsset, + tokenOut: params.borrowedAsset, + amountOut: params.repayAmount, + vaultIn: params.collateralVault, + receiver: swapperAddress, + data: params.swapData + }) + ); + } + + // Use swapper contract to repay borrowed asset + multicallItems[1] = + abi.encodeCall(ISwapper.repay, (params.borrowedAsset, params.vault, params.repayAmount, address(this))); + + // Sweep any dust left in the swapper contract + multicallItems[2] = abi.encodeCall(ISwapper.sweep, (params.borrowedAsset, 0, params.receiver)); + + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](6); + + // Step 1: enable controller + batchItems[0] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableController, (address(this), params.vault)) + }); + + // Step 2: enable collateral + batchItems[1] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableCollateral, (address(this), params.collateralVault)) + }); + + // Step 3: Liquidate account in violation + batchItems[2] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.vault, + value: 0, + data: abi.encodeCall( + ILiquidation.liquidate, + (params.violatorAddress, params.collateralVault, params.repayAmount, 0) // TODO: adjust minimum collateral + ) + }); + + // Step 4: Withdraw collateral from vault to swapper + batchItems[3] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.collateralVault, + value: 0, + data: abi.encodeCall(IERC4626.withdraw, (params.swapAmount, swapperAddress, address(this))) + }); + + // Step 5: Swap collateral for borrowed asset, repay, and sweep overswapped borrow asset + batchItems[4] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: swapperAddress, + value: 0, + data: abi.encodeCall(ISwapper.multicall, multicallItems) + }); + + // Step 6: transfer remaining collateral shares to receiver + batchItems[5] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.collateralVault, + value: 0, + data: abi.encodeCall( + IERC20.transfer, + (params.receiver, (params.seizedCollateralAmount - params.swapAmount))) + }); + + // Submit batch to EVC + evc.batch(batchItems); + + emit Liquidation( + params.violatorAddress, + params.vault, + params.borrowedAsset, + params.collateralAsset, + params.repayAmount, + params.seizedCollateralAmount + ); + + if (IERC20(params.collateralVault).balanceOf(address(this)) > 0) { + IERC20(params.collateralVault).transfer(params.receiver, IERC20(params.collateralVault).balanceOf(address(this))); + } + + return true; + } + + function liquidateSingleCollateralWithPythOracle(LiquidationParams calldata params, bytes[] calldata pythUpdateData) external payable returns (bool success) { + bytes[] memory multicallItems = new bytes[](3); + + // Calls swap function of swapper which will swap some amount of seized collateral for borrowed asset + // Swaps via 1inch + if (params.swapType == 1){ + multicallItems[0] = abi.encodeCall( + ISwapper.swap, + ISwapper.SwapParams({ + handler: HANDLER_ONE_INCH, + mode: 0, + account: address(0), // ignored + tokenIn: params.collateralAsset, + tokenOut: params.borrowedAsset, + amountOut: 0, + vaultIn: address(0), // ignored + receiver: address(0), // ignored + data: params.swapData + }) + ); + } else { + multicallItems[0] = abi.encodeCall( + ISwapper.swap, + ISwapper.SwapParams({ + handler: HANDLER_UNISWAP_AUTOROUTER, + mode: 1, + account: swapperAddress, + tokenIn: params.collateralAsset, + tokenOut: params.borrowedAsset, + amountOut: params.repayAmount, + vaultIn: params.collateralVault, + receiver: swapperAddress, + data: params.swapData + }) + ); + } + + // Use swapper contract to repay borrowed asset + multicallItems[1] = + abi.encodeCall(ISwapper.repay, (params.borrowedAsset, params.vault, params.repayAmount, address(this))); + + // Sweep any dust left in the swapper contract + multicallItems[2] = abi.encodeCall(ISwapper.sweep, (params.borrowedAsset, 0, params.receiver)); + + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](7); + + // Step 0: update Pyth oracles + batchItems[0] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: PYTH, + value: msg.value, + data: abi.encodeCall(IPyth.updatePriceFeeds, pythUpdateData) + }); + + // Step 1: enable controller + batchItems[1] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableController, (address(this), params.vault)) + }); + + // Step 2: enable collateral + batchItems[2] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableCollateral, (address(this), params.collateralVault)) + }); + + // Step 3: Liquidate account in violation + batchItems[3] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.vault, + value: 0, + data: abi.encodeCall( + ILiquidation.liquidate, + (params.violatorAddress, params.collateralVault, params.repayAmount, 0) // TODO: adjust minimum collateral + ) + }); + + // Step 4: Withdraw collateral from vault to swapper + batchItems[4] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.collateralVault, + value: 0, + data: abi.encodeCall(IERC4626.withdraw, (params.swapAmount, swapperAddress, address(this))) + }); + + // Step 5: Swap collateral for borrowed asset, repay, and sweep overswapped borrow asset + batchItems[5] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: swapperAddress, + value: 0, + data: abi.encodeCall(ISwapper.multicall, multicallItems) + }); + + // Step 6: transfer remaining collateral shares to receiver + batchItems[6] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.collateralVault, + value: 0, + data: abi.encodeCall( + IERC20.transfer, + (params.receiver, (params.seizedCollateralAmount - params.swapAmount))) + }); + + // Submit batch to EVC + evc.batch{value: msg.value}(batchItems); + + emit Liquidation( + params.violatorAddress, + params.vault, + params.borrowedAsset, + params.collateralAsset, + params.repayAmount, + params.seizedCollateralAmount + ); + + if (IERC20(params.collateralVault).balanceOf(address(this)) > 0) { + IERC20(params.collateralVault).transfer(params.receiver, IERC20(params.collateralVault).balanceOf(address(this))); + } + + return true; + } + + function liquidateSingleCollateralWithRedstoneOracle(LiquidationParams calldata params, bytes[] calldata redstoneUpdateData, address[] calldata adapterAddresses) external payable returns (bool success) { + bytes[] memory multicallItems = new bytes[](3); + + // Calls swap function of swapper which will swap some amount of seized collateral for borrowed asset + // Swaps via 1inch + if (params.swapType == 1){ + multicallItems[0] = abi.encodeCall( + ISwapper.swap, + ISwapper.SwapParams({ + handler: HANDLER_ONE_INCH, + mode: 0, + account: address(0), // ignored + tokenIn: params.collateralAsset, + tokenOut: params.borrowedAsset, + amountOut: 0, + vaultIn: address(0), // ignored + receiver: address(0), // ignored + data: params.swapData + }) + ); + } else { + multicallItems[0] = abi.encodeCall( + ISwapper.swap, + ISwapper.SwapParams({ + handler: HANDLER_UNISWAP_AUTOROUTER, + mode: 1, + account: swapperAddress, + tokenIn: params.collateralAsset, + tokenOut: params.borrowedAsset, + amountOut: params.repayAmount, + vaultIn: params.collateralVault, + receiver: swapperAddress, + data: params.swapData + }) + ); + } + + // Use swapper contract to repay borrowed asset + multicallItems[1] = + abi.encodeCall(ISwapper.repay, (params.borrowedAsset, params.vault, params.repayAmount, address(this))); + + // Sweep any dust left in the swapper contract + multicallItems[2] = abi.encodeCall(ISwapper.sweep, (params.borrowedAsset, 0, params.receiver)); + + uint256 numberOfOracleUpdates = redstoneUpdateData.length; + + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](numberOfOracleUpdates + 6); + + // Step 0: update Redstone oracles + for (uint256 i = 0; i < redstoneUpdateData.length; i++){ + batchItems[i] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: adapterAddresses[i], + value: 0, + data: redstoneUpdateData[i] + }); + } + + // Step 1: enable controller + batchItems[numberOfOracleUpdates] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableController, (address(this), params.vault)) + }); + + // Step 2: enable collateral + batchItems[numberOfOracleUpdates + 1] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableCollateral, (address(this), params.collateralVault)) + }); + + // Step 3: Liquidate account in violation + batchItems[numberOfOracleUpdates + 2] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.vault, + value: 0, + data: abi.encodeCall( + ILiquidation.liquidate, + (params.violatorAddress, params.collateralVault, params.repayAmount, 0) // TODO: adjust minimum collateral + ) + }); + + // Step 4: Withdraw collateral from vault to swapper + batchItems[numberOfOracleUpdates + 3] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.collateralVault, + value: 0, + data: abi.encodeCall(IERC4626.withdraw, (params.swapAmount, swapperAddress, address(this))) + }); + + // Step 5: Swap collateral for borrowed asset, repay, and sweep overswapped borrow asset + batchItems[numberOfOracleUpdates + 4] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: swapperAddress, + value: 0, + data: abi.encodeCall(ISwapper.multicall, multicallItems) + }); + + // Step 6: transfer remaining collateral shares to receiver + batchItems[numberOfOracleUpdates + 5] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.collateralVault, + value: 0, + data: abi.encodeCall( + IERC20.transfer, + (params.receiver, (params.seizedCollateralAmount - params.swapAmount))) + }); + + // Submit batch to EVC + evc.batch(batchItems); + + emit Liquidation( + params.violatorAddress, + params.vault, + params.borrowedAsset, + params.collateralAsset, + params.repayAmount, + params.seizedCollateralAmount + ); + + if (IERC20(params.collateralVault).balanceOf(address(this)) > 0) { + IERC20(params.collateralVault).transfer(params.receiver, IERC20(params.collateralVault).balanceOf(address(this))); + } + + return true; + } + + // 2nd liquidation option: seize liquidated position without swapping/repaying, can only be done with existing collateral position + // TODO: implement this as an operator so debt can be seized directly by whitelisted liquidators + function liquidateFromExistingCollateralPosition(LiquidationParams calldata params) + external + returns (bool success) + { + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](3); + + batchItems[0] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableController, (address(this), params.vault)) + }); + + batchItems[1] = IEVC.BatchItem({ + onBehalfOfAccount: address(0), + targetContract: address(evc), + value: 0, + data: abi.encodeCall(IEVC.enableCollateral, (address(this), params.collateralVault)) + }); + + batchItems[2] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: params.vault, + value: 0, + data: abi.encodeCall( + ILiquidation.liquidate, + (params.violatorAddress, params.collateralVault, params.repayAmount, params.seizedCollateralAmount) + ) + }); + + // batchItems[3] = IEVC.BatchItem({ + // onBehalfOfAccount: address(this), + // targetContract: params.vault, + // value: 0, + // data: abi.encodeCall( + // IBorrowing.pullDebt(amount, from) + // (params.expectedRemainingCollateral, params.receiver, address(this)) + // ) + // }); + + evc.batch(batchItems); + + emit Liquidation( + params.violatorAddress, + params.vault, + params.borrowedAsset, + params.collateralAsset, + params.repayAmount, + params.seizedCollateralAmount + ); + + return true; + } + + function simulatePythUpdateAndGetAccountStatus(bytes[] calldata pythUpdateData, uint256 pythUpdateFee, address vaultAddress, address accountAddress) external payable returns (uint256 collateralValue, uint256 liabilityValue) { + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](2); + + batchItems[0] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: PYTH, + value: pythUpdateFee, + data: abi.encodeCall(IPyth.updatePriceFeeds, pythUpdateData) + }); + + batchItems[1] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: vaultAddress, + value: 0, + data: abi.encodeCall(IRiskManager.accountLiquidity, (accountAddress, true)) + }); + + (IEVC.BatchItemResult[] memory batchItemsResult,,) = evc.batchSimulation{value: pythUpdateFee}(batchItems); + + (collateralValue, liabilityValue) = abi.decode(batchItemsResult[1].result, (uint256, uint256)); + + return (collateralValue, liabilityValue); + } + + function simulatePythUpdateAndCheckLiquidation(bytes[] calldata pythUpdateData, uint256 pythUpdateFee, address vaultAddress, address liquidatorAddress, address borrowerAddress, address collateralAddress) external payable returns (uint256 maxRepay, uint256 seizedCollateral) { + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](2); + + batchItems[0] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: PYTH, + value: pythUpdateFee, + data: abi.encodeCall(IPyth.updatePriceFeeds, pythUpdateData) + }); + + batchItems[1] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: vaultAddress, + value: 0, + data: abi.encodeCall(ILiquidation.checkLiquidation, (liquidatorAddress, borrowerAddress, collateralAddress)) + }); + + (IEVC.BatchItemResult[] memory batchItemsResult,,) = evc.batchSimulation{value: pythUpdateFee}(batchItems); + + (maxRepay, seizedCollateral) = abi.decode(batchItemsResult[1].result, (uint256, uint256)); + + return (maxRepay, seizedCollateral); + } + + function simulateRedstoneUpdateAndGetAccountStatus(bytes[] calldata redstoneUpdateData, address[] calldata adapterAddresses, address vaultAddress, address accountAddress) external returns (uint256 collateralValue, uint256 liabilityValue) { + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](redstoneUpdateData.length + 1); + + for (uint256 i = 0; i < redstoneUpdateData.length; i++){ + batchItems[i] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: adapterAddresses[i], + value: 0, + data: redstoneUpdateData[i] + }); + } + + batchItems[redstoneUpdateData.length] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: vaultAddress, + value: 0, + data: abi.encodeCall(IRiskManager.accountLiquidity, (accountAddress, true)) + }); + + (IEVC.BatchItemResult[] memory batchItemsResult,,) = evc.batchSimulation(batchItems); + + (collateralValue, liabilityValue) = abi.decode(batchItemsResult[1].result, (uint256, uint256)); + + return (collateralValue, liabilityValue); + } + + function simulateRedstoneUpdateAndCheckLiquidation(bytes[] calldata redstoneUpdateData, address[] calldata adapterAddresses, address vaultAddress, address liquidatorAddress, address borrowerAddress, address collateralAddress) external payable returns (uint256 maxRepay, uint256 seizedCollateral) { + IEVC.BatchItem[] memory batchItems = new IEVC.BatchItem[](redstoneUpdateData.length + 1); + + for (uint256 i = 0; i < redstoneUpdateData.length; i++){ + batchItems[i] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: adapterAddresses[i], + value: 0, + data: redstoneUpdateData[i] + }); + } + + batchItems[redstoneUpdateData.length] = IEVC.BatchItem({ + onBehalfOfAccount: address(this), + targetContract: vaultAddress, + value: 0, + data: abi.encodeCall(ILiquidation.checkLiquidation, (liquidatorAddress, borrowerAddress, collateralAddress)) + }); + + (IEVC.BatchItemResult[] memory batchItemsResult,,) = evc.batchSimulation(batchItems); + + (maxRepay, seizedCollateral) = abi.decode(batchItemsResult[1].result, (uint256, uint256)); + + return (maxRepay, seizedCollateral); + } + + receive() external payable { + + } +} diff --git a/contracts/MockPriceOracle.sol b/contracts/MockPriceOracle.sol new file mode 100644 index 0000000..32c67f8 --- /dev/null +++ b/contracts/MockPriceOracle.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.8.0; + +import {IERC4626} from "./IEVault.sol"; + +contract MockPriceOracle { + error PriceOracle_InvalidConfiguration(); + + uint256 constant SPREAD_SCALE = 100; + uint256 spread; + mapping(address vault => address asset) resolvedVaults; + mapping(address base => mapping(address quote => uint256)) price; + + function name() external pure returns (string memory) { + return "MockPriceOracle"; + } + + function getQuote(uint256 inAmount, address base, address quote) external view returns (uint256) { + (,,, uint256 midOut) = resolveOracle(inAmount, base, quote); + return midOut; + } + + function getQuotes(uint256 inAmount, address base, address quote) + external + view + returns (uint256 bidOut, uint256 askOut) + { + (,,, uint256 midOut) = resolveOracle(inAmount, base, quote); + + if (spread > 0) { + bidOut = midOut * (100 - spread / 2) / SPREAD_SCALE; + askOut = midOut * (100 + spread / 2) / SPREAD_SCALE; + } else { + bidOut = askOut = midOut; + } + } + + ///// Mock functions + + function setSpread(uint256 newSpread) external { + spread = newSpread; + } + + function setResolvedVault(address vault, bool set) external { + address asset = set ? IERC4626(vault).asset() : address(0); + resolvedVaults[vault] = asset; + } + + function setPrice(address base, address quote, uint256 newPrice) external { + price[base][quote] = newPrice; + } + + function resolveOracle(uint256 inAmount, address base, address quote) + public + view + returns (uint256, /* resolvedAmount */ address, /* base */ address, /* quote */ uint256 /* outAmount */ ) + { + if (base == quote) return (inAmount, base, quote, inAmount); + + uint256 p = price[base][quote]; + if (p != 0) { + return (inAmount, base, quote, inAmount * p / 1e18); + } + + address baseAsset = resolvedVaults[base]; + if (baseAsset != address(0)) { + inAmount = IERC4626(base).convertToAssets(inAmount); + return resolveOracle(inAmount, baseAsset, quote); + } + + revert PriceOracle_InvalidConfiguration(); + } +} diff --git a/contracts/SwapVerifier.sol b/contracts/SwapVerifier.sol new file mode 100644 index 0000000..14efb0f --- /dev/null +++ b/contracts/SwapVerifier.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.8.0; + +import {IEVault, IERC20} from "./IEVault.sol"; + +/// @title SwapVerifier +/// @custom:security-contact security@euler.xyz +/// @author Euler Labs (https://www.eulerlabs.com/) +/// @notice Simple contract used to verify post swap conditions +/// @dev This contract is the only trusted code in the EVK swap periphery +contract SwapVerifier { + error SwapVerifier_skimMin(); + error SwapVerifier_debtMax(); + error SwapVerifier_pastDeadline(); + + /// @notice Verify results of a regular swap, when bought tokens are sent to the vault and skim for the buyer + /// @param vault The EVault to query + /// @param receiver Account to skim to + /// @param amountMin Minimum amount of assets that should be available for skim + /// @param deadline Timestamp after which the swap transaction is outdated + /// @dev Swapper contract will send bought assets to the vault in certain situations. + /// @dev Calling this function is then necessary to perform slippage check and claim the output for the buyer + function verifyAmountMinAndSkim(address vault, address receiver, uint256 amountMin, uint256 deadline) external { + if (deadline < block.timestamp) revert SwapVerifier_pastDeadline(); + if (amountMin == 0) return; + + uint256 cash = IEVault(vault).cash(); + uint256 balance = IERC20(IEVault(vault).asset()).balanceOf(vault); + + if (balance <= cash || balance - cash < amountMin) revert SwapVerifier_skimMin(); + + IEVault(vault).skim(type(uint256).max, receiver); + } + + /// @notice Verify results of a swap and repay operation, when debt is repaid down to a requested target + /// @param vault The EVault to query + /// @param account User account to query + /// @param amountMax Max amount of debt that can be held by the account + /// @param deadline Timestamp after which the swap transaction is outdated + /// @dev Swapper contract will repay debt up to a requested target amount in certain situations. + /// @dev Calling the function is then equivalent to a slippage check. + function verifyDebtMax(address vault, address account, uint256 amountMax, uint256 deadline) external view { + if (deadline < block.timestamp) revert SwapVerifier_pastDeadline(); + if (amountMax == type(uint256).max) return; + + uint256 debt = IEVault(vault).debtOf(account); + + if (debt > amountMax) revert SwapVerifier_debtMax(); + } +} diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 0000000..a20ca63 --- /dev/null +++ b/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +src = "contracts" +out = "out" +libs = ["lib"] + +remappings = [ + "forge-std/=lib/forge-std/src/" +] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 0000000..bf66061 --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit bf6606142994b1e47e2882ce0cd477c020d77623 diff --git a/pylintrc b/pylintrc new file mode 100644 index 0000000..549c92c --- /dev/null +++ b/pylintrc @@ -0,0 +1,397 @@ +# This Pylint rcfile contains a best-effort configuration to uphold the +# best-practices and style described in the Google Python style guide: +# https://google.github.io/styleguide/pyguide.html +# +# Its canonical open-source location is: +# https://google.github.io/styleguide/pylintrc + +[MAIN] + +# Files or directories to be skipped. They should be base names, not paths. +ignore=third_party + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. +ignore-patterns= + +# Pickle collected data for later comparisons. +persistent=no + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=4 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=R, + abstract-method, + apply-builtin, + arguments-differ, + attribute-defined-outside-init, + backtick, + bad-option-value, + basestring-builtin, + buffer-builtin, + c-extension-no-member, + consider-using-enumerate, + cmp-builtin, + cmp-method, + coerce-builtin, + coerce-method, + delslice-method, + div-method, + eq-without-hash, + execfile-builtin, + file-builtin, + filter-builtin-not-iterating, + fixme, + getslice-method, + global-statement, + hex-method, + idiv-method, + implicit-str-concat, + import-error, + import-self, + import-star-module-level, + input-builtin, + intern-builtin, + invalid-str-codec, + locally-disabled, + long-builtin, + long-suffix, + map-builtin-not-iterating, + misplaced-comparison-constant, + missing-function-docstring, + metaclass-assignment, + next-method-called, + next-method-defined, + no-absolute-import, + no-init, # added + no-member, + no-name-in-module, + no-self-use, + nonzero-method, + oct-method, + old-division, + old-ne-operator, + old-octal-literal, + old-raise-syntax, + parameter-unpacking, + print-statement, + raising-string, + range-builtin-not-iterating, + raw_input-builtin, + rdiv-method, + reduce-builtin, + relative-import, + reload-builtin, + round-builtin, + setslice-method, + signature-differs, + standarderror-builtin, + suppressed-message, + sys-max-int, + trailing-newlines, + unichr-builtin, + unicode-builtin, + unnecessary-pass, + unpacking-in-except, + useless-else-on-loop, + useless-suppression, + using-cmp-argument, + wrong-import-order, + xrange-builtin, + zip-builtin-not-iterating, + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[BASIC] + +# Good variable names which should always be accepted, separated by a comma +good-names=main,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl + +# Regular expression matching correct function names +function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ + +# Regular expression matching correct variable names +variable-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct constant names +const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct attribute names +attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ + +# Regular expression matching correct argument names +argument-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=^_?[A-Z][a-zA-Z0-9]*$ + +# Regular expression matching correct module names +module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$ + +# Regular expression matching correct method names +method-rgx=(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=12 + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=(?x)( + ^\s*(\#\ )??$| + ^\s*(from\s+\S+\s+)?import\s+.+$) + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=yes + +# Maximum number of lines in a module +max-module-lines=99999 + +# String used as indentation unit. The internal Google style guide mandates 2 +# spaces. Google's externaly-published style guide says 4, consistent with +# PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google +# projects (like TensorFlow). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=TODO + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=yes + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging,absl.logging,tensorflow.io.logging + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub, + TERMIOS, + Bastion, + rexec, + sets + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant, absl + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls, + class_ + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs diff --git a/redstone_script/getRedstonePayload.js b/redstone_script/getRedstonePayload.js new file mode 100644 index 0000000..0dda391 --- /dev/null +++ b/redstone_script/getRedstonePayload.js @@ -0,0 +1,60 @@ +import { DataPackagesWrapper, DataServiceWrapper } from "@redstone-finance/evm-connector"; +import { RedstonePayload } from "@redstone-finance/protocol"; +import { parseAbi, hexToString, encodeFunctionData, encodePacked } from "viem"; + +const dataServiceId = "redstone-primary-prod"; +const redstoneCoreOracleAbi = parseAbi([ + "function updatePrice(uint48 timestamp)", +]); + +const getRedstonePayload = async (feedIds) => { + const feedIdStrings = feedIds.map((feedId) => { + return hexToString(feedId, { size: 32 }); + }); + + const dataServiceWrapper = new DataServiceWrapper({ + dataServiceId, + dataPackagesIds: feedIdStrings, + uniqueSignersCount: 3, + }); + + const allDataPackages = await dataServiceWrapper.getDataPackagesForPayload(); + + // console.log(allDataPackages) + + return feedIdStrings.map((feedIdString) => { + const adapterDataPackages = allDataPackages.filter( + ({ dataPackage }) => dataPackage.dataPackageId === feedIdString + ); + + const timestamps = adapterDataPackages.map( + ({ dataPackage }) => dataPackage.timestampMilliseconds + ); + + const payloadTimestamp = timestamps[0] / 1000; + + const redstonePayload = RedstonePayload.prepare( + adapterDataPackages, + dataServiceWrapper.getUnsignedMetadata() + ); + + const updatePriceCalldata = encodeFunctionData({ + abi: redstoneCoreOracleAbi, + functionName: "updatePrice", + args: [payloadTimestamp], + }); + + const data = encodePacked( + ["bytes", "bytes"], + [updatePriceCalldata, redstonePayload] + ); + + return { + description: `Update RedStone Core price for ${feedIdString}`, + data, + }; + }); +}; +const feedIds = JSON.parse(process.argv[2]); +const results = await getRedstonePayload(feedIds); +console.log(JSON.stringify(results, null, 2)); \ No newline at end of file diff --git a/redstone_script/package-lock.json b/redstone_script/package-lock.json new file mode 100644 index 0000000..d833090 --- /dev/null +++ b/redstone_script/package-lock.json @@ -0,0 +1,1431 @@ +{ + "name": "redstone_script", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redstone_script", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@redstone-finance/evm-connector": "^0.6.2", + "@redstone-finance/protocol": "^0.6.2", + "viem": "^2.21.12" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", + "license": "MIT" + }, + "node_modules/@chainlink/contracts": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.6.1.tgz", + "integrity": "sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ==", + "license": "MIT", + "dependencies": { + "@eth-optimism/contracts": "^0.5.21", + "@openzeppelin/contracts": "~4.3.3", + "@openzeppelin/contracts-upgradeable": "^4.7.3", + "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" + } + }, + "node_modules/@chainlink/contracts/node_modules/@openzeppelin/contracts": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", + "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==", + "license": "MIT" + }, + "node_modules/@eth-optimism/contracts": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.5.40.tgz", + "integrity": "sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==", + "license": "MIT", + "dependencies": { + "@eth-optimism/core-utils": "0.12.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0" + }, + "peerDependencies": { + "ethers": "^5" + } + }, + "node_modules/@eth-optimism/core-utils": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz", + "integrity": "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==", + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bufio": "^1.0.7", + "chai": "^4.3.4" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.6.tgz", + "integrity": "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA==", + "license": "MIT" + }, + "node_modules/@openzeppelin/contracts-v0.7": { + "name": "@openzeppelin/contracts", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", + "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==", + "license": "MIT" + }, + "node_modules/@redstone-finance/evm-connector": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redstone-finance/evm-connector/-/evm-connector-0.6.2.tgz", + "integrity": "sha512-bETkpZuc9huSbPPhJ1FEQNFsNlWMez4KCC/geEZLVBus0odRlaQz5hNEiHQS7B0bNxoaOKkOczF6Uq/YeOnoFA==", + "license": "MIT", + "dependencies": { + "@chainlink/contracts": "^0.6.1", + "@openzeppelin/contracts": "^4.8.1", + "@redstone-finance/protocol": "0.6.2", + "@redstone-finance/sdk": "0.6.2", + "@redstone-finance/utils": "0.6.2", + "axios": "^1.6.2", + "ethers": "^5.7.2" + } + }, + "node_modules/@redstone-finance/oracles-smartweave-contracts": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redstone-finance/oracles-smartweave-contracts/-/oracles-smartweave-contracts-0.6.2.tgz", + "integrity": "sha512-lXNPgXDKAOl5uShB/nZ9WUDcLWKuq4OZYumPR6HqckEYHGMULIiI2tB2egZl8SVWcpkBZ5RFs47j9bZ22pkm2g==", + "license": "MIT" + }, + "node_modules/@redstone-finance/protocol": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redstone-finance/protocol/-/protocol-0.6.2.tgz", + "integrity": "sha512-s5rQNfrAH4A7aObOMZ4G6w/fhxgjoa2KBKqmw9d7pizl2Edzxp1ctrjeKngSPmBRyZcrXPyTiX2Wpwpze2mqxg==", + "license": "MIT", + "dependencies": { + "decimal.js": "^10.4.3", + "ethers": "^5.7.2" + } + }, + "node_modules/@redstone-finance/sdk": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redstone-finance/sdk/-/sdk-0.6.2.tgz", + "integrity": "sha512-c4mXLYGK7k2zo1t+0biitAZbXdIiex2K9zVQMuo/rrBHjUOdVf/CRKRk7DDG1ZyFZNZV2RWo2FGKAMlbTgaSog==", + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/strings": "^5.7.0", + "@redstone-finance/oracles-smartweave-contracts": "0.6.2", + "@redstone-finance/protocol": "0.6.2", + "@redstone-finance/utils": "0.6.2", + "@types/lodash": "^4.14.195", + "axios": "^1.6.2", + "ethers": "^5.7.2", + "lodash": "^4.17.21", + "zod": "^3.22.4" + } + }, + "node_modules/@redstone-finance/utils": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@redstone-finance/utils/-/utils-0.6.2.tgz", + "integrity": "sha512-VRrop0uwgh0jc5QHjbDCO7kdG6qbY7iem6tFBYB2JfdrT5N8re42hdjbdiMoWbXJFqbjmAPvsB4JPPGQhVC6IA==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.2", + "consola": "^2.15.3", + "decimal.js": "^10.4.3", + "ethers": "^5.7.2", + "zod": "^3.22.4" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "license": "MIT" + }, + "node_modules/abitype": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.5.tgz", + "integrity": "sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "license": "MIT" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/bufio": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.1.tgz", + "integrity": "sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/isows": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.4.tgz", + "integrity": "sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/viem": { + "version": "2.21.12", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.21.12.tgz", + "integrity": "sha512-yPZulbPdoDnuB8Gm2m+Qc9Mjgl6gC1YgNU6zcO+C8XZNYwaCNE6mokPiy30m8o5I1XkfvMc35jMmtT1zCb8yxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.4.0", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.4.0", + "abitype": "1.0.5", + "isows": "1.0.4", + "webauthn-p256": "0.0.5", + "ws": "8.17.1" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "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/webauthn-p256": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/webauthn-p256/-/webauthn-p256-0.0.5.tgz", + "integrity": "sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/redstone_script/package.json b/redstone_script/package.json new file mode 100644 index 0000000..1576e7d --- /dev/null +++ b/redstone_script/package.json @@ -0,0 +1,18 @@ +{ + "name": "redstone_script", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "@redstone-finance/evm-connector": "^0.6.2", + "@redstone-finance/protocol": "^0.6.2", + "viem": "^2.21.12" + }, + "type": "module" +} diff --git a/redstone_script/testRedstone.py b/redstone_script/testRedstone.py new file mode 100644 index 0000000..7af820e --- /dev/null +++ b/redstone_script/testRedstone.py @@ -0,0 +1,52 @@ +import subprocess +import json +from app.liquidation.utils import create_contract_instance, load_config + +config = load_config() + +def call_node_script(feed_ids): + feed_ids_json = json.dumps(feed_ids) + print("Feed IDs JSON:", feed_ids_json) + + result = subprocess.run( + ["node", "getRedstonePayload.js", feed_ids_json], + capture_output=True, + text=True, + check=True + ) + + if result.returncode != 0: + print("Error running script:", result.stderr) + return None + + print("Script stdout:", result.stdout) + print("Script stderr:", result.stderr) + + if not result.stdout: + print("No output from script") + return None + + output = json.loads(result.stdout) + + return output + +def get_feed_ids(oracle_addresses): + feed_ids = [] + for oracle_address in oracle_addresses: + oracle = create_contract_instance(oracle_address, config.ORACLE_ABI_PATH) + + feed_id = '0x' + oracle.functions.feedId().call().hex() + feed_ids.append(feed_id) + return feed_ids + +oracle_addresses = ["0xdfe70cD7FB6BbD9a519494eD6595A2a9AfAffCBF", "0x5B447ba6B204A8efDcc5b8f9FDf7361F332dC090"] +feed_ids = get_feed_ids(oracle_addresses) + +print("Feed IDs: ", feed_ids) + +processed_data = call_node_script(feed_ids) + +print("Processed data: ", processed_data) + +for data in processed_data: + print("Stripped payload: ", data['data']) diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..83fbb69 --- /dev/null +++ b/remappings.txt @@ -0,0 +1 @@ +forge-std/=lib/forge-std/src/ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4265688 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,65 @@ +aiodns==3.2.0 +aiohttp==3.9.5 +aiosignal==1.3.1 +astroid==3.2.3 +attrs==23.2.0 +bitarray==2.9.2 +blinker==1.8.2 +Brotli==1.1.0 +certifi==2024.6.2 +cffi==1.17.0 +charset-normalizer==3.3.2 +ckzg==1.0.2 +click==8.1.7 +cytoolz==0.12.3 +dill==0.3.8 +eth-account==0.11.2 +eth-hash==0.7.0 +eth-keyfile==0.8.1 +eth-keys==0.5.1 +eth-rlp==1.0.1 +eth-typing==4.2.3 +eth-utils==4.1.1 +eth_abi==5.1.0 +Flask==3.0.3 +Flask-Cors==5.0.0 +frozenlist==1.4.1 +gunicorn==23.0.0 +hexbytes==0.3.1 +idna==3.7 +isort==5.13.2 +itsdangerous==2.2.0 +Jinja2==3.1.4 +jsonschema==4.22.0 +jsonschema-specifications==2023.12.1 +lru-dict==1.2.0 +MarkupSafe==2.1.5 +mccabe==0.7.0 +multidict==6.0.5 +numpy==2.0.0 +packaging==23.2 +parsimonious==0.10.0 +platformdirs==4.2.2 +protobuf==5.27.0 +py-solc-x==2.0.3 +pycares==4.4.0 +pycparser==2.22 +pycryptodome==3.20.0 +pylint==3.2.5 +python-dotenv==1.0.1 +pyunormalize==15.1.0 +PyYAML==6.0.1 +referencing==0.35.1 +regex==2024.5.15 +requests==2.32.3 +rlp==4.0.1 +rpds-py==0.18.1 +solc-select==1.0.4 +tomlkit==0.13.0 +toolz==0.12.1 +typing_extensions==4.12.1 +urllib3==2.2.1 +web3==6.19.0 +websockets==12.0 +Werkzeug==3.0.3 +yarl==1.9.4 diff --git a/test/LiquidationSetupWithVaultCreated.sol b/test/LiquidationSetupWithVaultCreated.sol new file mode 100644 index 0000000..fa6f8ca --- /dev/null +++ b/test/LiquidationSetupWithVaultCreated.sol @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.8.24; + +import {Test, console} from "forge-std/Test.sol"; +import {Script} from "forge-std/Script.sol"; + +import {IEVault} from "../contracts/IEVault.sol"; +import {IEVC} from "../contracts/IEVC.sol"; +import {IERC20} from "../contracts/IEVault.sol"; + +import {MockPriceOracle} from "../contracts/MockPriceOracle.sol"; + +contract LiquidationSetup is Test, Script { + address constant USDC_VAULT = 0x577e289F663A4E29c231135c09d6a0713ce7AAff; + address constant USDC = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831; + + address constant DAI_VAULT = 0xF67F9B1042A7f419c2C0259C983FB1f75f981fD4; + address constant DAI = 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1; + + address constant EVC_ADDRESS = 0xE45Ee4046bD755330D555dFe4aDA7839a3eEb926; + address constant LIQUIDATOR_CONTRACT_ADDRESS = 0xA8A46596a7B17542d2cf6993FC61Ea0CBb4474c1; + + address constant profitReceiver = 0x140556939f9Cfa711078DeFBb01B3e51A53Bc464; + + address depositor; + uint256 depositorPrivateKey; + address borrower; + uint256 borrowerPrivateKey; + address liquidator; + uint256 liquidatorPrivateKey; + + IEVault usdc_vault; + IEVault dai_vault; + + IERC20 usdc; + IERC20 dai; + + IEVC evc; + + function run() public { + evc = IEVC(EVC_ADDRESS); + + usdc_vault = IEVault(USDC_VAULT); + usdc = IERC20(USDC); + + dai_vault = IEVault(DAI_VAULT); + dai = IERC20(DAI); + + depositorPrivateKey = vm.envUint("DEPOSITOR_PRIVATE_KEY"); + depositor = vm.addr(depositorPrivateKey); + + borrowerPrivateKey = vm.envUint("BORROWER_PRIVATE_KEY"); + borrower = vm.addr(borrowerPrivateKey); + + liquidatorPrivateKey = vm.envUint("LIQUIDATOR_PRIVATE_KEY"); + liquidator = vm.addr(liquidatorPrivateKey); + + console.log("Current state:"); + logState(); + + // depositorDepositInVaults(); + // console.log("After depositing in vaults:"); + // logState(); + + // borrowerDepositAndEnableCollateralAndController(); + // console.log("After borrower deposit in vaults:"); + // logState(); + + // borrowerBorrowUSDC(); + // console.log("After borrower borrow:"); + // logState(); + + // depositorDepositAndTransferToLiquidatorContract(); + // console.log("After depositor deposit in liquidator contract:"); + // logState(); + } + + function depositorDepositInVaults() internal { + vm.startBroadcast(depositorPrivateKey); + + usdc.approve(address(usdc_vault), type(uint256).max); + dai.approve(address(dai_vault), type(uint256).max); + + usdc_vault.deposit(1e6, depositor); + dai_vault.deposit(1e18, depositor); + + vm.stopBroadcast(); + } + + function borrowerDepositAndEnableCollateralAndController() internal { + vm.startBroadcast(borrowerPrivateKey); + + dai.approve(address(dai_vault), type(uint256).max); + dai_vault.deposit(1e18, borrower); + + evc.enableCollateral(borrower, address(dai_vault)); + evc.enableController(borrower, address(usdc_vault)); + + vm.stopBroadcast(); + } + + function borrowerBorrowUSDC() internal { + vm.startBroadcast(borrowerPrivateKey); + + usdc_vault.borrow(5e5, borrower); + + vm.stopBroadcast(); + } + + function depositorDepositAndTransferToLiquidatorContract() internal { + vm.startBroadcast(depositorPrivateKey); + usdc_vault.deposit(1e6, LIQUIDATOR_CONTRACT_ADDRESS); + dai_vault.deposit(1e18, LIQUIDATOR_CONTRACT_ADDRESS); + vm.stopBroadcast(); + } + + function logState() internal view { + console.log("Account States:"); + console.log("Depositor: ", depositor); + console.log("USDC Vault balance: ", usdc_vault.balanceOf(depositor)); + console.log("USDC balance: ", usdc.balanceOf(depositor)); + console.log("DAI Vault balance: ", dai_vault.balanceOf(depositor)); + console.log("DAI balance: ", dai.balanceOf(depositor)); + console.log("--------------------"); + console.log("Borrower: ", borrower); + console.log("USDC Vault balance: ", usdc_vault.balanceOf(borrower)); + console.log("USDC borrow: ", usdc_vault.debtOf(borrower)); + console.log("USDC balance: ", usdc.balanceOf(borrower)); + console.log("DAI Vault balance: ", dai_vault.balanceOf(borrower)); + console.log("DAI borrow: ", dai_vault.debtOf(borrower)); + console.log("DAI balance: ", dai.balanceOf(borrower)); + console.log("--------------------"); + console.log("Liquidator: ", liquidator); + console.log("USDC Vault balance: ", usdc_vault.balanceOf(liquidator)); + console.log("USDC balance: ", usdc.balanceOf(liquidator)); + console.log("DAI Vault balance: ", dai_vault.balanceOf(liquidator)); + console.log("DAI balance: ", dai.balanceOf(liquidator)); + console.log("--------------------"); + console.log("Profit Receiver: ", profitReceiver); + console.log("USDC Vault balance: ", usdc_vault.balanceOf(profitReceiver)); + console.log("USDC balance: ", usdc.balanceOf(profitReceiver)); + console.log("DAI Vault balance: ", dai_vault.balanceOf(profitReceiver)); + console.log("DAI balance: ", dai.balanceOf(profitReceiver)); + console.log("--------------------"); + console.log("Liquidator Contract: ", LIQUIDATOR_CONTRACT_ADDRESS); + console.log("USDC Vault balance: ", usdc_vault.balanceOf(LIQUIDATOR_CONTRACT_ADDRESS)); + console.log("USDC borrow: ", usdc_vault.debtOf(LIQUIDATOR_CONTRACT_ADDRESS)); + console.log("USDC balance: ", usdc.balanceOf(LIQUIDATOR_CONTRACT_ADDRESS)); + console.log("DAI Vault balance: ", dai_vault.balanceOf(LIQUIDATOR_CONTRACT_ADDRESS)); + console.log("DAI borrow: ", dai_vault.debtOf(LIQUIDATOR_CONTRACT_ADDRESS)); + console.log("DAI balance: ", dai.balanceOf(LIQUIDATOR_CONTRACT_ADDRESS)); + console.log("----------------------------------------"); + console.log(" "); + console.log("Vault States:"); + console.log("USDC Vault:"); + console.log("Total Supply: ", usdc_vault.totalSupply()); + console.log("Total Assets: ", usdc_vault.totalAssets()); + console.log("Total Borrow: ", usdc_vault.totalBorrows()); + console.log("--------------------"); + console.log("DAI Vault:"); + console.log("Total Supply: ", dai_vault.totalSupply()); + console.log("Total Assets: ", dai_vault.totalAssets()); + console.log("Total Borrow: ", dai_vault.totalBorrows()); + console.log("----------------------------------------"); + } +} diff --git a/test/TestLiquidator.t.sol b/test/TestLiquidator.t.sol new file mode 100644 index 0000000..a9bf13c --- /dev/null +++ b/test/TestLiquidator.t.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +pragma solidity ^0.8.24; + +import {Test, console} from "forge-std/Test.sol"; +import {Liquidator} from "../contracts/Liquidator.sol"; + + +contract LiquidatorTest is Test { + address constant LIQUIDATOR_CONTRACT_ADDRESS = 0x8d244058D946801bf39df29F1F67C7A4b3201521; + address constant VAULT = 0xce45EF0414dE3516cAF1BCf937bF7F2Cf67873De; + address constant ACCOUNT = 0xA5f0f68dCc5bE108126d79ded881ef2993841c2f; + + + Liquidator liquidator; + + function setUp() public { + + liquidator = Liquidator(payable(LIQUIDATOR_CONTRACT_ADDRESS)); + } + + function testLiquidatorWithPythUpdate() public { + bytes[] memory pythUpdateData = new bytes[](1); + pythUpdateData[0] = hex"504e41550100000003b801000000040d00430b259b8339a0ce13437f029b730172832c61413ffb0423a1d775b6a3ed7cc959e91999253cd6ddeee89762692fc8514a8b694dd94a3321013820c7e3d012670002083c46ff3abf42f65b641554b7a61e5f882c27dd321f47239c6fe779be3ba68c31c67e255425fe0f77fb8b55fa81b46956b14ba493f6f39339335196757dadc40103cdc59afee22cd50f9889a8c6d614e4ce971dfff1865e5ea697417f6c2071df3a39f9ab58e7996cc10f95dd68c9b0eff64f264cd2e621ef0ce9d879aa6c46e24001044ffad84e81d8fd8fa70706ad8217c88c18ef9219a5b171f193bf23a577b395460e506456048c70fad2d12b2718141eb91efe0efcb0ef02932a9576ef7375507a010603b2781fbc65a9476e656cc95af4a3046e82f97c3ffe80d998bbed068c0c0a3d43bac0d6cbcfb44a5aaec842536c69b2cae69b9d6400edf497558e0bf838e7ad0008f58f6f4382b3e299d275d2864b7ab2fe282281d3d4587b3a2229fabf05997549681ca791ea1289a5fd8783868960c269d3a6346b39775d1ada91cadf130c939b000aabae762ea9f7974936a314d291643538454bb29077a940f95a4d0bb650a7dcb76c3fd96385591131013103cc0cb1b8646a31ec8a1ae46db0e96d9bcac696a121000c19237de2f6422cad69ee0292d7c0f435e42607fbcf581db28f2f7c2a57439dd30178ef9af907643dc5f23496dec77eadad3c1903b2da6f008ad1589eacf388f0010de7ebf559918d7bbd82ec20469cfb6e74b89013ba8f3bd549dc5c08e5f1b68d334cd4544da7dd5fc716aefdf53c494de9aa1eb3cd350f931406bc2f237fc8c11c010ec4111361969a29ce40a78a2261454fe8565e1ba3341009d4c186e13f9d749809657cceb6dcf802818c397f3e6a4e1530556ff9b3448d62720d9b9eb2cdc7f3be010febce9984e3d65aff66b8119bc56715a2a077def83f80b1fbd8289113feb89e3873c7839951ecb3512a92864222f0a720f6c2b0d6ec7c721d8efed70342a6fbaa00109e3bda4c1b85188ae93f73e47d17900ece6a2a4112bafe780b150cdaea72e5bc79caded35061933d20e9021f4c5e85875352d8df2403359476531089aebd6f060112fc281d4e21f3ebb87afd6d287df00c003e203864d61310f7eefec85641ae69f030d3c531185ec4f298719803cd77f21ba514384e0d90da866f603c8883dc45c90066eaa75400000000001ae101faedac5851e32b9b23b5f9411a8c2bac4aae3ed4dd7b811dd1a72ea4aa710000000004d69e860141555756000000000009e223b7000027103d7fb8d6236feea98baed2249f8fdef4c6f9e54b03005500ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c00000000068997fd000000000007c17ffffffff80000000066eaa7540000000066eaa754000000000689a9d8000000000005d6e20adf469931287004c1a28479fdc444ba2c753fd68852e371410edd9d43c71dbae11408cdf5bb62c0b241ef91dff02756a32140d8911f79c3e5381816c62342a9521b993d60213ed22ffa6e6c51d48089e8599d63d61822c6022b9985b08c6ab16d3e9d516ae4763f50d171273f73e4b82f843036f8edc0959de902cb4040d3a443a392e05b209fa587c949052bab36f97645427f48d2007f01626e1568e46f022e475ccb534b57ae5ad2e2088538fef5c5a46045be547c6d2a28b1a32f2eeea61de902d151f0fb11ee0055006ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d0000000005f44b850000000000021abffffffff80000000066eaa7540000000066eaa7540000000005f4550a0000000000020e150a626ade5a18d656ebfa72b93469413d7df85d2c6ac0b7f1b0b1bb433ca37a943baf94e3cb44cab57e406883444fef27da7caa392bdbdcc8f8ab9b59c0ea8159957eab38bcd0989c9476aefaeee7ec1caceeeb96b97e9aee5d0f5cbf218577094aca5c18d110f636c028beba38ddf8c1f81fb6b90148bdaac5f1be3cefbfbeb2f436f426bef95eedffc8e3ca55e9b46f5744f1856250e8d4f1ae13b8f4259fe1741f7b04f34b6915613be866411873e091287dc7b3547c6d2a28b1a32f2eeea61de902d151f0fb11ee005500e393449f6aff8a4b6d3e1165a7c9ebec103685f3b41e60db4277b5b6d10e732600000000064b1420000000000007f0cafffffff80000000066eaa7540000000066eaa75400000000064b1a3f000000000007ce760a1f1a8f3094cdc0357e16e9209615823efeae4141923f98878c0264198f28da4e4a5a24886b746c0293e2d2f6f806e47781526271de6de2b15215daaa9b7e9fc2be6896d1efcb5fa0d685c400c6d276403ea9cc126dc6240cb3de7c34d1a400daa2b2584333ef6a33a1085272c18dc7bd1d83877e5ee7a4ff3e9b7a3ca8d0ac7436e0d4ef07b615285ecfc5c7ab36f97645427f48d2007f01626e1568e46f022e475ccb534b57ae5ad2e2088538fef5c5a46045be547c6d2a28b1a32f2eeea61de902d151f0fb11ee"; + uint256 updateFee = 3; + (uint256 collateral, uint256 liability) = liquidator.simulatePythUpdateAndGetAccountStatus{value: updateFee}(pythUpdateData, updateFee, VAULT, ACCOUNT); + + console.log(collateral, liability); + } +} diff --git a/test/get_ids.py b/test/get_ids.py new file mode 100644 index 0000000..6a7141a --- /dev/null +++ b/test/get_ids.py @@ -0,0 +1,32 @@ +from app.liquidation.utils import load_config, create_contract_instance +from app.liquidation.liquidation_bot import Vault +test_vault = Vault("0xce45EF0414dE3516cAF1BCf937bF7F2Cf67873De") +config = load_config() + +def get_feed_ids(vault): + oracle_address = vault.oracle_address + oracle = create_contract_instance(oracle_address, config.ORACLE_ABI_PATH) + + unit_of_account = vault.unit_of_account + + collateral_vault_list = vault.get_ltv_list() + asset_list = [Vault(collateral_vault).underlying_asset_address for collateral_vault in collateral_vault_list] + + feed_ids = [] + asset_list.append(vault.underlying_asset_address) + + for asset in asset_list: + print("Collateral:", asset) + configured_oracle_address = oracle.functions.getConfiguredOracle(asset, unit_of_account).call() + configured_oracle = create_contract_instance(configured_oracle_address, config.ORACLE_ABI_PATH) + + try: + configured_oracle_name = configured_oracle.functions.name().call() + except Exception as ex: + continue + if configured_oracle_name == "PythOracle": + feed_ids.append(configured_oracle.functions.feedId().call().hex()) + + return feed_ids + +print(get_feed_ids(test_vault)) \ No newline at end of file diff --git a/test/oracle_test.py b/test/oracle_test.py new file mode 100644 index 0000000..10d315f --- /dev/null +++ b/test/oracle_test.py @@ -0,0 +1,3 @@ +from app.liquidation.utils import get_eth_usd_quote + +print(get_eth_usd_quote()) \ No newline at end of file diff --git a/test/pyth_test.py b/test/pyth_test.py new file mode 100644 index 0000000..e8d5988 --- /dev/null +++ b/test/pyth_test.py @@ -0,0 +1,54 @@ +from app.liquidation.utils import make_api_request, load_config, create_contract_instance +from web3 import Web3 + +pyth_url = "https://hermes.pyth.network/v2/" + +headers = {} + +price_update_input_url = pyth_url + "updates/price/latest?" + +# feeds = ["ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c", +# "6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d", +# "e393449f6aff8a4b6d3e1165a7c9ebec103685f3b41e60db4277b5b6d10e7326"] + +feeds = ['ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c', '6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d', 'e393449f6aff8a4b6d3e1165a7c9ebec103685f3b41e60db4277b5b6d10e7326', 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a'] + + +print(feeds) + +for feed in feeds: + price_update_input_url += "ids[]=" + feed + "&" + +price_update_input_url = price_update_input_url[:-1] + +return_data = make_api_request(price_update_input_url, {}, {}) + +update_data = "0x" + return_data["binary"]["data"][0] + +config = load_config() + +pyth = create_contract_instance(config.PYTH, config.PYTH_ABI_PATH) + +update_fee = pyth.functions.getUpdateFee([update_data]).call() + +print(update_fee) + +liquidator = create_contract_instance(config.LIQUIDATOR_CONTRACT, config.LIQUIDATOR_ABI_PATH) + +print(liquidator.functions.PYTH().call()) +print(liquidator.functions.evcAddress().call()) + +vault_address = Web3.to_checksum_address("0xce45EF0414dE3516cAF1BCf937bF7F2Cf67873De") +account_address = Web3.to_checksum_address("0xA5f0f68dCc5bE108126d79ded881ef2993841c2f") + +vault = create_contract_instance(vault_address, config.EVAULT_ABI_PATH) + +print("update data: ", update_data) + +result = liquidator.functions.simulate_pyth_update_and_get_account_status( + [update_data], update_fee, vault_address, account_address + ).call( + {"value": update_fee} + ) + +print(result) \ No newline at end of file