{ "address": "0xef960bc57af4E68e2eCD4E385DC30bB107f4F5DF", "abi": [ { "inputs": [ { "internalType": "contract IFluidVaultResolver", "name": "vaultResolver_", "type": "address" }, { "internalType": "contract IFluidVaultFactory", "name": "vaultFactory_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "FluidVaultPositionsResolver__AddressZero", "type": "error" }, { "inputs": [], "name": "FACTORY", "outputs": [ { "internalType": "contract IFluidVaultFactory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "VAULT_RESOLVER", "outputs": [ { "internalType": "contract IFluidVaultResolver", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "vault_", "type": "address" } ], "name": "getAllVaultNftIds", "outputs": [ { "internalType": "uint256[]", "name": "nftIds_", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "vault_", "type": "address" } ], "name": "getAllVaultPositions", "outputs": [ { "components": [ { "internalType": "uint256", "name": "nftId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "supply", "type": "uint256" }, { "internalType": "uint256", "name": "borrow", "type": "uint256" } ], "internalType": "struct Structs.UserPosition[]", "name": "positions_", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "nftIds_", "type": "uint256[]" } ], "name": "getPositionsForNftIds", "outputs": [ { "components": [ { "internalType": "uint256", "name": "nftId", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "supply", "type": "uint256" }, { "internalType": "uint256", "name": "borrow", "type": "uint256" } ], "internalType": "struct Structs.UserPosition[]", "name": "positions_", "type": "tuple[]" } ], "stateMutability": "view", "type": "function" } ], "transactionHash": "0x529c9992c1f7c3bc36d581ec906d7e1cb21d9bc511f56b390f8a48f22ac3e9ee", "receipt": { "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", "from": "0x0Ed35B1609Ec45c7079E80d11149a52717e4859A", "contractAddress": null, "transactionIndex": 197, "gasUsed": "1089444", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "blockHash": "0xeab3340e6a906117025ad5354338ac6fa2eb87f12fe3af831f8f4534d56a2052", "transactionHash": "0x529c9992c1f7c3bc36d581ec906d7e1cb21d9bc511f56b390f8a48f22ac3e9ee", "logs": [], "blockNumber": 19959917, "cumulativeGasUsed": "18524360", "status": 1, "byzantium": true }, "args": [ "0x12E97c730C43919308673342223Ee3caB7dC6622", "0x324c5Dc1fC42c7a4D43d92df1eBA58a54d13Bf2d" ], "numDeployments": 2, "solcInputHash": "91ec4623211a499f3072c159cba643b0", "metadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IFluidVaultResolver\",\"name\":\"vaultResolver_\",\"type\":\"address\"},{\"internalType\":\"contract IFluidVaultFactory\",\"name\":\"vaultFactory_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"FluidVaultPositionsResolver__AddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FACTORY\",\"outputs\":[{\"internalType\":\"contract IFluidVaultFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VAULT_RESOLVER\",\"outputs\":[{\"internalType\":\"contract IFluidVaultResolver\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vault_\",\"type\":\"address\"}],\"name\":\"getAllVaultNftIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nftIds_\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vault_\",\"type\":\"address\"}],\"name\":\"getAllVaultPositions\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nftId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrow\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserPosition[]\",\"name\":\"positions_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"nftIds_\",\"type\":\"uint256[]\"}],\"name\":\"getPositionsForNftIds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nftId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrow\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserPosition[]\",\"name\":\"positions_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"FluidVaultPositionsResolver__AddressZero()\":[{\"notice\":\"thrown if an input param address is zero\"}]},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"constructor sets the immutable vault resolver and vault factory address\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/periphery/resolvers/vaultPositions/main.sol\":\"FluidVaultPositionsResolver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes calldata data\\n ) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool _approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Enumerable is IERC721 {\\n /**\\n * @dev Returns the total amount of tokens stored by the contract.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns a token ID owned by `owner` at a given `index` of its token list.\\n * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\\n */\\n function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);\\n\\n /**\\n * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\\n * Use along with {totalSupply} to enumerate all tokens.\\n */\\n function tokenByIndex(uint256 index) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xd1556954440b31c97a142c6ba07d5cade45f96fafd52091d33a14ebe365aecbf\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/liquidity/adminModule/structs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nabstract contract Structs {\\n struct AddressBool {\\n address addr;\\n bool value;\\n }\\n\\n struct AddressUint256 {\\n address addr;\\n uint256 value;\\n }\\n\\n /// @notice struct to set borrow rate data for version 1\\n struct RateDataV1Params {\\n ///\\n /// @param token for rate data\\n address token;\\n ///\\n /// @param kink in borrow rate. in 1e2: 100% = 10_000; 1% = 100\\n /// utilization below kink usually means slow increase in rate, once utilization is above kink borrow rate increases fast\\n uint256 kink;\\n ///\\n /// @param rateAtUtilizationZero desired borrow rate when utilization is zero. in 1e2: 100% = 10_000; 1% = 100\\n /// i.e. constant minimum borrow rate\\n /// e.g. at utilization = 0.01% rate could still be at least 4% (rateAtUtilizationZero would be 400 then)\\n uint256 rateAtUtilizationZero;\\n ///\\n /// @param rateAtUtilizationKink borrow rate when utilization is at kink. in 1e2: 100% = 10_000; 1% = 100\\n /// e.g. when rate should be 7% at kink then rateAtUtilizationKink would be 700\\n uint256 rateAtUtilizationKink;\\n ///\\n /// @param rateAtUtilizationMax borrow rate when utilization is maximum at 100%. in 1e2: 100% = 10_000; 1% = 100\\n /// e.g. when rate should be 125% at 100% then rateAtUtilizationMax would be 12_500\\n uint256 rateAtUtilizationMax;\\n }\\n\\n /// @notice struct to set borrow rate data for version 2\\n struct RateDataV2Params {\\n ///\\n /// @param token for rate data\\n address token;\\n ///\\n /// @param kink1 first kink in borrow rate. in 1e2: 100% = 10_000; 1% = 100\\n /// utilization below kink 1 usually means slow increase in rate, once utilization is above kink 1 borrow rate increases faster\\n uint256 kink1;\\n ///\\n /// @param kink2 second kink in borrow rate. in 1e2: 100% = 10_000; 1% = 100\\n /// utilization below kink 2 usually means slow / medium increase in rate, once utilization is above kink 2 borrow rate increases fast\\n uint256 kink2;\\n ///\\n /// @param rateAtUtilizationZero desired borrow rate when utilization is zero. in 1e2: 100% = 10_000; 1% = 100\\n /// i.e. constant minimum borrow rate\\n /// e.g. at utilization = 0.01% rate could still be at least 4% (rateAtUtilizationZero would be 400 then)\\n uint256 rateAtUtilizationZero;\\n ///\\n /// @param rateAtUtilizationKink1 desired borrow rate when utilization is at first kink. in 1e2: 100% = 10_000; 1% = 100\\n /// e.g. when rate should be 7% at first kink then rateAtUtilizationKink would be 700\\n uint256 rateAtUtilizationKink1;\\n ///\\n /// @param rateAtUtilizationKink2 desired borrow rate when utilization is at second kink. in 1e2: 100% = 10_000; 1% = 100\\n /// e.g. when rate should be 7% at second kink then rateAtUtilizationKink would be 1_200\\n uint256 rateAtUtilizationKink2;\\n ///\\n /// @param rateAtUtilizationMax desired borrow rate when utilization is maximum at 100%. in 1e2: 100% = 10_000; 1% = 100\\n /// e.g. when rate should be 125% at 100% then rateAtUtilizationMax would be 12_500\\n uint256 rateAtUtilizationMax;\\n }\\n\\n /// @notice struct to set token config\\n struct TokenConfig {\\n ///\\n /// @param token address\\n address token;\\n ///\\n /// @param fee charges on borrower's interest. in 1e2: 100% = 10_000; 1% = 100\\n uint256 fee;\\n ///\\n /// @param threshold on when to update the storage slot. in 1e2: 100% = 10_000; 1% = 100\\n uint256 threshold;\\n ///\\n /// @param maxUtilization maximum allowed utilization. in 1e2: 100% = 10_000; 1% = 100\\n /// set to 100% to disable and have default limit of 100% (avoiding SLOAD).\\n uint256 maxUtilization;\\n }\\n\\n /// @notice struct to set user supply & withdrawal config\\n struct UserSupplyConfig {\\n ///\\n /// @param user address\\n address user;\\n ///\\n /// @param token address\\n address token;\\n ///\\n /// @param mode: 0 = without interest. 1 = with interest\\n uint8 mode;\\n ///\\n /// @param expandPercent withdrawal limit expand percent. in 1e2: 100% = 10_000; 1% = 100\\n /// Also used to calculate rate at which withdrawal limit should decrease (instant).\\n uint256 expandPercent;\\n ///\\n /// @param expandDuration withdrawal limit expand duration in seconds.\\n /// used to calculate rate together with expandPercent\\n uint256 expandDuration;\\n ///\\n /// @param baseWithdrawalLimit base limit, below this, user can withdraw the entire amount.\\n /// amount in raw (to be multiplied with exchange price) or normal depends on configured mode in user config for the token:\\n /// with interest -> raw, without interest -> normal\\n uint256 baseWithdrawalLimit;\\n }\\n\\n /// @notice struct to set user borrow & payback config\\n struct UserBorrowConfig {\\n ///\\n /// @param user address\\n address user;\\n ///\\n /// @param token address\\n address token;\\n ///\\n /// @param mode: 0 = without interest. 1 = with interest\\n uint8 mode;\\n ///\\n /// @param expandPercent debt limit expand percent. in 1e2: 100% = 10_000; 1% = 100\\n /// Also used to calculate rate at which debt limit should decrease (instant).\\n uint256 expandPercent;\\n ///\\n /// @param expandDuration debt limit expand duration in seconds.\\n /// used to calculate rate together with expandPercent\\n uint256 expandDuration;\\n ///\\n /// @param baseDebtCeiling base borrow limit. until here, borrow limit remains as baseDebtCeiling\\n /// (user can borrow until this point at once without stepped expansion). Above this, automated limit comes in place.\\n /// amount in raw (to be multiplied with exchange price) or normal depends on configured mode in user config for the token:\\n /// with interest -> raw, without interest -> normal\\n uint256 baseDebtCeiling;\\n ///\\n /// @param maxDebtCeiling max borrow ceiling, maximum amount the user can borrow.\\n /// amount in raw (to be multiplied with exchange price) or normal depends on configured mode in user config for the token:\\n /// with interest -> raw, without interest -> normal\\n uint256 maxDebtCeiling;\\n }\\n}\\n\",\"keccak256\":\"0x10353c70015f27b880125cefab806dbed24a4458f187da66964f3ef60488f757\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/liquidity/structs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { Structs as AdminModuleStructs } from \\\"../../../liquidity/adminModule/structs.sol\\\";\\n\\nabstract contract Structs {\\n struct RateData {\\n uint256 version;\\n AdminModuleStructs.RateDataV1Params rateDataV1;\\n AdminModuleStructs.RateDataV2Params rateDataV2;\\n }\\n\\n struct OverallTokenData {\\n uint256 borrowRate;\\n uint256 supplyRate;\\n uint256 fee; // revenue fee\\n uint256 lastStoredUtilization;\\n uint256 storageUpdateThreshold;\\n uint256 lastUpdateTimestamp;\\n uint256 supplyExchangePrice;\\n uint256 borrowExchangePrice;\\n uint256 supplyRawInterest;\\n uint256 supplyInterestFree;\\n uint256 borrowRawInterest;\\n uint256 borrowInterestFree;\\n uint256 totalSupply;\\n uint256 totalBorrow;\\n uint256 revenue;\\n uint256 maxUtilization; // maximum allowed utilization\\n RateData rateData;\\n }\\n\\n // amounts are always in normal (for withInterest already multiplied with exchange price)\\n struct UserSupplyData {\\n bool modeWithInterest; // true if mode = with interest, false = without interest\\n uint256 supply; // user supply amount\\n // the withdrawal limit (e.g. if 10% is the limit, and 100M is supplied, it would be 90M)\\n uint256 withdrawalLimit;\\n uint256 lastUpdateTimestamp;\\n uint256 expandPercent; // withdrawal limit expand percent in 1e2\\n uint256 expandDuration; // withdrawal limit expand duration in seconds\\n uint256 baseWithdrawalLimit;\\n // the current actual max withdrawable amount (e.g. if 10% is the limit, and 100M is supplied, it would be 10M)\\n uint256 withdrawableUntilLimit;\\n uint256 withdrawable; // actual currently withdrawable amount (supply - withdrawal Limit) & considering balance\\n }\\n\\n // amounts are always in normal (for withInterest already multiplied with exchange price)\\n struct UserBorrowData {\\n bool modeWithInterest; // true if mode = with interest, false = without interest\\n uint256 borrow; // user borrow amount\\n uint256 borrowLimit;\\n uint256 lastUpdateTimestamp;\\n uint256 expandPercent;\\n uint256 expandDuration;\\n uint256 baseBorrowLimit;\\n uint256 maxBorrowLimit;\\n uint256 borrowableUntilLimit; // borrowable amount until any borrow limit (incl. max utilization limit)\\n uint256 borrowable; // actual currently borrowable amount (borrow limit - already borrowed) & considering balance, max utilization\\n uint256 borrowLimitUtilization; // borrow limit for `maxUtilization`\\n }\\n}\\n\",\"keccak256\":\"0xf8a59b6c7963d0bd43be07db0c594e278f97e6dfa498dee8436e3707dd9f574e\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/vault/iVaultResolver.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\nimport { Structs } from \\\"./structs.sol\\\";\\n\\ninterface IFluidVaultResolver {\\n function vaultByNftId(uint nftId_) external view returns (address vault_);\\n\\n function positionByNftId(\\n uint nftId_\\n ) external view returns (Structs.UserPosition memory userPosition_, Structs.VaultEntireData memory vaultData_);\\n\\n function getVaultVariablesRaw(address vault_) external view returns (uint);\\n\\n function getVaultVariables2Raw(address vault_) external view returns (uint);\\n\\n function getTickHasDebtRaw(address vault_, int key_) external view returns (uint);\\n\\n function getTickDataRaw(address vault_, int tick_) external view returns (uint);\\n\\n function getBranchDataRaw(address vault_, uint branch_) external view returns (uint);\\n\\n function getAllVaultsAddresses() external view returns (address[] memory vaults_);\\n\\n function getVaultLiquidation(\\n address vault_,\\n uint tokenInAmt_\\n ) external returns (Structs.LiquidationStruct memory liquidationData_);\\n\\n function getVaultEntireData(address vault_) external view returns (Structs.VaultEntireData memory vaultData_);\\n}\\n\",\"keccak256\":\"0xb95905672b0061fdb2f2adc94537286843e8bf6934033cf3e0ba14c6fad0aa27\",\"license\":\"MIT\"},\"contracts/periphery/resolvers/vault/structs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { IFluidVaultT1 } from \\\"../../../protocols/vault/interfaces/iVaultT1.sol\\\";\\nimport { Structs as FluidLiquidityResolverStructs } from \\\"../liquidity/structs.sol\\\";\\n\\ncontract Structs {\\n struct Configs {\\n uint16 supplyRateMagnifier;\\n uint16 borrowRateMagnifier;\\n uint16 collateralFactor;\\n uint16 liquidationThreshold;\\n uint16 liquidationMaxLimit;\\n uint16 withdrawalGap;\\n uint16 liquidationPenalty;\\n uint16 borrowFee;\\n address oracle;\\n uint oraclePriceOperate;\\n uint oraclePriceLiquidate;\\n address rebalancer;\\n }\\n\\n struct ExchangePricesAndRates {\\n uint lastStoredLiquiditySupplyExchangePrice;\\n uint lastStoredLiquidityBorrowExchangePrice;\\n uint lastStoredVaultSupplyExchangePrice;\\n uint lastStoredVaultBorrowExchangePrice;\\n uint liquiditySupplyExchangePrice;\\n uint liquidityBorrowExchangePrice;\\n uint vaultSupplyExchangePrice;\\n uint vaultBorrowExchangePrice;\\n uint supplyRateVault;\\n uint borrowRateVault;\\n uint supplyRateLiquidity;\\n uint borrowRateLiquidity;\\n uint rewardsRate; // rewards rate in percent 1e2 precision (1% = 100, 100% = 10000)\\n }\\n\\n struct TotalSupplyAndBorrow {\\n uint totalSupplyVault;\\n uint totalBorrowVault;\\n uint totalSupplyLiquidity;\\n uint totalBorrowLiquidity;\\n uint absorbedSupply;\\n uint absorbedBorrow;\\n }\\n\\n struct LimitsAndAvailability {\\n uint withdrawLimit;\\n uint withdrawableUntilLimit;\\n uint withdrawable;\\n uint borrowLimit;\\n uint borrowableUntilLimit; // borrowable amount until any borrow limit (incl. max utilization limit)\\n uint borrowable; // actual currently borrowable amount (borrow limit - already borrowed) & considering balance, max utilization\\n uint borrowLimitUtilization; // borrow limit for `maxUtilization` config at Liquidity\\n uint minimumBorrowing;\\n }\\n\\n struct CurrentBranchState {\\n uint status; // if 0 then not liquidated, if 1 then liquidated, if 2 then merged, if 3 then closed\\n int minimaTick;\\n uint debtFactor;\\n uint partials;\\n uint debtLiquidity;\\n uint baseBranchId;\\n int baseBranchMinima;\\n }\\n\\n struct VaultState {\\n uint totalPositions;\\n int topTick;\\n uint currentBranch;\\n uint totalBranch;\\n uint totalBorrow;\\n uint totalSupply;\\n CurrentBranchState currentBranchState;\\n }\\n\\n struct VaultEntireData {\\n address vault;\\n IFluidVaultT1.ConstantViews constantVariables;\\n Configs configs;\\n ExchangePricesAndRates exchangePricesAndRates;\\n TotalSupplyAndBorrow totalSupplyAndBorrow;\\n LimitsAndAvailability limitsAndAvailability;\\n VaultState vaultState;\\n // liquidity related data such as supply amount, limits, expansion etc.\\n FluidLiquidityResolverStructs.UserSupplyData liquidityUserSupplyData;\\n // liquidity related data such as borrow amount, limits, expansion etc.\\n FluidLiquidityResolverStructs.UserBorrowData liquidityUserBorrowData;\\n }\\n\\n struct UserPosition {\\n uint nftId;\\n address owner;\\n bool isLiquidated;\\n bool isSupplyPosition; // if true that means borrowing is 0\\n int tick;\\n uint tickId;\\n uint beforeSupply;\\n uint beforeBorrow;\\n uint beforeDustBorrow;\\n uint supply;\\n uint borrow;\\n uint dustBorrow;\\n }\\n\\n /// @dev liquidation related data\\n /// @param vault address of vault\\n /// @param tokenIn_ address of token in\\n /// @param tokenOut_ address of token out\\n /// @param tokenInAmtOne_ (without absorb liquidity) minimum of available liquidation & tokenInAmt_\\n /// @param tokenOutAmtOne_ (without absorb liquidity) expected token out, collateral to withdraw\\n /// @param tokenInAmtTwo_ (absorb liquidity included) minimum of available liquidation & tokenInAmt_. In most cases it'll be same as tokenInAmtOne_ but sometimes can be bigger.\\n /// @param tokenOutAmtTwo_ (absorb liquidity included) expected token out, collateral to withdraw. In most cases it'll be same as tokenOutAmtOne_ but sometimes can be bigger.\\n /// @dev Liquidity in Two will always be >= One. Sometimes One can provide better swaps, sometimes Two can provide better swaps. But available in Two will always be >= One\\n struct LiquidationStruct {\\n address vault;\\n address tokenIn;\\n address tokenOut;\\n uint tokenInAmtOne;\\n uint tokenOutAmtOne;\\n uint tokenInAmtTwo;\\n uint tokenOutAmtTwo;\\n }\\n\\n struct AbsorbStruct {\\n address vault;\\n bool absorbAvailable;\\n }\\n}\\n\",\"keccak256\":\"0x7bfd2c661ed85a4bce5b66b6261254f28bb0eb975847ba1eda8b40d0a46e7584\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/vaultPositions/main.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { Variables } from \\\"./variables.sol\\\";\\nimport { Structs } from \\\"./structs.sol\\\";\\nimport { IFluidVaultFactory } from \\\"../../../protocols/vault/interfaces/iVaultFactory.sol\\\";\\nimport { Structs as VaultResolverStructs } from \\\"../vault/structs.sol\\\";\\nimport { IFluidVaultResolver } from \\\"../vault/iVaultResolver.sol\\\";\\n\\ncontract FluidVaultPositionsResolver is Variables, Structs {\\n /// @notice thrown if an input param address is zero\\n error FluidVaultPositionsResolver__AddressZero();\\n\\n /// @notice constructor sets the immutable vault resolver and vault factory address\\n constructor(\\n IFluidVaultResolver vaultResolver_,\\n IFluidVaultFactory vaultFactory_\\n ) Variables(vaultResolver_, vaultFactory_) {\\n if (address(vaultResolver_) == address(0) || address(vaultFactory_) == address(0)) {\\n revert FluidVaultPositionsResolver__AddressZero();\\n }\\n }\\n\\n function getAllVaultNftIds(address vault_) public view returns (uint256[] memory nftIds_) {\\n uint256 totalPositions_ = FACTORY.totalSupply();\\n\\n /// get total positions for vault: Next 32 bits => 210-241 => Total positions\\n uint256 totalVaultPositions_ = (VAULT_RESOLVER.getVaultVariablesRaw(vault_) >> 210) & 0xFFFFFFFF;\\n nftIds_ = new uint256[](totalVaultPositions_);\\n\\n // get nft Ids belonging to the vault_\\n uint256 nftId_;\\n uint256 j;\\n for (uint256 i; i < totalPositions_; ++i) {\\n nftId_ = FACTORY.tokenByIndex(i);\\n if (VAULT_RESOLVER.vaultByNftId(nftId_) != vault_) {\\n continue;\\n }\\n nftIds_[j] = nftId_;\\n ++j;\\n }\\n }\\n\\n function getPositionsForNftIds(uint256[] memory nftIds_) public view returns (UserPosition[] memory positions_) {\\n positions_ = new UserPosition[](nftIds_.length);\\n\\n VaultResolverStructs.UserPosition memory userPosition_;\\n for (uint256 i; i < nftIds_.length; ++i) {\\n (userPosition_, ) = VAULT_RESOLVER.positionByNftId(nftIds_[i]);\\n\\n positions_[i].nftId = nftIds_[i];\\n positions_[i].owner = userPosition_.owner;\\n positions_[i].supply = userPosition_.supply;\\n positions_[i].borrow = userPosition_.borrow;\\n }\\n }\\n\\n function getAllVaultPositions(address vault_) public view returns (UserPosition[] memory positions_) {\\n return getPositionsForNftIds(getAllVaultNftIds(vault_));\\n }\\n}\\n\",\"keccak256\":\"0x01060c28f4a83faae57b6dbfc9eb858c16a7f2ee7f3f92f8cafcf6e93f6fdea5\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/vaultPositions/structs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\ncontract Structs {\\n struct UserPosition {\\n uint nftId;\\n address owner;\\n uint supply;\\n uint borrow;\\n }\\n}\\n\",\"keccak256\":\"0x7c7d70501ec27863eab620195f377c69bc08e833f8bc1a028e7d56438a27ebfa\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/vaultPositions/variables.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { IFluidVaultResolver } from \\\"../vault/iVaultResolver.sol\\\";\\nimport { IFluidVaultFactory } from \\\"../../../protocols/vault/interfaces/iVaultFactory.sol\\\";\\n\\ncontract Variables {\\n IFluidVaultResolver public immutable VAULT_RESOLVER;\\n IFluidVaultFactory public immutable FACTORY;\\n\\n constructor(IFluidVaultResolver vaultResolver_, IFluidVaultFactory vaultFactory_) {\\n VAULT_RESOLVER = vaultResolver_;\\n FACTORY = vaultFactory_;\\n }\\n}\\n\",\"keccak256\":\"0x5c6b941941913be86a8f0fba4eee045927d345dab10303c3c41725bd61cfa0a9\",\"license\":\"BUSL-1.1\"},\"contracts/protocols/vault/interfaces/iVaultFactory.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\nimport { IERC721Enumerable } from \\\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol\\\";\\n\\ninterface IFluidVaultFactory is IERC721Enumerable {\\n /// @notice Minting an NFT Vault for the user\\n function mint(uint256 vaultId_, address user_) external returns (uint256 tokenId_);\\n\\n /// @notice returns owner of Vault which is also an NFT\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /// @notice Global auth is auth for all vaults\\n function isGlobalAuth(address auth_) external view returns (bool);\\n\\n /// @notice Vault auth is auth for a specific vault\\n function isVaultAuth(address vault_, address auth_) external view returns (bool);\\n\\n /// @notice Total vaults deployed.\\n function totalVaults() external view returns (uint256);\\n\\n /// @notice Compute vaultAddress\\n function getVaultAddress(uint256 vaultId) external view returns (address);\\n\\n /// @notice read uint256 `result_` for a storage `slot_` key\\n function readFromStorage(bytes32 slot_) external view returns (uint256 result_);\\n}\\n\",\"keccak256\":\"0xc4a0caed89a8670e1ccf159d03fa23bb29f69c579f522bb0e33b1b5cb106c40d\",\"license\":\"MIT\"},\"contracts/protocols/vault/interfaces/iVaultT1.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\ninterface IFluidVaultT1 {\\n /// @notice returns the vault id\\n function VAULT_ID() external view returns (uint256);\\n\\n /// @notice reads uint256 data `result_` from storage at a bytes32 storage `slot_` key.\\n function readFromStorage(bytes32 slot_) external view returns (uint256 result_);\\n\\n struct ConstantViews {\\n address liquidity;\\n address factory;\\n address adminImplementation;\\n address secondaryImplementation;\\n address supplyToken;\\n address borrowToken;\\n uint8 supplyDecimals;\\n uint8 borrowDecimals;\\n uint vaultId;\\n bytes32 liquiditySupplyExchangePriceSlot;\\n bytes32 liquidityBorrowExchangePriceSlot;\\n bytes32 liquidityUserSupplySlot;\\n bytes32 liquidityUserBorrowSlot;\\n }\\n\\n /// @notice returns all Vault constants\\n function constantsView() external view returns (ConstantViews memory constantsView_);\\n\\n /// @notice fetches the latest user position after a liquidation\\n function fetchLatestPosition(\\n int256 positionTick_,\\n uint256 positionTickId_,\\n uint256 positionRawDebt_,\\n uint256 tickData_\\n )\\n external\\n view\\n returns (\\n int256, // tick\\n uint256, // raw debt\\n uint256, // raw collateral\\n uint256, // branchID_\\n uint256 // branchData_\\n );\\n\\n /// @notice calculates the updated vault exchange prices\\n function updateExchangePrices(\\n uint256 vaultVariables2_\\n )\\n external\\n view\\n returns (\\n uint256 liqSupplyExPrice_,\\n uint256 liqBorrowExPrice_,\\n uint256 vaultSupplyExPrice_,\\n uint256 vaultBorrowExPrice_\\n );\\n\\n /// @notice calculates the updated vault exchange prices and writes them to storage\\n function updateExchangePricesOnStorage()\\n external\\n returns (\\n uint256 liqSupplyExPrice_,\\n uint256 liqBorrowExPrice_,\\n uint256 vaultSupplyExPrice_,\\n uint256 vaultBorrowExPrice_\\n );\\n\\n /// @notice returns the liquidity contract address\\n function LIQUIDITY() external view returns (address);\\n\\n function operate(\\n uint256 nftId_, // if 0 then new position\\n int256 newCol_, // if negative then withdraw\\n int256 newDebt_, // if negative then payback\\n address to_ // address at which the borrow & withdraw amount should go to. If address(0) then it'll go to msg.sender\\n )\\n external\\n payable\\n returns (\\n uint256, // nftId_\\n int256, // final supply amount. if - then withdraw\\n int256 // final borrow amount. if - then payback\\n );\\n \\n function liquidate(\\n uint256 debtAmt_,\\n uint256 colPerUnitDebt_, // min collateral needed per unit of debt in 1e18\\n address to_,\\n bool absorb_\\n ) external payable returns (uint actualDebtAmt_, uint actualColAmt_);\\n\\n function absorb() external;\\n\\n function rebalance() external payable returns (int supplyAmt_, int borrowAmt_);\\n\\n error FluidLiquidateResult(uint256 colLiquidated, uint256 debtLiquidated);\\n}\\n\",\"keccak256\":\"0xe0ec40a4531ecbcd7b8db25b4cd8529e0c284bb20eb40b7cf909fb8af0e3ca8b\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60c060405234801561001057600080fd5b50604051620013c7380380620013c783398101604081905261003191610097565b6001600160a01b03808316608081905290821660a052158061005a57506001600160a01b038116155b15610078576040516302fdcc4f60e31b815260040160405180910390fd5b50506100d1565b6001600160a01b038116811461009457600080fd5b50565b600080604083850312156100aa57600080fd5b82516100b58161007f565b60208401519092506100c68161007f565b809150509250929050565b60805160a0516112af620001186000396000818160710152818161040a01526105de01526000818160e201528181610254015281816104e5015261067901526112af6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80637f3e2b48116100505780637f3e2b48146100dd578063bd7b630d14610104578063f752d7571461012457600080fd5b80632dd310001461006c5780635bbf0e14146100bd575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d06100cb3660046108bd565b610137565b6040516100b49190610963565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b610117610112366004610a02565b610404565b6040516100b49190610a26565b6100d0610132366004610a02565b610772565b6060815167ffffffffffffffff81111561015357610153610786565b6040519080825280602002602001820160405280156101c557816020015b6101b2604051806080016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b8152602001906001900390816101715790505b50905061024660405180610180016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160001515815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60005b83518110156103fd577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663144128e88583815181106102a0576102a0610a6a565b60200260200101516040518263ffffffff1660e01b81526004016102c691815260200190565b610c4060405180830381865afa1580156102e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610308919061110c565b508092505083818151811061031f5761031f610a6a565b602002602001015183828151811061033957610339610a6a565b60200260200101516000018181525050816020015183828151811061036057610360610a6a565b60200260200101516020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508161012001518382815181106103b6576103b6610a6a565b602002602001015160400181815250508161014001518382815181106103de576103de610a6a565b6020908102919091010151606001526103f6816111e4565b9050610249565b5050919050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104979190611243565b6040517f03e883e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015291925060009160d2917f0000000000000000000000000000000000000000000000000000000000000000909116906303e883e090602401602060405180830381865afa15801561052e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105529190611243565b901c63ffffffff1690508067ffffffffffffffff81111561057557610575610786565b60405190808252806020026020018201604052801561059e578160200160208202803683370190505b50925060008060005b84811015610768576040517f4f6ccce7000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634f6ccce790602401602060405180830381865afa15801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e9190611243565b92508673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631949138e856040518263ffffffff1660e01b81526004016106d291815260200190565b602060405180830381865afa1580156106ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610713919061125c565b73ffffffffffffffffffffffffffffffffffffffff1603610758578286838151811061074157610741610a6a565b6020908102919091010152610755826111e4565b91505b610761816111e4565b90506105a7565b5050505050919050565b60606107806100cb83610404565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff811182821017156107d9576107d9610786565b60405290565b604051610180810167ffffffffffffffff811182821017156107d9576107d9610786565b60405160e0810167ffffffffffffffff811182821017156107d9576107d9610786565b604051610120810167ffffffffffffffff811182821017156107d9576107d9610786565b604051610160810167ffffffffffffffff811182821017156107d9576107d9610786565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156108b5576108b5610786565b604052919050565b600060208083850312156108d057600080fd5b823567ffffffffffffffff808211156108e857600080fd5b818501915085601f8301126108fc57600080fd5b81358181111561090e5761090e610786565b8060051b915061091f84830161086e565b818152918301840191848101908884111561093957600080fd5b938501935b838510156109575784358252938501939085019061093e565b98975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156109d0578151805185528681015173ffffffffffffffffffffffffffffffffffffffff168786015285810151868601526060908101519085015260809093019290850190600101610980565b5091979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ff57600080fd5b50565b600060208284031215610a1457600080fd5b8135610a1f816109dd565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015610a5e57835183529284019291840191600101610a42565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051610aa4816109dd565b919050565b80518015158114610aa457600080fd5b805160ff81168114610aa457600080fd5b60006101a08284031215610add57600080fd5b610ae56107b5565b9050610af082610a99565b8152610afe60208301610a99565b6020820152610b0f60408301610a99565b6040820152610b2060608301610a99565b6060820152610b3160808301610a99565b6080820152610b4260a08301610a99565b60a0820152610b5360c08301610ab9565b60c0820152610b6460e08301610ab9565b60e082015261010082810151908201526101208083015190820152610140808301519082015261016080830151908201526101809182015191810191909152919050565b805161ffff81168114610aa457600080fd5b60006101808284031215610bcd57600080fd5b610bd56107df565b9050610be082610ba8565b8152610bee60208301610ba8565b6020820152610bff60408301610ba8565b6040820152610c1060608301610ba8565b6060820152610c2160808301610ba8565b6080820152610c3260a08301610ba8565b60a0820152610c4360c08301610ba8565b60c0820152610c5460e08301610ba8565b60e0820152610100610c67818401610a99565b9082015261012082810151908201526101408083015190820152610160610c8f818401610a99565b9082015292915050565b60006101a08284031215610cac57600080fd5b610cb46107b5565b9050815181526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e082015261010080830151818301525061012080830151818301525061014080830151818301525061016080830151818301525061018080830151818301525092915050565b600060c08284031215610d5457600080fd5b60405160c0810181811067ffffffffffffffff82111715610d7757610d77610786565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000610100808385031215610dd057600080fd5b6040519081019067ffffffffffffffff82118183101715610df357610df3610786565b81604052809250835181526020840151602082015260408401516040820152606084015160608201526080840151608082015260a084015160a082015260c084015160c082015260e084015160e0820152505092915050565b60008183036101a0811215610e6057600080fd5b610e68610803565b9150825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215610ed057600080fd5b50610ed9610803565b60c0830151815260e0830151602082015261010083015160408201526101208301516060820152610140830151608082015261016083015160a082015261018083015160c08201528060c08301525092915050565b60006101208284031215610f4157600080fd5b610f49610826565b9050610f5482610aa9565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e082015261010080830151818301525092915050565b60006101608284031215610fc157600080fd5b610fc961084a565b9050610fd482610aa9565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e082015261010080830151818301525061012080830151818301525061014080830151818301525092915050565b6000610ac0828403121561105957600080fd5b611061610826565b905061106c82610a99565b815261107b8360208401610aca565b602082015261108e836101c08401610bba565b60408201526110a1836103408401610c99565b60608201526110b4836104e08401610d42565b60808201526110c7836105a08401610dbc565b60a08201526110da836106a08401610e4c565b60c08201526110ed836108408401610f2e565b60e0820152611100836109608401610fae565b61010082015292915050565b600080828403610c4081121561112157600080fd5b6101808082121561113157600080fd5b6111396107df565b91508451825261114b60208601610a99565b602083015261115c60408601610aa9565b604083015261116d60608601610aa9565b60608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e08301526101008086015181840152506101208086015181840152506101408086015181840152506101608086015181840152508193506111d986828701611046565b925050509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361123c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561125557600080fd5b5051919050565b60006020828403121561126e57600080fd5b8151610a1f816109dd56fea264697066735822122076f50c26015543d612e24229a37a80092d740036cc03f44b2c8ce5c642918e1f64736f6c63430008150033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100675760003560e01c80637f3e2b48116100505780637f3e2b48146100dd578063bd7b630d14610104578063f752d7571461012457600080fd5b80632dd310001461006c5780635bbf0e14146100bd575b600080fd5b6100937f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100d06100cb3660046108bd565b610137565b6040516100b49190610963565b6100937f000000000000000000000000000000000000000000000000000000000000000081565b610117610112366004610a02565b610404565b6040516100b49190610a26565b6100d0610132366004610a02565b610772565b6060815167ffffffffffffffff81111561015357610153610786565b6040519080825280602002602001820160405280156101c557816020015b6101b2604051806080016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b8152602001906001900390816101715790505b50905061024660405180610180016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160001515815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60005b83518110156103fd577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663144128e88583815181106102a0576102a0610a6a565b60200260200101516040518263ffffffff1660e01b81526004016102c691815260200190565b610c4060405180830381865afa1580156102e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610308919061110c565b508092505083818151811061031f5761031f610a6a565b602002602001015183828151811061033957610339610a6a565b60200260200101516000018181525050816020015183828151811061036057610360610a6a565b60200260200101516020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508161012001518382815181106103b6576103b6610a6a565b602002602001015160400181815250508161014001518382815181106103de576103de610a6a565b6020908102919091010151606001526103f6816111e4565b9050610249565b5050919050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610473573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104979190611243565b6040517f03e883e000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015291925060009160d2917f0000000000000000000000000000000000000000000000000000000000000000909116906303e883e090602401602060405180830381865afa15801561052e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105529190611243565b901c63ffffffff1690508067ffffffffffffffff81111561057557610575610786565b60405190808252806020026020018201604052801561059e578160200160208202803683370190505b50925060008060005b84811015610768576040517f4f6ccce7000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634f6ccce790602401602060405180830381865afa15801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e9190611243565b92508673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631949138e856040518263ffffffff1660e01b81526004016106d291815260200190565b602060405180830381865afa1580156106ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610713919061125c565b73ffffffffffffffffffffffffffffffffffffffff1603610758578286838151811061074157610741610a6a565b6020908102919091010152610755826111e4565b91505b610761816111e4565b90506105a7565b5050505050919050565b60606107806100cb83610404565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff811182821017156107d9576107d9610786565b60405290565b604051610180810167ffffffffffffffff811182821017156107d9576107d9610786565b60405160e0810167ffffffffffffffff811182821017156107d9576107d9610786565b604051610120810167ffffffffffffffff811182821017156107d9576107d9610786565b604051610160810167ffffffffffffffff811182821017156107d9576107d9610786565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156108b5576108b5610786565b604052919050565b600060208083850312156108d057600080fd5b823567ffffffffffffffff808211156108e857600080fd5b818501915085601f8301126108fc57600080fd5b81358181111561090e5761090e610786565b8060051b915061091f84830161086e565b818152918301840191848101908884111561093957600080fd5b938501935b838510156109575784358252938501939085019061093e565b98975050505050505050565b602080825282518282018190526000919060409081850190868401855b828110156109d0578151805185528681015173ffffffffffffffffffffffffffffffffffffffff168786015285810151868601526060908101519085015260809093019290850190600101610980565b5091979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ff57600080fd5b50565b600060208284031215610a1457600080fd5b8135610a1f816109dd565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015610a5e57835183529284019291840191600101610a42565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051610aa4816109dd565b919050565b80518015158114610aa457600080fd5b805160ff81168114610aa457600080fd5b60006101a08284031215610add57600080fd5b610ae56107b5565b9050610af082610a99565b8152610afe60208301610a99565b6020820152610b0f60408301610a99565b6040820152610b2060608301610a99565b6060820152610b3160808301610a99565b6080820152610b4260a08301610a99565b60a0820152610b5360c08301610ab9565b60c0820152610b6460e08301610ab9565b60e082015261010082810151908201526101208083015190820152610140808301519082015261016080830151908201526101809182015191810191909152919050565b805161ffff81168114610aa457600080fd5b60006101808284031215610bcd57600080fd5b610bd56107df565b9050610be082610ba8565b8152610bee60208301610ba8565b6020820152610bff60408301610ba8565b6040820152610c1060608301610ba8565b6060820152610c2160808301610ba8565b6080820152610c3260a08301610ba8565b60a0820152610c4360c08301610ba8565b60c0820152610c5460e08301610ba8565b60e0820152610100610c67818401610a99565b9082015261012082810151908201526101408083015190820152610160610c8f818401610a99565b9082015292915050565b60006101a08284031215610cac57600080fd5b610cb46107b5565b9050815181526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e082015261010080830151818301525061012080830151818301525061014080830151818301525061016080830151818301525061018080830151818301525092915050565b600060c08284031215610d5457600080fd5b60405160c0810181811067ffffffffffffffff82111715610d7757610d77610786565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000610100808385031215610dd057600080fd5b6040519081019067ffffffffffffffff82118183101715610df357610df3610786565b81604052809250835181526020840151602082015260408401516040820152606084015160608201526080840151608082015260a084015160a082015260c084015160c082015260e084015160e0820152505092915050565b60008183036101a0811215610e6057600080fd5b610e68610803565b9150825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4082011215610ed057600080fd5b50610ed9610803565b60c0830151815260e0830151602082015261010083015160408201526101208301516060820152610140830151608082015261016083015160a082015261018083015160c08201528060c08301525092915050565b60006101208284031215610f4157600080fd5b610f49610826565b9050610f5482610aa9565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e082015261010080830151818301525092915050565b60006101608284031215610fc157600080fd5b610fc961084a565b9050610fd482610aa9565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e082015261010080830151818301525061012080830151818301525061014080830151818301525092915050565b6000610ac0828403121561105957600080fd5b611061610826565b905061106c82610a99565b815261107b8360208401610aca565b602082015261108e836101c08401610bba565b60408201526110a1836103408401610c99565b60608201526110b4836104e08401610d42565b60808201526110c7836105a08401610dbc565b60a08201526110da836106a08401610e4c565b60c08201526110ed836108408401610f2e565b60e0820152611100836109608401610fae565b61010082015292915050565b600080828403610c4081121561112157600080fd5b6101808082121561113157600080fd5b6111396107df565b91508451825261114b60208601610a99565b602083015261115c60408601610aa9565b604083015261116d60608601610aa9565b60608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e08301526101008086015181840152506101208086015181840152506101408086015181840152506101608086015181840152508193506111d986828701611046565b925050509250929050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361123c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60006020828403121561125557600080fd5b5051919050565b60006020828403121561126e57600080fd5b8151610a1f816109dd56fea264697066735822122076f50c26015543d612e24229a37a80092d740036cc03f44b2c8ce5c642918e1f64736f6c63430008150033", "devdoc": { "kind": "dev", "methods": {}, "version": 1 }, "userdoc": { "errors": { "FluidVaultPositionsResolver__AddressZero()": [ { "notice": "thrown if an input param address is zero" } ] }, "kind": "user", "methods": { "constructor": { "notice": "constructor sets the immutable vault resolver and vault factory address" } }, "version": 1 }, "storageLayout": { "storage": [], "types": null } }