{
  "address": "0x99cf6EA7bCCCc53B11209Dc32432a7427DA906E9",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_flashStrategyFactory",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "InvalidPid",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidTimestamp",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        }
      ],
      "name": "AddPool",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "weightPoints",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "totalWeightPoints",
          "type": "uint256"
        }
      ],
      "name": "UpdateWeight",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        }
      ],
      "name": "addPool",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "checkpoint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "flashStrategyFactory",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        }
      ],
      "name": "relativeWeight",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "relativeWeightAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalWeightPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "totalWeightPointsAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalWeightPointsLength",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "points",
          "type": "uint256"
        }
      ],
      "name": "updateWeight",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        }
      ],
      "name": "weightPoints",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "weightPointsAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "pid",
          "type": "uint256"
        }
      ],
      "name": "weightPointsLength",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x2a9a5d632f484cf05bce53036befc63cc4db467b119b596c948ce16023887dcb",
  "receipt": {
    "to": null,
    "from": "0x612ef87bfcd858687160294b0eFFACA0CBA342E2",
    "contractAddress": "0x99cf6EA7bCCCc53B11209Dc32432a7427DA906E9",
    "transactionIndex": 124,
    "gasUsed": "710734",
    "logsBloom": "0x00000000000000000000000040010000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000001000000000800000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000",
    "blockHash": "0x2dd522fa5884d15a3be24aaf9ab0ef1bab4f637e26bd48ee4c8601f9c0da0350",
    "transactionHash": "0x2a9a5d632f484cf05bce53036befc63cc4db467b119b596c948ce16023887dcb",
    "logs": [
      {
        "transactionIndex": 124,
        "blockNumber": 16377385,
        "transactionHash": "0x2a9a5d632f484cf05bce53036befc63cc4db467b119b596c948ce16023887dcb",
        "address": "0x99cf6EA7bCCCc53B11209Dc32432a7427DA906E9",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x000000000000000000000000612ef87bfcd858687160294b0effaca0cba342e2"
        ],
        "data": "0x",
        "logIndex": 298,
        "blockHash": "0x2dd522fa5884d15a3be24aaf9ab0ef1bab4f637e26bd48ee4c8601f9c0da0350"
      }
    ],
    "blockNumber": 16377385,
    "cumulativeGasUsed": "11267982",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x77b8E6e577fd3e90553dbF205D3854a649414741"
  ],
  "numDeployments": 2,
  "solcInputHash": "faf6ddc5e64ced0d96f36629aee337fd",
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_flashStrategyFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidPid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTimestamp\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"AddPool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weightPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalWeightPoints\",\"type\":\"uint256\"}],\"name\":\"UpdateWeight\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"addPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"checkpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"flashStrategyFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"relativeWeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"relativeWeightAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalWeightPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"totalWeightPointsAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalWeightPointsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"points\",\"type\":\"uint256\"}],\"name\":\"updateWeight\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"weightPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"weightPointsAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"weightPointsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FSushiKitchen.sol\":\"FSushiKitchen\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/FSushiKitchen.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.17;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"./interfaces/IFSushiKitchen.sol\\\";\\nimport \\\"./interfaces/IFlashStrategySushiSwapFactory.sol\\\";\\nimport \\\"./libraries/Snapshots.sol\\\";\\n\\ncontract FSushiKitchen is Ownable, IFSushiKitchen {\\n    using Snapshots for Snapshots.Snapshot[];\\n\\n    uint256 internal constant BASE = 1e18;\\n\\n    address public immutable override flashStrategyFactory;\\n\\n    Snapshots.Snapshot[] internal _totalWeightPoints;\\n    mapping(uint256 => Snapshots.Snapshot[]) internal _weightPoints; // pid -> snapshots\\n\\n    constructor(address _flashStrategyFactory) {\\n        flashStrategyFactory = _flashStrategyFactory;\\n    }\\n\\n    function totalWeightPointsLength() external view override returns (uint256) {\\n        return _totalWeightPoints.size();\\n    }\\n\\n    function weightPointsLength(uint256 pid) external view override returns (uint256) {\\n        return _weightPoints[pid].size();\\n    }\\n\\n    function totalWeightPoints() external view override returns (uint256) {\\n        return _totalWeightPoints.lastValue();\\n    }\\n\\n    function weightPoints(uint256 pid) external view override returns (uint256) {\\n        return _weightPoints[pid].lastValue();\\n    }\\n\\n    function totalWeightPointsAt(uint256 timestamp) external view override returns (uint256) {\\n        return _totalWeightPoints.valueAt(timestamp);\\n    }\\n\\n    function weightPointsAt(uint256 pid, uint256 timestamp) external view override returns (uint256) {\\n        return _weightPoints[pid].valueAt(timestamp);\\n    }\\n\\n    function relativeWeight(uint256 pid) external view override returns (uint256) {\\n        uint256 totalPoints = _totalWeightPoints.lastValue();\\n        if (totalPoints == 0) return 0;\\n\\n        uint256 points = _weightPoints[pid].lastValue();\\n        return (points * BASE) / totalPoints;\\n    }\\n\\n    function relativeWeightAt(uint256 pid, uint256 timestamp) external view override returns (uint256) {\\n        uint256 totalPoints = _totalWeightPoints.valueAt(timestamp);\\n        if (totalPoints == 0) return 0;\\n\\n        uint256 points = _weightPoints[pid].valueAt(timestamp);\\n        return (points * BASE) / totalPoints;\\n    }\\n\\n    function addPool(uint256 pid) external override {\\n        address strategy = IFlashStrategySushiSwapFactory(flashStrategyFactory).getFlashStrategySushiSwap(pid);\\n        if (strategy == address(0)) revert InvalidPid();\\n\\n        emit AddPool(pid);\\n\\n        _updateWeight(pid, 100e18);\\n    }\\n\\n    function updateWeight(uint256 pid, uint256 points) external override onlyOwner {\\n        if (_weightPoints[pid].size() == 0) revert InvalidPid();\\n\\n        _updateWeight(pid, points);\\n    }\\n\\n    function _updateWeight(uint256 pid, uint256 points) internal {\\n        uint256 prev = _weightPoints[pid].lastValue();\\n        _weightPoints[pid].append(points);\\n        uint256 totalPoints = _totalWeightPoints.lastValue() + points - prev;\\n        _totalWeightPoints.append(totalPoints);\\n\\n        emit UpdateWeight(pid, points, totalPoints);\\n    }\\n\\n    function checkpoint(uint256) external override {\\n        // Empty: for future compatibility\\n    }\\n}\\n\",\"keccak256\":\"0x6f91069853590add666b026db510292d7a2a3edc287faf13b1825fb64b842f2d\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IFSushiKitchen.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\ninterface IFSushiKitchen {\\n    error InvalidPid();\\n\\n    event AddPool(uint256 indexed pid);\\n    event UpdateWeight(uint256 indexed pid, uint256 weightPoints, uint256 totalWeightPoints);\\n\\n    function flashStrategyFactory() external view returns (address);\\n\\n    function totalWeightPointsLength() external view returns (uint256);\\n\\n    function weightPointsLength(uint256 pid) external view returns (uint256);\\n\\n    function totalWeightPoints() external view returns (uint256);\\n\\n    function weightPoints(uint256 pid) external view returns (uint256);\\n\\n    function totalWeightPointsAt(uint256 timestamp) external view returns (uint256);\\n\\n    function weightPointsAt(uint256 pid, uint256 timestamp) external view returns (uint256);\\n\\n    function relativeWeight(uint256 pid) external view returns (uint256);\\n\\n    function relativeWeightAt(uint256 pid, uint256 timestamp) external view returns (uint256);\\n\\n    function addPool(uint256 pid) external;\\n\\n    function updateWeight(uint256 pid, uint256 points) external;\\n\\n    function checkpoint(uint256 pid) external;\\n}\\n\",\"keccak256\":\"0x602da4746016dea892573a29a51d473deaf6789e2a464b2f6dbe98c7faf361a1\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IFlashStrategySushiSwapFactory.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\ninterface IFlashStrategySushiSwapFactory {\\n    error InvalidFee();\\n    error InvalidFeeRecipient();\\n    error FlashStrategySushiSwapCreated();\\n\\n    event UpdateStakeFeeBPS(uint256 fee);\\n    event UpdateFlashStakeFeeBPS(uint256 fee);\\n    event UpdateFeeRecipient(address feeRecipient);\\n    event CreateFlashStrategySushiSwap(uint256 pid, address strategy);\\n\\n    function flashProtocol() external view returns (address);\\n\\n    function flpTokenFactory() external view returns (address);\\n\\n    function feeRecipient() external view returns (address);\\n\\n    function getFlashStrategySushiSwap(uint256 pid) external view returns (address);\\n\\n    function predictFlashStrategySushiSwapAddress(uint256 pid) external view returns (address strategy);\\n\\n    function updateFeeRecipient(address _feeRecipient) external;\\n\\n    function createFlashStrategySushiSwap(uint256 pid) external returns (address strategy);\\n}\\n\",\"keccak256\":\"0xfa2ca9ab0537cf4b0cf915100d292d48201e905162c4ace0d552d3e5c1cec3f1\",\"license\":\"BUSL-1.1\"},\"contracts/libraries/Snapshots.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.17;\\n\\nlibrary Snapshots {\\n    error InvalidTimestamp();\\n\\n    struct Snapshot {\\n        uint256 value;\\n        uint256 timestamp;\\n    }\\n\\n    function size(Snapshot[] storage snapshots) internal view returns (uint256) {\\n        return snapshots.length;\\n    }\\n\\n    function lastValue(Snapshot[] storage snapshots) internal view returns (uint256) {\\n        uint256 _length = snapshots.length;\\n        return _length > 0 ? snapshots[_length - 1].value : 0;\\n    }\\n\\n    function valueAt(Snapshot[] storage snapshots, uint256 timestamp) internal view returns (uint256) {\\n        uint256 _now = block.timestamp;\\n        if (_now < timestamp) revert InvalidTimestamp();\\n\\n        uint256 _length = snapshots.length;\\n        if (_length == 0) {\\n            return 0;\\n        }\\n\\n        // First check most recent balance\\n        if (snapshots[_length - 1].timestamp <= timestamp) {\\n            return snapshots[_length - 1].value;\\n        }\\n\\n        // Next check implicit zero balance\\n        if (timestamp < snapshots[0].timestamp) {\\n            return 0;\\n        }\\n\\n        unchecked {\\n            uint256 lower = 0;\\n            uint256 upper = _length - 1;\\n            while (upper > lower) {\\n                uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow\\n                Snapshot memory snapshot = snapshots[center];\\n                if (snapshot.timestamp == _now) {\\n                    return snapshot.value;\\n                } else if (snapshot.timestamp < _now) {\\n                    lower = center;\\n                } else {\\n                    upper = center - 1;\\n                }\\n            }\\n            return snapshots[lower].value;\\n        }\\n    }\\n\\n    function append(Snapshot[] storage snapshots, uint256 value) internal {\\n        snapshots.push(Snapshot(value, block.timestamp));\\n    }\\n}\\n\",\"keccak256\":\"0xdc8a865eed08331c7e1f3eed6473c85e197b37e06017c6c02c268958feaf6454\",\"license\":\"BUSL-1.1\"}},\"version\":1}",
  "bytecode": "0x60a0346100ae57601f610c3438819003918201601f19168301916001600160401b038311848410176100b3578084926020946040528339810103126100ae57516001600160a01b039081811681036100ae576000543360018060a01b0319821617600055604051923391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3608052610b6a90816100ca82396080518181816103e901526106200152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60406080815260048036101561001457600080fd5b600091823560e01c80631067c6701461069c5780631270091514610677578063332c14531461064f578063654e6d771461060b578063715018a6146105b15780637769ea0a146103ad5780638da5cb5b14610385578063af62147e14610254578063b90732261461022c578063c2972baf1461020c578063db528784146101f0578063e1573573146101cc578063e98e88e2146101a9578063ed64bab2146101915763f2fde38b146100c557600080fd5b3461018d57602036600319011261018d576001600160a01b03823581811693919290849003610189576100f66106d7565b831561013757505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8480fd5b8280fd5b83346101a65760203660031901126101a65780f35b80fd5b8382346101c857816003193601126101c8576020906001549051908152f35b5080fd5b8382346101c857816003193601126101c8576020906101e9610890565b9051908152f35b8382346101c8576020906101e9610206366106bc565b906107b7565b5082346101a65760203660031901126101a657506101e96020923561074f565b50903461018d57602036600319011261018d57816020936101e99235815260028552206108bb565b508290346101c857610265366106bc565b6102709291926106d7565b828452600260205281842054156103755782845260026020526102948285206108bb565b83855260026020528285208351906102ab826107e5565b8382526020820190428252805490600160401b82101561036257906102d591600182018155610874565b9290926103505790600191518355519101556102ef610890565b82810180911161033d577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a93929161032691610817565b61032f81610ad5565b82519182526020820152a280f35b634e487b7160e01b865260118752602486fd5b634e487b7160e01b8852878952602488fd5b634e487b7160e01b895260418a52602489fd5b81516387e8068360e01b81528590fd5b8382346101c857816003193601126101c857905490516001600160a01b039091168152602090f35b508290346101c8576020908160031936011261018d578051633750db2960e21b8152843581860181905292906001600160a01b039082816024817f000000000000000000000000000000000000000000000000000000000000000086165afa9081156105a7578691610543575b50161561037557827f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c08708580a2828452600281526104588285206108bb565b908385526002815282852091835161046f816107e5565b68056bc75e2d631000009384825283820190428252805490600160401b82101561053057906104a391600182018155610874565b92909261051e5790600191518355519101556104bd610890565b83810180911161050b577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a949392916104f591610817565b906104ff82610ad5565b8351928352820152a280f35b634e487b7160e01b875260118852602487fd5b634e487b7160e01b8952888a52602489fd5b634e487b7160e01b8a5260418b5260248afd5b9050823d84116105a0575b601f8101601f1916820167ffffffffffffffff81118382101761058d578491839187528101031261058957518181168103610589578761041a565b8580fd5b634e487b7160e01b885260418952602488fd5b503d61054e565b84513d88823e3d90fd5b83346101a657806003193601126101a6576105ca6106d7565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b8382346101c857816003193601126101c857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50903461018d57602036600319011261018d5760209282913581526002845220549051908152f35b8382346101c8576101e96020928261068e366106bc565b9290815260028652206109e4565b5082346101a65760203660031901126101a657506101e9602092356108e1565b60409060031901126106d2576004359060243590565b600080fd5b6000546001600160a01b031633036106eb57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b8115610739570490565b634e487b7160e01b600052601260045260246000fd5b610757610890565b9081156107b057600052600260205261077360406000206108bb565b90670de0b6b3a76400009182810292818404149015171561079a576107979161072f565b90565b634e487b7160e01b600052601160045260246000fd5b5050600090565b6107c0826108e1565b9182156107dd5761077391600052600260205260406000206109e4565b505050600090565b6040810190811067ffffffffffffffff82111761080157604052565b634e487b7160e01b600052604160045260246000fd5b9190820391821161079a57565b60015481101561085e57600160005260011b7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b805482101561085e5760005260206000209060011b0190600090565b600154600081156108b65750600019810190811161079a576108b190610824565b505490565b905090565b8054600081156108db5750600019810190811161079a576108b191610874565b91505090565b8042106109d25760019081549081156107dd576000199081830192831161079a57808461090d85610824565b50015411156109c657836000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf754116107dd5760009291905b83821161095a575050506108b190610824565b838203831c820393849061096d86610824565b5095602060405161097d816107e5565b885480825298880154910181905242810361099c575050505050505090565b909192939495965042116000146109ba575050915b90929192610947565b909350829150016109b1565b50506108b19150610824565b60405163b7d0949760e01b8152600490fd5b8142106109d25780549081156107dd5760001982810192831161079a57610a0b8383610874565b5093806001809601541115610ac957826000526020908582600020015411610abf57906000949293915b858311610a4a5750505050906108b191610874565b858394959303851c8403958690610a618886610874565b509783604051610a70816107e5565b8a548082529a8a01549101819052428103610a915750505050505050505090565b909192939495969798504211600014610ab3575050935b919094929394610a35565b90955083915001610aa8565b5050505050600090565b50506108b19250610874565b60405190610ae2826107e5565b81526020810190428252600154600160401b81101561080157806001610b0b9201600155610824565b929092610b1e5760019151835551910155565b634e487b7160e01b600052600060045260246000fdfea26469706673582212203d024c4f1900fa3edde48cc56e801807046e901903bdd182ffe71723eec9fd7464736f6c63430008110033",
  "deployedBytecode": "0x60406080815260048036101561001457600080fd5b600091823560e01c80631067c6701461069c5780631270091514610677578063332c14531461064f578063654e6d771461060b578063715018a6146105b15780637769ea0a146103ad5780638da5cb5b14610385578063af62147e14610254578063b90732261461022c578063c2972baf1461020c578063db528784146101f0578063e1573573146101cc578063e98e88e2146101a9578063ed64bab2146101915763f2fde38b146100c557600080fd5b3461018d57602036600319011261018d576001600160a01b03823581811693919290849003610189576100f66106d7565b831561013757505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8480fd5b8280fd5b83346101a65760203660031901126101a65780f35b80fd5b8382346101c857816003193601126101c8576020906001549051908152f35b5080fd5b8382346101c857816003193601126101c8576020906101e9610890565b9051908152f35b8382346101c8576020906101e9610206366106bc565b906107b7565b5082346101a65760203660031901126101a657506101e96020923561074f565b50903461018d57602036600319011261018d57816020936101e99235815260028552206108bb565b508290346101c857610265366106bc565b6102709291926106d7565b828452600260205281842054156103755782845260026020526102948285206108bb565b83855260026020528285208351906102ab826107e5565b8382526020820190428252805490600160401b82101561036257906102d591600182018155610874565b9290926103505790600191518355519101556102ef610890565b82810180911161033d577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a93929161032691610817565b61032f81610ad5565b82519182526020820152a280f35b634e487b7160e01b865260118752602486fd5b634e487b7160e01b8852878952602488fd5b634e487b7160e01b895260418a52602489fd5b81516387e8068360e01b81528590fd5b8382346101c857816003193601126101c857905490516001600160a01b039091168152602090f35b508290346101c8576020908160031936011261018d578051633750db2960e21b8152843581860181905292906001600160a01b039082816024817f000000000000000000000000000000000000000000000000000000000000000086165afa9081156105a7578691610543575b50161561037557827f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c08708580a2828452600281526104588285206108bb565b908385526002815282852091835161046f816107e5565b68056bc75e2d631000009384825283820190428252805490600160401b82101561053057906104a391600182018155610874565b92909261051e5790600191518355519101556104bd610890565b83810180911161050b577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a949392916104f591610817565b906104ff82610ad5565b8351928352820152a280f35b634e487b7160e01b875260118852602487fd5b634e487b7160e01b8952888a52602489fd5b634e487b7160e01b8a5260418b5260248afd5b9050823d84116105a0575b601f8101601f1916820167ffffffffffffffff81118382101761058d578491839187528101031261058957518181168103610589578761041a565b8580fd5b634e487b7160e01b885260418952602488fd5b503d61054e565b84513d88823e3d90fd5b83346101a657806003193601126101a6576105ca6106d7565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b8382346101c857816003193601126101c857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50903461018d57602036600319011261018d5760209282913581526002845220549051908152f35b8382346101c8576101e96020928261068e366106bc565b9290815260028652206109e4565b5082346101a65760203660031901126101a657506101e9602092356108e1565b60409060031901126106d2576004359060243590565b600080fd5b6000546001600160a01b031633036106eb57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b8115610739570490565b634e487b7160e01b600052601260045260246000fd5b610757610890565b9081156107b057600052600260205261077360406000206108bb565b90670de0b6b3a76400009182810292818404149015171561079a576107979161072f565b90565b634e487b7160e01b600052601160045260246000fd5b5050600090565b6107c0826108e1565b9182156107dd5761077391600052600260205260406000206109e4565b505050600090565b6040810190811067ffffffffffffffff82111761080157604052565b634e487b7160e01b600052604160045260246000fd5b9190820391821161079a57565b60015481101561085e57600160005260011b7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b805482101561085e5760005260206000209060011b0190600090565b600154600081156108b65750600019810190811161079a576108b190610824565b505490565b905090565b8054600081156108db5750600019810190811161079a576108b191610874565b91505090565b8042106109d25760019081549081156107dd576000199081830192831161079a57808461090d85610824565b50015411156109c657836000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf754116107dd5760009291905b83821161095a575050506108b190610824565b838203831c820393849061096d86610824565b5095602060405161097d816107e5565b885480825298880154910181905242810361099c575050505050505090565b909192939495965042116000146109ba575050915b90929192610947565b909350829150016109b1565b50506108b19150610824565b60405163b7d0949760e01b8152600490fd5b8142106109d25780549081156107dd5760001982810192831161079a57610a0b8383610874565b5093806001809601541115610ac957826000526020908582600020015411610abf57906000949293915b858311610a4a5750505050906108b191610874565b858394959303851c8403958690610a618886610874565b509783604051610a70816107e5565b8a548082529a8a01549101819052428103610a915750505050505050505090565b909192939495969798504211600014610ab3575050935b919094929394610a35565b90955083915001610aa8565b5050505050600090565b50506108b19250610874565b60405190610ae2826107e5565b81526020810190428252600154600160401b81101561080157806001610b0b9201600155610824565b929092610b1e5760019151835551910155565b634e487b7160e01b600052600060045260246000fdfea26469706673582212203d024c4f1900fa3edde48cc56e801807046e901903bdd182ffe71723eec9fd7464736f6c63430008110033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 7,
        "contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
        "label": "_owner",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 10821,
        "contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
        "label": "_totalWeightPoints",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_struct(Snapshot)17180_storage)dyn_storage"
      },
      {
        "astId": 10827,
        "contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
        "label": "_weightPoints",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_uint256,t_array(t_struct(Snapshot)17180_storage)dyn_storage)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_struct(Snapshot)17180_storage)dyn_storage": {
        "base": "t_struct(Snapshot)17180_storage",
        "encoding": "dynamic_array",
        "label": "struct Snapshots.Snapshot[]",
        "numberOfBytes": "32"
      },
      "t_mapping(t_uint256,t_array(t_struct(Snapshot)17180_storage)dyn_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => struct Snapshots.Snapshot[])",
        "numberOfBytes": "32",
        "value": "t_array(t_struct(Snapshot)17180_storage)dyn_storage"
      },
      "t_struct(Snapshot)17180_storage": {
        "encoding": "inplace",
        "label": "struct Snapshots.Snapshot",
        "members": [
          {
            "astId": 17177,
            "contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
            "label": "value",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 17179,
            "contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
            "label": "timestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}