fluid-contracts-public/deployments/arbitrum/LendingFactory.json
2024-07-11 13:05:09 +00:00

610 lines
124 KiB
JSON

{
"address": "0x54B91A0D94cb471F37f949c60F7Fa7935b551D03",
"abi": [
{
"inputs": [
{
"internalType": "contract IFluidLiquidity",
"name": "liquidity_",
"type": "address"
},
{
"internalType": "address",
"name": "owner_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "errorId_",
"type": "uint256"
}
],
"name": "FluidLendingError",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "auth",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "allowed",
"type": "bool"
}
],
"name": "LogSetAuth",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "deployer",
"type": "address"
},
{
"indexed": true,
"internalType": "bool",
"name": "allowed",
"type": "bool"
}
],
"name": "LogSetDeployer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "string",
"name": "fTokenType",
"type": "string"
},
{
"indexed": true,
"internalType": "address",
"name": "creationCodePointer",
"type": "address"
}
],
"name": "LogSetFTokenCreationCode",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "count",
"type": "uint256"
},
{
"indexed": false,
"internalType": "string",
"name": "fTokenType",
"type": "string"
}
],
"name": "LogTokenCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"inputs": [],
"name": "LIQUIDITY",
"outputs": [
{
"internalType": "contract IFluidLiquidity",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "allTokens",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "asset_",
"type": "address"
},
{
"internalType": "string",
"name": "fTokenType_",
"type": "string"
}
],
"name": "computeToken",
"outputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "asset_",
"type": "address"
},
{
"internalType": "string",
"name": "fTokenType_",
"type": "string"
},
{
"internalType": "bool",
"name": "isNativeUnderlying_",
"type": "bool"
}
],
"name": "createToken",
"outputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "fTokenType_",
"type": "string"
}
],
"name": "fTokenCreationCode",
"outputs": [
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "fTokenTypes",
"outputs": [
{
"internalType": "string[]",
"name": "",
"type": "string[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "auth_",
"type": "address"
}
],
"name": "isAuth",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer_",
"type": "address"
}
],
"name": "isDeployer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "auth_",
"type": "address"
},
{
"internalType": "bool",
"name": "allowed_",
"type": "bool"
}
],
"name": "setAuth",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "deployer_",
"type": "address"
},
{
"internalType": "bool",
"name": "allowed_",
"type": "bool"
}
],
"name": "setDeployer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "fTokenType_",
"type": "string"
},
{
"internalType": "bytes",
"name": "creationCode_",
"type": "bytes"
}
],
"name": "setFTokenCreationCode",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"transactionHash": "0xf26f6cebb2048584f145aba9c33dab890e82992f1cfb793c985383f18725bf11",
"receipt": {
"to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
"from": "0x0Ed35B1609Ec45c7079E80d11149a52717e4859A",
"contractAddress": null,
"transactionIndex": 6,
"gasUsed": "4223131",
"logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000002020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000400000000000000000000020000000000000010000000000000000000000020000000000000000000100000000000000000000000000000000000000000000000",
"blockHash": "0x5f69c01bf2f21e53010b7bb82226be30ac6f0f551a35fb66285b25a225d4bcbd",
"transactionHash": "0xf26f6cebb2048584f145aba9c33dab890e82992f1cfb793c985383f18725bf11",
"logs": [
{
"transactionIndex": 6,
"blockNumber": 220431694,
"transactionHash": "0xf26f6cebb2048584f145aba9c33dab890e82992f1cfb793c985383f18725bf11",
"address": "0x54B91A0D94cb471F37f949c60F7Fa7935b551D03",
"topics": [
"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
"0x0000000000000000000000000000000000000000000000000000000000000000",
"0x0000000000000000000000004f6f977acdd1177dcd81ab83074855ecb9c2d49e"
],
"data": "0x",
"logIndex": 27,
"blockHash": "0x5f69c01bf2f21e53010b7bb82226be30ac6f0f551a35fb66285b25a225d4bcbd"
}
],
"blockNumber": 220431694,
"cumulativeGasUsed": "5995181",
"status": 1,
"byzantium": true
},
"args": [
"0x52Aa899454998Be5b000Ad077a46Bbe360F4e497",
"0x4F6F977aCDD1177DCD81aB83074855EcB9C2D49e"
],
"numDeployments": 1,
"solcInputHash": "e6a5031683da44e09521fe6a300ed302",
"metadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IFluidLiquidity\",\"name\":\"liquidity_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"errorId_\",\"type\":\"uint256\"}],\"name\":\"FluidLendingError\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"auth\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"LogSetAuth\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"LogSetDeployer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"string\",\"name\":\"fTokenType\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creationCodePointer\",\"type\":\"address\"}],\"name\":\"LogSetFTokenCreationCode\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"fTokenType\",\"type\":\"string\"}],\"name\":\"LogTokenCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LIQUIDITY\",\"outputs\":[{\"internalType\":\"contract IFluidLiquidity\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset_\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"fTokenType_\",\"type\":\"string\"}],\"name\":\"computeToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset_\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"fTokenType_\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isNativeUnderlying_\",\"type\":\"bool\"}],\"name\":\"createToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"fTokenType_\",\"type\":\"string\"}],\"name\":\"fTokenCreationCode\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fTokenTypes\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"auth_\",\"type\":\"address\"}],\"name\":\"isAuth\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"deployer_\",\"type\":\"address\"}],\"name\":\"isDeployer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"auth_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed_\",\"type\":\"bool\"}],\"name\":\"setAuth\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"deployer_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed_\",\"type\":\"bool\"}],\"name\":\"setDeployer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"fTokenType_\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"creationCode_\",\"type\":\"bytes\"}],\"name\":\"setFTokenCreationCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Note the deployed token starts out with no config at Liquidity contract. This must be done by Liquidity auths in a separate step, otherwise no deposits will be possible. This contract is not upgradeable. It supports adding new fToken creation codes for future new fToken types.\",\"kind\":\"dev\",\"methods\":{\"computeToken(address,string)\":{\"params\":{\"asset_\":\"address of the asset\",\"fTokenType_\":\"type of fToken: - if it's the native token, it should use `NativeUnderlying` - otherwise it should use `fToken` - could be more types available, check `fTokenTypes()`\"},\"returns\":{\"token_\":\" detemrinistic address of the computed token\"}},\"createToken(address,string,bool)\":{\"params\":{\"asset_\":\"address of the asset\",\"fTokenType_\":\"type of fToken: - if it's the native token, it should use `NativeUnderlying` - otherwise it should use `fToken` - could be more types available, check `fTokenTypes()`\",\"isNativeUnderlying_\":\"flag to signal fToken type that uses native underlying at Liquidity\"},\"returns\":{\"token_\":\" address of the created token\"}},\"setAuth(address,bool)\":{\"params\":{\"allowed_\":\"bool flag for whether address is allowed as auth or not\",\"auth_\":\"address to set auth value for\"}},\"setDeployer(address,bool)\":{\"params\":{\"allowed_\":\"bool flag for whether address is allowed as deployer or not\",\"deployer_\":\"address to set deployer value for\"}},\"setFTokenCreationCode(string,bytes)\":{\"params\":{\"creationCode_\":\"contract creation code. can be set to bytes(0) to remove a previously available `fTokenType_`\",\"fTokenType_\":\"the fToken Type used to refer the creation code\"}}},\"title\":\"Fluid LendingFactory\",\"version\":1},\"userdoc\":{\"events\":{\"LogSetAuth(address,bool)\":{\"notice\":\"emitted when an auth is modified by owner\"},\"LogSetDeployer(address,bool)\":{\"notice\":\"emitted when a deployer is modified by owner\"},\"LogSetFTokenCreationCode(string,address)\":{\"notice\":\"emitted when the creation code for an fTokenType is set\"},\"LogTokenCreated(address,address,uint256,string)\":{\"notice\":\"emitted when a new fToken is created\"}},\"kind\":\"user\",\"methods\":{\"LIQUIDITY()\":{\"notice\":\"address of the Liquidity contract.\"},\"allTokens()\":{\"notice\":\"list of all created tokens\"},\"computeToken(address,string)\":{\"notice\":\"computes deterministic token address for `asset_` for a lending protocol\"},\"constructor\":{\"notice\":\"initialize liquidity contract address & owner\"},\"createToken(address,string,bool)\":{\"notice\":\"creates token for `asset_` for a lending protocol with interest. Only callable by deployers.\"},\"fTokenCreationCode(string)\":{\"notice\":\"returns the creation code for a certain `fTokenType_`\"},\"fTokenTypes()\":{\"notice\":\"list of all fToken types that can be deployed\"},\"isAuth(address)\":{\"notice\":\"reads if a certain `auth_` address is an allowed auth or not. Owner is auth by default.\"},\"isDeployer(address)\":{\"notice\":\"reads if a certain `deployer_` address is an allowed deployer or not. Owner is deployer by default.\"},\"setAuth(address,bool)\":{\"notice\":\"Sets an address as allowed auth or not. Only callable by owner.\"},\"setDeployer(address,bool)\":{\"notice\":\"Sets an address as allowed deployer or not. Only callable by owner.\"},\"setFTokenCreationCode(string,bytes)\":{\"notice\":\"Sets the `creationCode_` bytecode for a certain `fTokenType_`. Only callable by auths.\"}},\"notice\":\"creates Fluid lending protocol fTokens, which are interacting with Fluid Liquidity. fTokens are ERC20 & ERC4626 compatible tokens that allow to deposit to Fluid Liquidity to earn interest. Tokens are created at a deterministic address (see `computeToken()`), only executable by allow-listed auths.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/protocols/lending/lendingFactory/main.sol\":\"FluidLendingFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"contracts/infiniteProxy/interfaces/iProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\ninterface IProxy {\\n function setAdmin(address newAdmin_) external;\\n\\n function setDummyImplementation(address newDummyImplementation_) external;\\n\\n function addImplementation(address implementation_, bytes4[] calldata sigs_) external;\\n\\n function removeImplementation(address implementation_) external;\\n\\n function getAdmin() external view returns (address);\\n\\n function getDummyImplementation() external view returns (address);\\n\\n function getImplementationSigs(address impl_) external view returns (bytes4[] memory);\\n\\n function getSigsImplementation(bytes4 sig_) external view returns (address);\\n\\n function readFromStorage(bytes32 slot_) external view returns (uint256 result_);\\n}\\n\",\"keccak256\":\"0xbb605491d4bac08e816248feecae7dd17cfc1877c88b2e555abece2970f5ea00\",\"license\":\"MIT\"},\"contracts/libraries/liquiditySlotsLink.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\n/// @notice library that helps in reading / working with storage slot data of Fluid Liquidity.\\n/// @dev as all data for Fluid Liquidity is internal, any data must be fetched directly through manual\\n/// slot reading through this library or, if gas usage is less important, through the FluidLiquidityResolver.\\nlibrary LiquiditySlotsLink {\\n /// @dev storage slot for status at Liquidity\\n uint256 internal constant LIQUIDITY_STATUS_SLOT = 1;\\n /// @dev storage slot for auths mapping at Liquidity\\n uint256 internal constant LIQUIDITY_AUTHS_MAPPING_SLOT = 2;\\n /// @dev storage slot for guardians mapping at Liquidity\\n uint256 internal constant LIQUIDITY_GUARDIANS_MAPPING_SLOT = 3;\\n /// @dev storage slot for user class mapping at Liquidity\\n uint256 internal constant LIQUIDITY_USER_CLASS_MAPPING_SLOT = 4;\\n /// @dev storage slot for exchangePricesAndConfig mapping at Liquidity\\n uint256 internal constant LIQUIDITY_EXCHANGE_PRICES_MAPPING_SLOT = 5;\\n /// @dev storage slot for rateData mapping at Liquidity\\n uint256 internal constant LIQUIDITY_RATE_DATA_MAPPING_SLOT = 6;\\n /// @dev storage slot for totalAmounts mapping at Liquidity\\n uint256 internal constant LIQUIDITY_TOTAL_AMOUNTS_MAPPING_SLOT = 7;\\n /// @dev storage slot for user supply double mapping at Liquidity\\n uint256 internal constant LIQUIDITY_USER_SUPPLY_DOUBLE_MAPPING_SLOT = 8;\\n /// @dev storage slot for user borrow double mapping at Liquidity\\n uint256 internal constant LIQUIDITY_USER_BORROW_DOUBLE_MAPPING_SLOT = 9;\\n /// @dev storage slot for listed tokens array at Liquidity\\n uint256 internal constant LIQUIDITY_LISTED_TOKENS_ARRAY_SLOT = 10;\\n\\n // --------------------------------\\n // @dev stacked uint256 storage slots bits position data for each:\\n\\n // ExchangePricesAndConfig\\n uint256 internal constant BITS_EXCHANGE_PRICES_BORROW_RATE = 0;\\n uint256 internal constant BITS_EXCHANGE_PRICES_FEE = 16;\\n uint256 internal constant BITS_EXCHANGE_PRICES_UTILIZATION = 30;\\n uint256 internal constant BITS_EXCHANGE_PRICES_UPDATE_THRESHOLD = 44;\\n uint256 internal constant BITS_EXCHANGE_PRICES_LAST_TIMESTAMP = 58;\\n uint256 internal constant BITS_EXCHANGE_PRICES_SUPPLY_EXCHANGE_PRICE = 91;\\n uint256 internal constant BITS_EXCHANGE_PRICES_BORROW_EXCHANGE_PRICE = 155;\\n uint256 internal constant BITS_EXCHANGE_PRICES_SUPPLY_RATIO = 219;\\n uint256 internal constant BITS_EXCHANGE_PRICES_BORROW_RATIO = 234;\\n\\n // RateData:\\n uint256 internal constant BITS_RATE_DATA_VERSION = 0;\\n // RateData: V1\\n uint256 internal constant BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_ZERO = 4;\\n uint256 internal constant BITS_RATE_DATA_V1_UTILIZATION_AT_KINK = 20;\\n uint256 internal constant BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_KINK = 36;\\n uint256 internal constant BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_MAX = 52;\\n // RateData: V2\\n uint256 internal constant BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_ZERO = 4;\\n uint256 internal constant BITS_RATE_DATA_V2_UTILIZATION_AT_KINK1 = 20;\\n uint256 internal constant BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK1 = 36;\\n uint256 internal constant BITS_RATE_DATA_V2_UTILIZATION_AT_KINK2 = 52;\\n uint256 internal constant BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK2 = 68;\\n uint256 internal constant BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_MAX = 84;\\n\\n // TotalAmounts\\n uint256 internal constant BITS_TOTAL_AMOUNTS_SUPPLY_WITH_INTEREST = 0;\\n uint256 internal constant BITS_TOTAL_AMOUNTS_SUPPLY_INTEREST_FREE = 64;\\n uint256 internal constant BITS_TOTAL_AMOUNTS_BORROW_WITH_INTEREST = 128;\\n uint256 internal constant BITS_TOTAL_AMOUNTS_BORROW_INTEREST_FREE = 192;\\n\\n // UserSupplyData\\n uint256 internal constant BITS_USER_SUPPLY_MODE = 0;\\n uint256 internal constant BITS_USER_SUPPLY_AMOUNT = 1;\\n uint256 internal constant BITS_USER_SUPPLY_PREVIOUS_WITHDRAWAL_LIMIT = 65;\\n uint256 internal constant BITS_USER_SUPPLY_LAST_UPDATE_TIMESTAMP = 129;\\n uint256 internal constant BITS_USER_SUPPLY_EXPAND_PERCENT = 162;\\n uint256 internal constant BITS_USER_SUPPLY_EXPAND_DURATION = 176;\\n uint256 internal constant BITS_USER_SUPPLY_BASE_WITHDRAWAL_LIMIT = 200;\\n uint256 internal constant BITS_USER_SUPPLY_IS_PAUSED = 255;\\n\\n // UserBorrowData\\n uint256 internal constant BITS_USER_BORROW_MODE = 0;\\n uint256 internal constant BITS_USER_BORROW_AMOUNT = 1;\\n uint256 internal constant BITS_USER_BORROW_PREVIOUS_BORROW_LIMIT = 65;\\n uint256 internal constant BITS_USER_BORROW_LAST_UPDATE_TIMESTAMP = 129;\\n uint256 internal constant BITS_USER_BORROW_EXPAND_PERCENT = 162;\\n uint256 internal constant BITS_USER_BORROW_EXPAND_DURATION = 176;\\n uint256 internal constant BITS_USER_BORROW_BASE_BORROW_LIMIT = 200;\\n uint256 internal constant BITS_USER_BORROW_MAX_BORROW_LIMIT = 218;\\n uint256 internal constant BITS_USER_BORROW_IS_PAUSED = 255;\\n\\n // --------------------------------\\n\\n /// @notice Calculating the slot ID for Liquidity contract for single mapping at `slot_` for `key_`\\n function calculateMappingStorageSlot(uint256 slot_, address key_) internal pure returns (bytes32) {\\n return keccak256(abi.encode(key_, slot_));\\n }\\n\\n /// @notice Calculating the slot ID for Liquidity contract for double mapping at `slot_` for `key1_` and `key2_`\\n function calculateDoubleMappingStorageSlot(\\n uint256 slot_,\\n address key1_,\\n address key2_\\n ) internal pure returns (bytes32) {\\n bytes32 intermediateSlot_ = keccak256(abi.encode(key1_, slot_));\\n return keccak256(abi.encode(key2_, intermediateSlot_));\\n }\\n}\\n\",\"keccak256\":\"0x85725ce90bbeb00541715fe58fb213b96706515e9eafdae357657995e9ac147d\",\"license\":\"BUSL-1.1\"},\"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\\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\":\"0xcacc14afd7880d3179d0089d65dad6714c377df4801a9ad79a499d0d079124c0\",\"license\":\"BUSL-1.1\"},\"contracts/liquidity/interfaces/iLiquidity.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\nimport { IProxy } from \\\"../../infiniteProxy/interfaces/iProxy.sol\\\";\\nimport { Structs as AdminModuleStructs } from \\\"../adminModule/structs.sol\\\";\\n\\ninterface IFluidLiquidityAdmin {\\n /// @notice adds/removes auths. Auths generally could be contracts which can have restricted actions defined on contract.\\n /// auths can be helpful in reducing governance overhead where it's not needed.\\n /// @param authsStatus_ array of structs setting allowed status for an address.\\n /// status true => add auth, false => remove auth\\n function updateAuths(AdminModuleStructs.AddressBool[] calldata authsStatus_) external;\\n\\n /// @notice adds/removes guardians. Only callable by Governance.\\n /// @param guardiansStatus_ array of structs setting allowed status for an address.\\n /// status true => add guardian, false => remove guardian\\n function updateGuardians(AdminModuleStructs.AddressBool[] calldata guardiansStatus_) external;\\n\\n /// @notice changes the revenue collector address (contract that is sent revenue). Only callable by Governance.\\n /// @param revenueCollector_ new revenue collector address\\n function updateRevenueCollector(address revenueCollector_) external;\\n\\n /// @notice changes current status, e.g. for pausing or unpausing all user operations. Only callable by Auths.\\n /// @param newStatus_ new status\\n /// status = 2 -> pause, status = 1 -> resume.\\n function changeStatus(uint256 newStatus_) external;\\n\\n /// @notice update tokens rate data version 1. Only callable by Auths.\\n /// @param tokensRateData_ array of RateDataV1Params with rate data to set for each token\\n function updateRateDataV1s(AdminModuleStructs.RateDataV1Params[] calldata tokensRateData_) external;\\n\\n /// @notice update tokens rate data version 2. Only callable by Auths.\\n /// @param tokensRateData_ array of RateDataV2Params with rate data to set for each token\\n function updateRateDataV2s(AdminModuleStructs.RateDataV2Params[] calldata tokensRateData_) external;\\n\\n /// @notice updates token configs: fee charge on borrowers interest & storage update utilization threshold.\\n /// Only callable by Auths.\\n /// @param tokenConfigs_ contains token address, fee & utilization threshold\\n function updateTokenConfigs(AdminModuleStructs.TokenConfig[] calldata tokenConfigs_) external;\\n\\n /// @notice updates user classes: 0 is for new protocols, 1 is for established protocols.\\n /// Only callable by Auths.\\n /// @param userClasses_ struct array of uint256 value to assign for each user address\\n function updateUserClasses(AdminModuleStructs.AddressUint256[] calldata userClasses_) external;\\n\\n /// @notice sets user supply configs per token basis. Eg: with interest or interest-free and automated limits.\\n /// Only callable by Auths.\\n /// @param userSupplyConfigs_ struct array containing user supply config, see `UserSupplyConfig` struct for more info\\n function updateUserSupplyConfigs(AdminModuleStructs.UserSupplyConfig[] memory userSupplyConfigs_) external;\\n\\n /// @notice setting user borrow configs per token basis. Eg: with interest or interest-free and automated limits.\\n /// Only callable by Auths.\\n /// @param userBorrowConfigs_ struct array containing user borrow config, see `UserBorrowConfig` struct for more info\\n function updateUserBorrowConfigs(AdminModuleStructs.UserBorrowConfig[] memory userBorrowConfigs_) external;\\n\\n /// @notice pause operations for a particular user in class 0 (class 1 users can't be paused by guardians).\\n /// Only callable by Guardians.\\n /// @param user_ address of user to pause operations for\\n /// @param supplyTokens_ token addresses to pause withdrawals for\\n /// @param borrowTokens_ token addresses to pause borrowings for\\n function pauseUser(address user_, address[] calldata supplyTokens_, address[] calldata borrowTokens_) external;\\n\\n /// @notice unpause operations for a particular user in class 0 (class 1 users can't be paused by guardians).\\n /// Only callable by Guardians.\\n /// @param user_ address of user to unpause operations for\\n /// @param supplyTokens_ token addresses to unpause withdrawals for\\n /// @param borrowTokens_ token addresses to unpause borrowings for\\n function unpauseUser(address user_, address[] calldata supplyTokens_, address[] calldata borrowTokens_) external;\\n\\n /// @notice collects revenue for tokens to configured revenueCollector address.\\n /// @param tokens_ array of tokens to collect revenue for\\n /// @dev Note that this can revert if token balance is < revenueAmount (utilization > 100%)\\n function collectRevenue(address[] calldata tokens_) external;\\n\\n /// @notice gets the current updated exchange prices for n tokens and updates all prices, rates related data in storage.\\n /// @param tokens_ tokens to update exchange prices for\\n /// @return supplyExchangePrices_ new supply rates of overall system for each token\\n /// @return borrowExchangePrices_ new borrow rates of overall system for each token\\n function updateExchangePrices(\\n address[] calldata tokens_\\n ) external returns (uint256[] memory supplyExchangePrices_, uint256[] memory borrowExchangePrices_);\\n}\\n\\ninterface IFluidLiquidityLogic is IFluidLiquidityAdmin {\\n /// @notice Single function which handles supply, withdraw, borrow & payback\\n /// @param token_ address of token (0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE for native)\\n /// @param supplyAmount_ if +ve then supply, if -ve then withdraw, if 0 then nothing\\n /// @param borrowAmount_ if +ve then borrow, if -ve then payback, if 0 then nothing\\n /// @param withdrawTo_ if withdrawal then to which address\\n /// @param borrowTo_ if borrow then to which address\\n /// @param callbackData_ callback data passed to `liquidityCallback` method of protocol\\n /// @return memVar3_ updated supplyExchangePrice\\n /// @return memVar4_ updated borrowExchangePrice\\n /// @dev to trigger skipping in / out transfers when in&out amounts balance themselves out (gas optimization):\\n /// - supply(+) == borrow(+), withdraw(-) == payback(-).\\n /// - `withdrawTo_` / `borrowTo_` must be msg.sender (protocol)\\n /// - `callbackData_` MUST be encoded so that \\\"from\\\" address is at last 20 bytes (if this optimization is desired),\\n /// also for native token operations where liquidityCallback is not triggered!\\n /// from address must come at last position if there is more data. I.e. encode like:\\n /// abi.encode(otherVar1, otherVar2, FROM_ADDRESS). Note dynamic types used with abi.encode come at the end\\n /// so if dynamic types are needed, you must use abi.encodePacked to ensure the from address is at the end.\\n function operate(\\n address token_,\\n int256 supplyAmount_,\\n int256 borrowAmount_,\\n address withdrawTo_,\\n address borrowTo_,\\n bytes calldata callbackData_\\n ) external payable returns (uint256 memVar3_, uint256 memVar4_);\\n}\\n\\ninterface IFluidLiquidity is IProxy, IFluidLiquidityLogic {}\\n\",\"keccak256\":\"0xc81ac0cfc8183ec57ec4e488b07a4f6d1ecd79787e0aaf0dcfdd0b9b7ac0fc84\",\"license\":\"MIT\"},\"contracts/protocols/lending/error.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nabstract contract Error {\\n error FluidLendingError(uint256 errorId_);\\n}\\n\",\"keccak256\":\"0x8bbab41073bf694d12cc3ce8581ce657ae0eb3ded19677bcce438d2299835a98\",\"license\":\"BUSL-1.1\"},\"contracts/protocols/lending/errorTypes.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nlibrary ErrorTypes {\\n /***********************************|\\n | fToken | \\n |__________________________________*/\\n\\n /// @notice thrown when a deposit amount is too small to increase BigMath stored balance in Liquidity.\\n /// precision of BigMath is 1e12, so if token holds 120_000_000_000 USDC, min amount to make a difference would be 0.1 USDC.\\n /// i.e. user would send a very small deposit which mints no shares -> revert\\n uint256 internal constant fToken__DepositInsignificant = 20001;\\n\\n /// @notice thrown when minimum output amount is not reached, e.g. for minimum shares minted (deposit) or\\n /// minimum assets received (redeem)\\n uint256 internal constant fToken__MinAmountOut = 20002;\\n\\n /// @notice thrown when maximum amount is surpassed, e.g. for maximum shares burned (withdraw) or\\n /// maximum assets input (mint)\\n uint256 internal constant fToken__MaxAmount = 20003;\\n\\n /// @notice thrown when invalid params are sent to a method, e.g. zero address\\n uint256 internal constant fToken__InvalidParams = 20004;\\n\\n /// @notice thrown when an unauthorized caller is trying to execute an auth-protected method\\n uint256 internal constant fToken__Unauthorized = 20005;\\n\\n /// @notice thrown when a with permit / signature method is called from msg.sender that is the owner.\\n /// Should call the method without permit instead if msg.sender is the owner.\\n uint256 internal constant fToken__PermitFromOwnerCall = 20006;\\n\\n /// @notice thrown when a reentrancy is detected.\\n uint256 internal constant fToken__Reentrancy = 20007;\\n\\n /// @notice thrown when _tokenExchangePrice overflows type(uint64).max\\n uint256 internal constant fToken__ExchangePriceOverflow = 20008;\\n\\n /// @notice thrown when msg.sender is not rebalancer\\n uint256 internal constant fToken__NotRebalancer = 20009;\\n\\n /// @notice thrown when rebalance is called with msg.value > 0 for non NativeUnderlying fToken\\n uint256 internal constant fToken__NotNativeUnderlying = 20010;\\n\\n /// @notice thrown when the received new liquidity exchange price is of unexpected value (< than the old one)\\n uint256 internal constant fToken__LiquidityExchangePriceUnexpected = 20011;\\n\\n /***********************************|\\n | fToken Native Underlying | \\n |__________________________________*/\\n\\n /// @notice thrown when native deposit is called but sent along `msg.value` does not cover the deposit amount\\n uint256 internal constant fTokenNativeUnderlying__TransferInsufficient = 21001;\\n\\n /// @notice thrown when a liquidity callback is called for a native token operation\\n uint256 internal constant fTokenNativeUnderlying__UnexpectedLiquidityCallback = 21002;\\n\\n /***********************************|\\n | Lending Factory | \\n |__________________________________*/\\n\\n /// @notice thrown when a method is called with invalid params\\n uint256 internal constant LendingFactory__InvalidParams = 22001;\\n\\n /// @notice thrown when the provided input param address is zero\\n uint256 internal constant LendingFactory__ZeroAddress = 22002;\\n\\n /// @notice thrown when the token already exists\\n uint256 internal constant LendingFactory__TokenExists = 22003;\\n\\n /// @notice thrown when the fToken has not yet been configured at Liquidity\\n uint256 internal constant LendingFactory__LiquidityNotConfigured = 22004;\\n\\n /// @notice thrown when an unauthorized caller is trying to execute an auth-protected method\\n uint256 internal constant LendingFactory__Unauthorized = 22005;\\n\\n /***********************************|\\n | Lending Rewards Rate Model | \\n |__________________________________*/\\n\\n /// @notice thrown when invalid params are given as input\\n uint256 internal constant LendingRewardsRateModel__InvalidParams = 23001;\\n\\n /// @notice thrown when calculated rewards rate is exceeding the maximum rate\\n uint256 internal constant LendingRewardsRateModel__MaxRate = 23002;\\n\\n /// @notice thrown when start is called by any other address other than initiator\\n uint256 internal constant LendingRewardsRateModel__NotTheInitiator = 23003;\\n\\n /// @notice thrown when start is called after the rewards are already started\\n uint256 internal constant LendingRewardsRateModel__AlreadyStarted = 23004;\\n\\n /// @notice thrown when the provided input param address is zero\\n uint256 internal constant LendingRewardsRateModel__ZeroAddress = 23005;\\n}\\n\",\"keccak256\":\"0x433407a36dd63694d7b18185e5c5508f39c98599975b98ede0077aab9f69b952\",\"license\":\"BUSL-1.1\"},\"contracts/protocols/lending/interfaces/iLendingFactory.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\nimport { IFluidLiquidity } from \\\"../../../liquidity/interfaces/iLiquidity.sol\\\";\\n\\ninterface IFluidLendingFactoryAdmin {\\n /// @notice reads if a certain `auth_` address is an allowed auth or not. Owner is auth by default.\\n function isAuth(address auth_) external view returns (bool);\\n\\n /// @notice Sets an address as allowed auth or not. Only callable by owner.\\n /// @param auth_ address to set auth value for\\n /// @param allowed_ bool flag for whether address is allowed as auth or not\\n function setAuth(address auth_, bool allowed_) external;\\n\\n /// @notice reads if a certain `deployer_` address is an allowed deployer or not. Owner is deployer by default.\\n function isDeployer(address deployer_) external view returns (bool);\\n\\n /// @notice Sets an address as allowed deployer or not. Only callable by owner.\\n /// @param deployer_ address to set deployer value for\\n /// @param allowed_ bool flag for whether address is allowed as deployer or not\\n function setDeployer(address deployer_, bool allowed_) external;\\n\\n /// @notice Sets the `creationCode_` bytecode for a certain `fTokenType_`. Only callable by auths.\\n /// @param fTokenType_ the fToken Type used to refer the creation code\\n /// @param creationCode_ contract creation code. can be set to bytes(0) to remove a previously available `fTokenType_`\\n function setFTokenCreationCode(string memory fTokenType_, bytes calldata creationCode_) external;\\n\\n /// @notice creates token for `asset_` for a lending protocol with interest. Only callable by deployers.\\n /// @param asset_ address of the asset\\n /// @param fTokenType_ type of fToken:\\n /// - if it's the native token, it should use `NativeUnderlying`\\n /// - otherwise it should use `fToken`\\n /// - could be more types available, check `fTokenTypes()`\\n /// @param isNativeUnderlying_ flag to signal fToken type that uses native underlying at Liquidity\\n /// @return token_ address of the created token\\n function createToken(\\n address asset_,\\n string calldata fTokenType_,\\n bool isNativeUnderlying_\\n ) external returns (address token_);\\n}\\n\\ninterface IFluidLendingFactory is IFluidLendingFactoryAdmin {\\n /// @notice list of all created tokens\\n function allTokens() external view returns (address[] memory);\\n\\n /// @notice list of all fToken types that can be deployed\\n function fTokenTypes() external view returns (string[] memory);\\n\\n /// @notice returns the creation code for a certain `fTokenType_`\\n function fTokenCreationCode(string memory fTokenType_) external view returns (bytes memory);\\n\\n /// @notice address of the Liquidity contract.\\n function LIQUIDITY() external view returns (IFluidLiquidity);\\n\\n /// @notice computes deterministic token address for `asset_` for a lending protocol\\n /// @param asset_ address of the asset\\n /// @param fTokenType_ type of fToken:\\n /// - if it's the native token, it should use `NativeUnderlying`\\n /// - otherwise it should use `fToken`\\n /// - could be more types available, check `fTokenTypes()`\\n /// @return token_ detemrinistic address of the computed token\\n function computeToken(address asset_, string calldata fTokenType_) external view returns (address token_);\\n}\\n\",\"keccak256\":\"0x90cc641714853b9ad77c2bf0653d8e558b670cbcc646dbce96d26f92842dbc66\",\"license\":\"MIT\"},\"contracts/protocols/lending/lendingFactory/events.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { IFluidLendingFactory } from \\\"../interfaces/iLendingFactory.sol\\\";\\n\\nabstract contract Events {\\n /// @notice emitted when a new fToken is created\\n event LogTokenCreated(address indexed token, address indexed asset, uint256 indexed count, string fTokenType);\\n\\n /// @notice emitted when an auth is modified by owner\\n event LogSetAuth(address indexed auth, bool indexed allowed);\\n\\n /// @notice emitted when a deployer is modified by owner\\n event LogSetDeployer(address indexed deployer, bool indexed allowed);\\n\\n /// @notice emitted when the creation code for an fTokenType is set\\n event LogSetFTokenCreationCode(string indexed fTokenType, address indexed creationCodePointer);\\n}\\n\",\"keccak256\":\"0x3085e792cfa1c328efb7c6b462cc91512326494d9111d9fbd8f3c79d7762178a\",\"license\":\"BUSL-1.1\"},\"contracts/protocols/lending/lendingFactory/main.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { CREATE3 } from \\\"solmate/src/utils/CREATE3.sol\\\";\\nimport { SSTORE2 } from \\\"solmate/src/utils/SSTORE2.sol\\\";\\nimport { Owned } from \\\"solmate/src/auth/Owned.sol\\\";\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nimport { IFluidLiquidity } from \\\"../../../liquidity/interfaces/iLiquidity.sol\\\";\\nimport { IFluidLendingFactory, IFluidLendingFactoryAdmin } from \\\"../interfaces/iLendingFactory.sol\\\";\\nimport { LiquiditySlotsLink } from \\\"../../../libraries/liquiditySlotsLink.sol\\\";\\nimport { ErrorTypes } from \\\"../errorTypes.sol\\\";\\nimport { Error } from \\\"../error.sol\\\";\\nimport { Events } from \\\"./events.sol\\\";\\n\\nabstract contract LendingFactoryVariables is Owned, Error, IFluidLendingFactory {\\n /*//////////////////////////////////////////////////////////////\\n CONSTANTS / IMMUTABLES\\n //////////////////////////////////////////////////////////////*/\\n\\n /// @inheritdoc IFluidLendingFactory\\n IFluidLiquidity public immutable LIQUIDITY;\\n\\n /// @dev address that is mapped to the chain native token\\n address internal constant _NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\\n\\n /*//////////////////////////////////////////////////////////////\\n STORAGE VARIABLES\\n //////////////////////////////////////////////////////////////*/\\n\\n // ------------ storage variables from inherited contracts (Owned) come before vars here --------\\n\\n // ----------------------- slot 0 ---------------------------\\n // address public owner;\\n\\n // 12 bytes empty\\n\\n // ----------------------- slot 1 ---------------------------\\n /// @dev auths can update rewards related config at created fToken contracts.\\n /// owner can add/remove auths.\\n /// Owner is auth by default.\\n mapping(address => uint256) internal _auths;\\n\\n // ----------------------- slot 2 ---------------------------\\n /// @dev deployers can deploy new fTokens.\\n /// owner can add/remove deployers.\\n /// Owner is deployer by default.\\n mapping(address => uint256) internal _deployers;\\n\\n // ----------------------- slot 3 ---------------------------\\n /// @dev list of all created tokens.\\n /// Solidity creates an automatic getter only to fetch at a certain position, so explicitly define a getter that returns all.\\n address[] internal _allTokens;\\n\\n // ----------------------- slot 4 ---------------------------\\n\\n /// @dev available fTokenTypes for deployment. At least EIP2612Deposits, Permit2Deposits, NativeUnderlying.\\n /// Solidity creates an automatic getter only to fetch at a certain position, so explicitly define a getter that returns all.\\n string[] internal _fTokenTypes;\\n\\n // ----------------------- slot 5 ---------------------------\\n\\n /// @dev fToken creation code for each fTokenType, accessed via SSTORE2.\\n /// maps keccak256(abi.encode(fTokenType)) -> SSTORE2 written creation code for the fToken contract\\n mapping(bytes32 => address) internal _fTokenCreationCodePointers;\\n\\n /*//////////////////////////////////////////////////////////////\\n CONSTRUCTOR\\n //////////////////////////////////////////////////////////////*/\\n\\n constructor(IFluidLiquidity liquidity_, address owner_) Owned(owner_) {\\n if (owner_ == address(0)) {\\n // Owned does not have a zero check for owner_\\n revert FluidLendingError(ErrorTypes.LendingFactory__ZeroAddress);\\n }\\n\\n LIQUIDITY = liquidity_;\\n }\\n\\n /// @inheritdoc IFluidLendingFactory\\n function allTokens() public view returns (address[] memory) {\\n return _allTokens;\\n }\\n\\n /// @inheritdoc IFluidLendingFactory\\n function fTokenTypes() public view returns (string[] memory) {\\n return _fTokenTypes;\\n }\\n\\n /// @inheritdoc IFluidLendingFactory\\n function fTokenCreationCode(string memory fTokenType_) public view returns (bytes memory) {\\n address creationCodePointer_ = _fTokenCreationCodePointers[keccak256(abi.encode(fTokenType_))];\\n return creationCodePointer_ == address(0) ? new bytes(0) : SSTORE2.read(creationCodePointer_);\\n }\\n}\\n\\nabstract contract LendingFactoryAdmin is LendingFactoryVariables, Events {\\n /// @dev validates that an address is not the zero address\\n modifier validAddress(address value_) {\\n if (value_ == address(0)) {\\n revert FluidLendingError(ErrorTypes.LendingFactory__ZeroAddress);\\n }\\n _;\\n }\\n\\n /// @dev validates that msg.sender is auth or owner\\n modifier onlyAuths() {\\n if (!isAuth(msg.sender)) {\\n revert FluidLendingError(ErrorTypes.LendingFactory__Unauthorized);\\n }\\n _;\\n }\\n\\n /// @dev validates that msg.sender is deployer or owner\\n modifier onlyDeployers() {\\n if (!isDeployer(msg.sender)) {\\n revert FluidLendingError(ErrorTypes.LendingFactory__Unauthorized);\\n }\\n _;\\n }\\n\\n /// @inheritdoc IFluidLendingFactoryAdmin\\n function isAuth(address auth_) public view returns (bool) {\\n return auth_ == owner || _auths[auth_] == 1;\\n }\\n\\n /// @inheritdoc IFluidLendingFactoryAdmin\\n function isDeployer(address deployer_) public view returns (bool) {\\n return deployer_ == owner || _deployers[deployer_] == 1;\\n }\\n\\n /// @inheritdoc IFluidLendingFactoryAdmin\\n function setAuth(address auth_, bool allowed_) external onlyOwner validAddress(auth_) {\\n _auths[auth_] = allowed_ ? 1 : 0;\\n\\n emit LogSetAuth(auth_, allowed_);\\n }\\n\\n /// @inheritdoc IFluidLendingFactoryAdmin\\n function setDeployer(address deployer_, bool allowed_) external onlyOwner validAddress(deployer_) {\\n _deployers[deployer_] = allowed_ ? 1 : 0;\\n\\n emit LogSetDeployer(deployer_, allowed_);\\n }\\n\\n /// @inheritdoc IFluidLendingFactoryAdmin\\n function setFTokenCreationCode(string memory fTokenType_, bytes calldata creationCode_) external onlyAuths {\\n uint256 length_ = _fTokenTypes.length;\\n bytes32 fTokenTypeHash_ = keccak256(abi.encode(fTokenType_));\\n\\n if (creationCode_.length == 0) {\\n // remove any previously stored creation code for `fTokenType_`\\n delete _fTokenCreationCodePointers[keccak256(abi.encode(fTokenType_))];\\n\\n // remove key from array _fTokenTypes. _fTokenTypes is most likely an array of very few elements,\\n // where setFTokenCreationCode is a rarely called method and the removal of an fTokenType is even more rare.\\n // So gas cost is not really an issue here but even if it were, this should still be cheaper than having\\n // an additional mapping like with an OpenZeppelin EnumerableSet\\n for (uint256 i; i < length_; ++i) {\\n if (keccak256(abi.encode(_fTokenTypes[i])) == fTokenTypeHash_) {\\n _fTokenTypes[i] = _fTokenTypes[length_ - 1];\\n _fTokenTypes.pop();\\n break;\\n }\\n }\\n\\n emit LogSetFTokenCreationCode(fTokenType_, address(0));\\n } else {\\n // write creation code to SSTORE2 pointer and set in mapping\\n address creationCodePointer_ = SSTORE2.write(creationCode_);\\n _fTokenCreationCodePointers[keccak256(abi.encode(fTokenType_))] = creationCodePointer_;\\n\\n // make sure `fTokenType_` is present in array _fTokenTypes\\n bool isPresent_;\\n for (uint256 i; i < length_; ++i) {\\n if (keccak256(abi.encode(_fTokenTypes[i])) == fTokenTypeHash_) {\\n isPresent_ = true;\\n break;\\n }\\n }\\n if (!isPresent_) {\\n _fTokenTypes.push(fTokenType_);\\n }\\n\\n emit LogSetFTokenCreationCode(fTokenType_, creationCodePointer_);\\n }\\n }\\n\\n /// @inheritdoc IFluidLendingFactoryAdmin\\n function createToken(\\n address asset_,\\n string calldata fTokenType_,\\n bool isNativeUnderlying_\\n ) external validAddress(asset_) onlyDeployers returns (address token_) {\\n address creationCodePointer_ = _fTokenCreationCodePointers[keccak256(abi.encode(fTokenType_))];\\n if (creationCodePointer_ == address(0)) {\\n revert FluidLendingError(ErrorTypes.LendingFactory__InvalidParams);\\n }\\n\\n bytes32 salt_ = _getSalt(asset_, fTokenType_);\\n\\n if (Address.isContract(CREATE3.getDeployed(salt_))) {\\n // revert if token already exists (Solmate CREATE3 does not check before deploying)\\n revert FluidLendingError(ErrorTypes.LendingFactory__TokenExists);\\n }\\n\\n bytes32 liquidityExchangePricesSlot_ = LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_EXCHANGE_PRICES_MAPPING_SLOT,\\n // native underlying always uses the native token at Liquidity, but also supports WETH\\n isNativeUnderlying_ ? _NATIVE_TOKEN_ADDRESS : asset_\\n );\\n if (LIQUIDITY.readFromStorage(liquidityExchangePricesSlot_) == 0) {\\n // revert if fToken has not been configured at Liquidity contract yet (exchange prices config)\\n revert FluidLendingError(ErrorTypes.LendingFactory__LiquidityNotConfigured);\\n }\\n\\n // Use CREATE3 for deterministic deployments. Unfortunately it has 55k gas overhead\\n token_ = CREATE3.deploy(\\n salt_,\\n abi.encodePacked(\\n SSTORE2.read(creationCodePointer_), // creation code\\n abi.encode(LIQUIDITY, address(this), asset_) // constructor params\\n ),\\n 0\\n );\\n\\n // Add the created token to the allTokens array\\n _allTokens.push(token_);\\n\\n // Emit the TokenCreated event\\n emit LogTokenCreated(token_, asset_, _allTokens.length, fTokenType_);\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n INTERNAL\\n //////////////////////////////////////////////////////////////*/\\n\\n /// @dev gets the CREATE3 salt for `asset_` and `fTokenType_`\\n function _getSalt(address asset_, string calldata fTokenType_) internal pure returns (bytes32) {\\n return keccak256(abi.encode(asset_, fTokenType_));\\n }\\n}\\n\\n/// @title Fluid LendingFactory\\n/// @notice creates Fluid lending protocol fTokens, which are interacting with Fluid Liquidity.\\n/// fTokens are ERC20 & ERC4626 compatible tokens that allow to deposit to Fluid Liquidity to earn interest.\\n/// Tokens are created at a deterministic address (see `computeToken()`), only executable by allow-listed auths.\\n/// @dev Note the deployed token starts out with no config at Liquidity contract.\\n/// This must be done by Liquidity auths in a separate step, otherwise no deposits will be possible.\\n/// This contract is not upgradeable. It supports adding new fToken creation codes for future new fToken types.\\ncontract FluidLendingFactory is LendingFactoryVariables, LendingFactoryAdmin {\\n /// @notice initialize liquidity contract address & owner\\n constructor(\\n IFluidLiquidity liquidity_,\\n address owner_\\n ) validAddress(address(liquidity_)) validAddress(owner) LendingFactoryVariables(liquidity_, owner_) {}\\n\\n /// @inheritdoc IFluidLendingFactory\\n function computeToken(address asset_, string calldata fTokenType_) public view returns (address token_) {\\n return CREATE3.getDeployed(_getSalt(asset_, fTokenType_));\\n }\\n}\\n\",\"keccak256\":\"0xd80e1afc649a53eca7f8ed0f905456c050378adc59bdf30663df89898ff87b88\",\"license\":\"BUSL-1.1\"},\"solmate/src/auth/Owned.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Simple single owner authorization mixin.\\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)\\nabstract contract Owned {\\n /*//////////////////////////////////////////////////////////////\\n EVENTS\\n //////////////////////////////////////////////////////////////*/\\n\\n event OwnershipTransferred(address indexed user, address indexed newOwner);\\n\\n /*//////////////////////////////////////////////////////////////\\n OWNERSHIP STORAGE\\n //////////////////////////////////////////////////////////////*/\\n\\n address public owner;\\n\\n modifier onlyOwner() virtual {\\n require(msg.sender == owner, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n CONSTRUCTOR\\n //////////////////////////////////////////////////////////////*/\\n\\n constructor(address _owner) {\\n owner = _owner;\\n\\n emit OwnershipTransferred(address(0), _owner);\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n OWNERSHIP LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n owner = newOwner;\\n\\n emit OwnershipTransferred(msg.sender, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xfedb27d14c508342c33eb067c9a02eabcdb0f9dcf93b04ded1001f580d12d0ea\",\"license\":\"AGPL-3.0-only\"},\"solmate/src/utils/Bytes32AddressLib.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Library for converting between addresses and bytes32 values.\\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Bytes32AddressLib.sol)\\nlibrary Bytes32AddressLib {\\n function fromLast20Bytes(bytes32 bytesValue) internal pure returns (address) {\\n return address(uint160(uint256(bytesValue)));\\n }\\n\\n function fillLast12Bytes(address addressValue) internal pure returns (bytes32) {\\n return bytes32(bytes20(addressValue));\\n }\\n}\\n\",\"keccak256\":\"0xe709c9f2c6fb8bfe1158fa31967c0a2109844c52079fe4e327baec82fb87acb6\",\"license\":\"AGPL-3.0-only\"},\"solmate/src/utils/CREATE3.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\nimport {Bytes32AddressLib} from \\\"./Bytes32AddressLib.sol\\\";\\n\\n/// @notice Deploy to deterministic addresses without an initcode factor.\\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/CREATE3.sol)\\n/// @author Modified from 0xSequence (https://github.com/0xSequence/create3/blob/master/contracts/Create3.sol)\\nlibrary CREATE3 {\\n using Bytes32AddressLib for bytes32;\\n\\n //--------------------------------------------------------------------------------//\\n // Opcode | Opcode + Arguments | Description | Stack View //\\n //--------------------------------------------------------------------------------//\\n // 0x36 | 0x36 | CALLDATASIZE | size //\\n // 0x3d | 0x3d | RETURNDATASIZE | 0 size //\\n // 0x3d | 0x3d | RETURNDATASIZE | 0 0 size //\\n // 0x37 | 0x37 | CALLDATACOPY | //\\n // 0x36 | 0x36 | CALLDATASIZE | size //\\n // 0x3d | 0x3d | RETURNDATASIZE | 0 size //\\n // 0x34 | 0x34 | CALLVALUE | value 0 size //\\n // 0xf0 | 0xf0 | CREATE | newContract //\\n //--------------------------------------------------------------------------------//\\n // Opcode | Opcode + Arguments | Description | Stack View //\\n //--------------------------------------------------------------------------------//\\n // 0x67 | 0x67XXXXXXXXXXXXXXXX | PUSH8 bytecode | bytecode //\\n // 0x3d | 0x3d | RETURNDATASIZE | 0 bytecode //\\n // 0x52 | 0x52 | MSTORE | //\\n // 0x60 | 0x6008 | PUSH1 08 | 8 //\\n // 0x60 | 0x6018 | PUSH1 18 | 24 8 //\\n // 0xf3 | 0xf3 | RETURN | //\\n //--------------------------------------------------------------------------------//\\n bytes internal constant PROXY_BYTECODE = hex\\\"67_36_3d_3d_37_36_3d_34_f0_3d_52_60_08_60_18_f3\\\";\\n\\n bytes32 internal constant PROXY_BYTECODE_HASH = keccak256(PROXY_BYTECODE);\\n\\n function deploy(\\n bytes32 salt,\\n bytes memory creationCode,\\n uint256 value\\n ) internal returns (address deployed) {\\n bytes memory proxyChildBytecode = PROXY_BYTECODE;\\n\\n address proxy;\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Deploy a new contract with our pre-made bytecode via CREATE2.\\n // We start 32 bytes into the code to avoid copying the byte length.\\n proxy := create2(0, add(proxyChildBytecode, 32), mload(proxyChildBytecode), salt)\\n }\\n require(proxy != address(0), \\\"DEPLOYMENT_FAILED\\\");\\n\\n deployed = getDeployed(salt);\\n (bool success, ) = proxy.call{value: value}(creationCode);\\n require(success && deployed.code.length != 0, \\\"INITIALIZATION_FAILED\\\");\\n }\\n\\n function getDeployed(bytes32 salt) internal view returns (address) {\\n address proxy = keccak256(\\n abi.encodePacked(\\n // Prefix:\\n bytes1(0xFF),\\n // Creator:\\n address(this),\\n // Salt:\\n salt,\\n // Bytecode hash:\\n PROXY_BYTECODE_HASH\\n )\\n ).fromLast20Bytes();\\n\\n return\\n keccak256(\\n abi.encodePacked(\\n // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01)\\n // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex)\\n hex\\\"d6_94\\\",\\n proxy,\\n hex\\\"01\\\" // Nonce of the proxy contract (1)\\n )\\n ).fromLast20Bytes();\\n }\\n}\\n\",\"keccak256\":\"0x1d4ea6d2353ed117d7704ddf7488fcd39edb2d575351f6c64efd313170d74367\",\"license\":\"AGPL-3.0-only\"},\"solmate/src/utils/SSTORE2.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Read and write to persistent storage at a fraction of the cost.\\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol)\\n/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)\\nlibrary SSTORE2 {\\n uint256 internal constant DATA_OFFSET = 1; // We skip the first byte as it's a STOP opcode to ensure the contract can't be called.\\n\\n /*//////////////////////////////////////////////////////////////\\n WRITE LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function write(bytes memory data) internal returns (address pointer) {\\n // Prefix the bytecode with a STOP opcode to ensure it cannot be called.\\n bytes memory runtimeCode = abi.encodePacked(hex\\\"00\\\", data);\\n\\n bytes memory creationCode = abi.encodePacked(\\n //---------------------------------------------------------------------------------------------------------------//\\n // Opcode | Opcode + Arguments | Description | Stack View //\\n //---------------------------------------------------------------------------------------------------------------//\\n // 0x60 | 0x600B | PUSH1 11 | codeOffset //\\n // 0x59 | 0x59 | MSIZE | 0 codeOffset //\\n // 0x81 | 0x81 | DUP2 | codeOffset 0 codeOffset //\\n // 0x38 | 0x38 | CODESIZE | codeSize codeOffset 0 codeOffset //\\n // 0x03 | 0x03 | SUB | (codeSize - codeOffset) 0 codeOffset //\\n // 0x80 | 0x80 | DUP | (codeSize - codeOffset) (codeSize - codeOffset) 0 codeOffset //\\n // 0x92 | 0x92 | SWAP3 | codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) //\\n // 0x59 | 0x59 | MSIZE | 0 codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) //\\n // 0x39 | 0x39 | CODECOPY | 0 (codeSize - codeOffset) //\\n // 0xf3 | 0xf3 | RETURN | //\\n //---------------------------------------------------------------------------------------------------------------//\\n hex\\\"60_0B_59_81_38_03_80_92_59_39_F3\\\", // Returns all code in the contract except for the first 11 (0B in hex) bytes.\\n runtimeCode // The bytecode we want the contract to have after deployment. Capped at 1 byte less than the code size limit.\\n );\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Deploy a new contract with the generated creation code.\\n // We start 32 bytes into the code to avoid copying the byte length.\\n pointer := create(0, add(creationCode, 32), mload(creationCode))\\n }\\n\\n require(pointer != address(0), \\\"DEPLOYMENT_FAILED\\\");\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n READ LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function read(address pointer) internal view returns (bytes memory) {\\n return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET);\\n }\\n\\n function read(address pointer, uint256 start) internal view returns (bytes memory) {\\n start += DATA_OFFSET;\\n\\n return readBytecode(pointer, start, pointer.code.length - start);\\n }\\n\\n function read(\\n address pointer,\\n uint256 start,\\n uint256 end\\n ) internal view returns (bytes memory) {\\n start += DATA_OFFSET;\\n end += DATA_OFFSET;\\n\\n require(pointer.code.length >= end, \\\"OUT_OF_BOUNDS\\\");\\n\\n return readBytecode(pointer, start, end - start);\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n INTERNAL HELPER LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function readBytecode(\\n address pointer,\\n uint256 start,\\n uint256 size\\n ) private view returns (bytes memory data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Get a pointer to some free memory.\\n data := mload(0x40)\\n\\n // Update the free memory pointer to prevent overriding our data.\\n // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)).\\n // Adding 31 to size and running the result through the logic above ensures\\n // the memory pointer remains word-aligned, following the Solidity convention.\\n mstore(0x40, add(data, and(add(add(size, 32), 31), not(31))))\\n\\n // Store the size of the data in the first 32 byte chunk of free memory.\\n mstore(data, size)\\n\\n // Copy the code into memory right after the 32 bytes we used to store the size.\\n extcodecopy(pointer, add(data, 32), start, size)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc5359c92365c550c418725fc534a538426ea8f6e7f6c06c0a9d66647d864469d\",\"license\":\"AGPL-3.0-only\"}},\"version\":1}",
"bytecode": "0x60a06040523480156200001157600080fd5b50604051620022173803806200221783398101604081905262000034916200013d565b600080546001600160a01b0319166001600160a01b03831690811782556040518492849283929091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038116620000b45760405163694bda1d60e01b81526155f260048201526024015b60405180910390fd5b506001600160a01b0390811660805282908116620000ea5760405163694bda1d60e01b81526155f26004820152602401620000ab565b6000546001600160a01b0316806200011a5760405163694bda1d60e01b81526155f26004820152602401620000ab565b505050506200017c565b6001600160a01b03811681146200013a57600080fd5b50565b600080604083850312156200015157600080fd5b82516200015e8162000124565b6020840151909250620001718162000124565b809150509250929050565b608051612071620001a660003960008181610126015281816109f50152610ada01526120716000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063a34b5ee81161008c578063dd179e3b11610066578063dd179e3b146101fb578063e78e049a14610210578063f2fde38b14610223578063f60150791461023657600080fd5b8063a34b5ee8146101b5578063bb4a64d3146101c8578063c949aea6146101db57600080fd5b806350c358a4116100bd57806350c358a41461016d5780636ff97f1d146101805780638da5cb5b1461019557600080fd5b80630b44a218146100e45780632520e7ff146100f95780632861c7d114610121575b600080fd5b6100f76100f2366004611655565b610249565b005b61010c610107366004611688565b61038d565b60405190151581526020015b60405180910390f35b6101487f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b61010c61017b366004611688565b6103e3565b610188610434565b60405161011891906116a3565b6000546101489073ffffffffffffffffffffffffffffffffffffffff1681565b6100f76101c3366004611655565b6104a3565b6101486101d6366004611746565b6105e2565b6101ee6101e9366004611873565b6105ff565b6040516101189190611916565b61020361069f565b6040516101189190611929565b61014861021e3660046119a9565b610778565b6100f7610231366004611688565b610c29565b6100f7610244366004611a0e565b610d1a565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116610321576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f260048201526024016102c6565b8161032d576000610330565b60015b73ffffffffffffffffffffffffffffffffffffffff841660008181526001602052604080822060ff949094169093559151841515927f014b54fa6d2080e9aacd1c598c7689a625610d7d684dd41d10407e48aa8b120091a3505050565b6000805473ffffffffffffffffffffffffffffffffffffffff838116911614806103dd575073ffffffffffffffffffffffffffffffffffffffff8216600090815260016020819052604090912054145b92915050565b6000805473ffffffffffffffffffffffffffffffffffffffff838116911614806103dd57505073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460011490565b6060600380548060200260200160405190810160405280929190818152602001828054801561049957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161046e575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016102c6565b8173ffffffffffffffffffffffffffffffffffffffff8116610576576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f260048201526024016102c6565b81610582576000610585565b60015b73ffffffffffffffffffffffffffffffffffffffff841660008181526002602052604080822060ff949094169093559151841515927f48cc5b4660fae22eabe5e803ee595e63572773d114bcd54ecc118c1efa8d75af91a3505050565b60006105f76105f2858585611111565b611147565b949350505050565b6060600060056000846040516020016106189190611916565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120835290820192909252016000205473ffffffffffffffffffffffffffffffffffffffff169050801561068857610683816112ad565b610698565b6040805160008152602081019091525b9392505050565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101561076f5783829060005260206000200180546106e290611a6a565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90611a6a565b801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b5050505050815260200190600101906106c3565b50505050905090565b60008473ffffffffffffffffffffffffffffffffffffffff81166107cc576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f260048201526024016102c6565b6107d5336103e3565b61080f576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f560048201526024016102c6565b6000600560008787604051602001610828929190611b06565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120835290820192909252016000205473ffffffffffffffffffffffffffffffffffffffff169050806108bf576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f160048201526024016102c6565b60006108cc888888611111565b90506108f66108da82611147565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b15610931576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f360048201526024016102c6565b60006109c3600587610981576040805173ffffffffffffffffffffffffffffffffffffffff8d16602080830191909152818301939093528151808203830181526060909101909152805191012090565b6040805173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602080830191909152818301939093528151808203830181526060909101909152805191012090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401602060405180830381865afa158015610a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a759190611b1a565b600003610ab2576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f460048201526024016102c6565b610b6582610abf856112ad565b6040805173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208301523092820192909252908d166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610b4f9291602001611b33565b60405160208183030381529060405260006112db565b6003805460018101825560008290527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116918217909255915460405193985092908c1691907f60c8487fc242a40cc8d2722cf9b3b5a14b316a50bf4ed30c9f0f1b0126728a3690610c15908d908d90611b06565b60405180910390a450505050949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016102c6565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b610d233361038d565b610d5d576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f560048201526024016102c6565b600454604051600090610d74908690602001611916565b60405160208183030381529060405280519060200120905083839050600003610f45576005600086604051602001610dac9190611916565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012083529082019290925201600090812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b82811015610efe578160048281548110610e3457610e34611b62565b90600052602060002001604051602001610e4e9190611b91565b6040516020818303038152906040528051906020012003610eee576004610e76600185611c69565b81548110610e8657610e86611b62565b9060005260206000200160048281548110610ea357610ea3611b62565b906000526020600020019081610eb99190611ccb565b506004805480610ecb57610ecb611e02565b600190038181906000526020600020016000610ee791906115c6565b9055610efe565b610ef781611e31565b9050610e18565b50604051600090610f10908790611e69565b604051908190038120907f93dad940f342b3cd95007806ae0cb0c162dbbfba54d55223bc6d055c62e608e090600090a361110a565b6000610f8685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114ad92505050565b9050806005600088604051602001610f9e9190611916565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000805b8481101561106e57836004828154811061102057611020611b62565b9060005260206000200160405160200161103a9190611b91565b604051602081830303815290604052805190602001200361105e576001915061106e565b61106781611e31565b9050611004565b50806110b257600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016110b08882611e85565b505b8173ffffffffffffffffffffffffffffffffffffffff16876040516110d79190611e69565b604051908190038120907f93dad940f342b3cd95007806ae0cb0c162dbbfba54d55223bc6d055c62e608e090600090a350505b5050505050565b600083838360405160200161112893929190611f97565b6040516020818303038152906040528051906020012090509392505050565b604080518082018252601081527f67363d3d37363d34f03d5260086018f30000000000000000000000000000000060209182015290517fff00000000000000000000000000000000000000000000000000000000000000918101919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166021820152603581018290527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f60558201526000908190611223906075015b6040516020818303038152906040528051906020012090565b6040517fd69400000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201529091506106989060370161120a565b60606103dd8260016112d68173ffffffffffffffffffffffffffffffffffffffff84163b611c69565b611585565b6000806040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4445504c4f594d454e545f4641494c454400000000000000000000000000000060448201526064016102c6565b6113aa86611147565b925060008173ffffffffffffffffffffffffffffffffffffffff1685876040516113d49190611e69565b60006040518083038185875af1925050503d8060008114611411576040519150601f19603f3d011682016040523d82523d6000602084013e611416565b606091505b5050905080801561143d575073ffffffffffffffffffffffffffffffffffffffff84163b15155b6114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e495449414c495a4154494f4e5f4641494c4544000000000000000000000060448201526064016102c6565b5050509392505050565b600080826040516020016114c19190611fd0565b60405160208183030381529060405290506000816040516020016114e59190611ff6565b60405160208183030381529060405290508051602082016000f0925073ffffffffffffffffffffffffffffffffffffffff831661157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4445504c4f594d454e545f4641494c454400000000000000000000000000000060448201526064016102c6565b5050919050565b60408051603f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101909152818152818360208301863c9392505050565b5080546115d290611a6a565b6000825580601f106115e2575050565b601f0160209004906000526020600020908101906116009190611603565b50565b5b808211156116185760008155600101611604565b5090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461164057600080fd5b919050565b8035801515811461164057600080fd5b6000806040838503121561166857600080fd5b6116718361161c565b915061167f60208401611645565b90509250929050565b60006020828403121561169a57600080fd5b6106988261161c565b6020808252825182820181905260009190848201906040850190845b818110156116f157835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016116bf565b50909695505050505050565b60008083601f84011261170f57600080fd5b50813567ffffffffffffffff81111561172757600080fd5b60208301915083602082850101111561173f57600080fd5b9250929050565b60008060006040848603121561175b57600080fd5b6117648461161c565b9250602084013567ffffffffffffffff81111561178057600080fd5b61178c868287016116fd565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126117d957600080fd5b813567ffffffffffffffff808211156117f4576117f4611799565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561183a5761183a611799565b8160405283815286602085880101111561185357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561188557600080fd5b813567ffffffffffffffff81111561189c57600080fd5b6105f7848285016117c8565b60005b838110156118c35781810151838201526020016118ab565b50506000910152565b600081518084526118e48160208601602086016118a8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061069860208301846118cc565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561199c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261198a8583516118cc565b94509285019290850190600101611950565b5092979650505050505050565b600080600080606085870312156119bf57600080fd5b6119c88561161c565b9350602085013567ffffffffffffffff8111156119e457600080fd5b6119f0878288016116fd565b9094509250611a03905060408601611645565b905092959194509250565b600080600060408486031215611a2357600080fd5b833567ffffffffffffffff80821115611a3b57600080fd5b611a47878388016117c8565b94506020860135915080821115611a5d57600080fd5b5061178c868287016116fd565b600181811c90821680611a7e57607f821691505b602082108103611ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006105f7602083018486611abd565b600060208284031215611b2c57600080fd5b5051919050565b60008351611b458184602088016118a8565b835190830190611b598183602088016118a8565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602080835260008454611ba581611a6a565b80848701526040600180841660008114611bc65760018114611bfe57611c2c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550611c2c565b896000528660002060005b85811015611c245781548b8201860152908301908801611c09565b8a0184019650505b509398975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156103dd576103dd611c3a565b601f821115611cc657600081815260208120601f850160051c81016020861015611ca35750805b601f850160051c820191505b81811015611cc257828155600101611caf565b5050505b505050565b818103611cd6575050565b611ce08254611a6a565b67ffffffffffffffff811115611cf857611cf8611799565b611d0c81611d068454611a6a565b84611c7c565b6000601f821160018114611d5e5760008315611d285750848201545b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b17845561110a565b6000858152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690600086815260209020845b83811015611db65782860154825560019586019590910190602001611d96565b5085831015611df257818501547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611e6257611e62611c3a565b5060010190565b60008251611e7b8184602087016118a8565b9190910192915050565b815167ffffffffffffffff811115611e9f57611e9f611799565b611ead81611d068454611a6a565b602080601f831160018114611f005760008415611eca5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611cc2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611f4d57888601518255948401946001909101908401611f2e565b5085821015611df25793909601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f8600387901b161c19169092555050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff84168152604060208201526000611fc7604083018486611abd565b95945050505050565b6000815260008251611fe98160018501602087016118a8565b9190910160010192915050565b7f600b5981380380925939f300000000000000000000000000000000000000000081526000825161202e81600b8501602087016118a8565b91909101600b019291505056fea2646970667358221220829aaace410b5d4c5716d8dcea71dfcc8c5c561c651a6548ba8b8d3990f3589364736f6c63430008150033",
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063a34b5ee81161008c578063dd179e3b11610066578063dd179e3b146101fb578063e78e049a14610210578063f2fde38b14610223578063f60150791461023657600080fd5b8063a34b5ee8146101b5578063bb4a64d3146101c8578063c949aea6146101db57600080fd5b806350c358a4116100bd57806350c358a41461016d5780636ff97f1d146101805780638da5cb5b1461019557600080fd5b80630b44a218146100e45780632520e7ff146100f95780632861c7d114610121575b600080fd5b6100f76100f2366004611655565b610249565b005b61010c610107366004611688565b61038d565b60405190151581526020015b60405180910390f35b6101487f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610118565b61010c61017b366004611688565b6103e3565b610188610434565b60405161011891906116a3565b6000546101489073ffffffffffffffffffffffffffffffffffffffff1681565b6100f76101c3366004611655565b6104a3565b6101486101d6366004611746565b6105e2565b6101ee6101e9366004611873565b6105ff565b6040516101189190611916565b61020361069f565b6040516101189190611929565b61014861021e3660046119a9565b610778565b6100f7610231366004611688565b610c29565b6100f7610244366004611a0e565b610d1a565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff8116610321576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f260048201526024016102c6565b8161032d576000610330565b60015b73ffffffffffffffffffffffffffffffffffffffff841660008181526001602052604080822060ff949094169093559151841515927f014b54fa6d2080e9aacd1c598c7689a625610d7d684dd41d10407e48aa8b120091a3505050565b6000805473ffffffffffffffffffffffffffffffffffffffff838116911614806103dd575073ffffffffffffffffffffffffffffffffffffffff8216600090815260016020819052604090912054145b92915050565b6000805473ffffffffffffffffffffffffffffffffffffffff838116911614806103dd57505073ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205460011490565b6060600380548060200260200160405190810160405280929190818152602001828054801561049957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161046e575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016102c6565b8173ffffffffffffffffffffffffffffffffffffffff8116610576576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f260048201526024016102c6565b81610582576000610585565b60015b73ffffffffffffffffffffffffffffffffffffffff841660008181526002602052604080822060ff949094169093559151841515927f48cc5b4660fae22eabe5e803ee595e63572773d114bcd54ecc118c1efa8d75af91a3505050565b60006105f76105f2858585611111565b611147565b949350505050565b6060600060056000846040516020016106189190611916565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120835290820192909252016000205473ffffffffffffffffffffffffffffffffffffffff169050801561068857610683816112ad565b610698565b6040805160008152602081019091525b9392505050565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101561076f5783829060005260206000200180546106e290611a6a565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90611a6a565b801561075b5780601f106107305761010080835404028352916020019161075b565b820191906000526020600020905b81548152906001019060200180831161073e57829003601f168201915b5050505050815260200190600101906106c3565b50505050905090565b60008473ffffffffffffffffffffffffffffffffffffffff81166107cc576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f260048201526024016102c6565b6107d5336103e3565b61080f576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f560048201526024016102c6565b6000600560008787604051602001610828929190611b06565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120835290820192909252016000205473ffffffffffffffffffffffffffffffffffffffff169050806108bf576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f160048201526024016102c6565b60006108cc888888611111565b90506108f66108da82611147565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b15610931576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f360048201526024016102c6565b60006109c3600587610981576040805173ffffffffffffffffffffffffffffffffffffffff8d16602080830191909152818301939093528151808203830181526060909101909152805191012090565b6040805173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602080830191909152818301939093528151808203830181526060909101909152805191012090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401602060405180830381865afa158015610a51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a759190611b1a565b600003610ab2576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f460048201526024016102c6565b610b6582610abf856112ad565b6040805173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660208301523092820192909252908d166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610b4f9291602001611b33565b60405160208183030381529060405260006112db565b6003805460018101825560008290527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116918217909255915460405193985092908c1691907f60c8487fc242a40cc8d2722cf9b3b5a14b316a50bf4ed30c9f0f1b0126728a3690610c15908d908d90611b06565b60405180910390a450505050949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610caa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016102c6565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b610d233361038d565b610d5d576040517f694bda1d0000000000000000000000000000000000000000000000000000000081526155f560048201526024016102c6565b600454604051600090610d74908690602001611916565b60405160208183030381529060405280519060200120905083839050600003610f45576005600086604051602001610dac9190611916565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012083529082019290925201600090812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b82811015610efe578160048281548110610e3457610e34611b62565b90600052602060002001604051602001610e4e9190611b91565b6040516020818303038152906040528051906020012003610eee576004610e76600185611c69565b81548110610e8657610e86611b62565b9060005260206000200160048281548110610ea357610ea3611b62565b906000526020600020019081610eb99190611ccb565b506004805480610ecb57610ecb611e02565b600190038181906000526020600020016000610ee791906115c6565b9055610efe565b610ef781611e31565b9050610e18565b50604051600090610f10908790611e69565b604051908190038120907f93dad940f342b3cd95007806ae0cb0c162dbbfba54d55223bc6d055c62e608e090600090a361110a565b6000610f8685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114ad92505050565b9050806005600088604051602001610f9e9190611916565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000805b8481101561106e57836004828154811061102057611020611b62565b9060005260206000200160405160200161103a9190611b91565b604051602081830303815290604052805190602001200361105e576001915061106e565b61106781611e31565b9050611004565b50806110b257600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b016110b08882611e85565b505b8173ffffffffffffffffffffffffffffffffffffffff16876040516110d79190611e69565b604051908190038120907f93dad940f342b3cd95007806ae0cb0c162dbbfba54d55223bc6d055c62e608e090600090a350505b5050505050565b600083838360405160200161112893929190611f97565b6040516020818303038152906040528051906020012090509392505050565b604080518082018252601081527f67363d3d37363d34f03d5260086018f30000000000000000000000000000000060209182015290517fff00000000000000000000000000000000000000000000000000000000000000918101919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166021820152603581018290527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f60558201526000908190611223906075015b6040516020818303038152906040528051906020012090565b6040517fd69400000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201529091506106989060370161120a565b60606103dd8260016112d68173ffffffffffffffffffffffffffffffffffffffff84163b611c69565b611585565b6000806040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000858251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166113a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4445504c4f594d454e545f4641494c454400000000000000000000000000000060448201526064016102c6565b6113aa86611147565b925060008173ffffffffffffffffffffffffffffffffffffffff1685876040516113d49190611e69565b60006040518083038185875af1925050503d8060008114611411576040519150601f19603f3d011682016040523d82523d6000602084013e611416565b606091505b5050905080801561143d575073ffffffffffffffffffffffffffffffffffffffff84163b15155b6114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f494e495449414c495a4154494f4e5f4641494c4544000000000000000000000060448201526064016102c6565b5050509392505050565b600080826040516020016114c19190611fd0565b60405160208183030381529060405290506000816040516020016114e59190611ff6565b60405160208183030381529060405290508051602082016000f0925073ffffffffffffffffffffffffffffffffffffffff831661157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4445504c4f594d454e545f4641494c454400000000000000000000000000000060448201526064016102c6565b5050919050565b60408051603f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101909152818152818360208301863c9392505050565b5080546115d290611a6a565b6000825580601f106115e2575050565b601f0160209004906000526020600020908101906116009190611603565b50565b5b808211156116185760008155600101611604565b5090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461164057600080fd5b919050565b8035801515811461164057600080fd5b6000806040838503121561166857600080fd5b6116718361161c565b915061167f60208401611645565b90509250929050565b60006020828403121561169a57600080fd5b6106988261161c565b6020808252825182820181905260009190848201906040850190845b818110156116f157835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016116bf565b50909695505050505050565b60008083601f84011261170f57600080fd5b50813567ffffffffffffffff81111561172757600080fd5b60208301915083602082850101111561173f57600080fd5b9250929050565b60008060006040848603121561175b57600080fd5b6117648461161c565b9250602084013567ffffffffffffffff81111561178057600080fd5b61178c868287016116fd565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126117d957600080fd5b813567ffffffffffffffff808211156117f4576117f4611799565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561183a5761183a611799565b8160405283815286602085880101111561185357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561188557600080fd5b813567ffffffffffffffff81111561189c57600080fd5b6105f7848285016117c8565b60005b838110156118c35781810151838201526020016118ab565b50506000910152565b600081518084526118e48160208601602086016118a8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061069860208301846118cc565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561199c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261198a8583516118cc565b94509285019290850190600101611950565b5092979650505050505050565b600080600080606085870312156119bf57600080fd5b6119c88561161c565b9350602085013567ffffffffffffffff8111156119e457600080fd5b6119f0878288016116fd565b9094509250611a03905060408601611645565b905092959194509250565b600080600060408486031215611a2357600080fd5b833567ffffffffffffffff80821115611a3b57600080fd5b611a47878388016117c8565b94506020860135915080821115611a5d57600080fd5b5061178c868287016116fd565b600181811c90821680611a7e57607f821691505b602082108103611ab7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006105f7602083018486611abd565b600060208284031215611b2c57600080fd5b5051919050565b60008351611b458184602088016118a8565b835190830190611b598183602088016118a8565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602080835260008454611ba581611a6a565b80848701526040600180841660008114611bc65760018114611bfe57611c2c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550611c2c565b896000528660002060005b85811015611c245781548b8201860152908301908801611c09565b8a0184019650505b509398975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156103dd576103dd611c3a565b601f821115611cc657600081815260208120601f850160051c81016020861015611ca35750805b601f850160051c820191505b81811015611cc257828155600101611caf565b5050505b505050565b818103611cd6575050565b611ce08254611a6a565b67ffffffffffffffff811115611cf857611cf8611799565b611d0c81611d068454611a6a565b84611c7c565b6000601f821160018114611d5e5760008315611d285750848201545b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b17845561110a565b6000858152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841690600086815260209020845b83811015611db65782860154825560019586019590910190602001611d96565b5085831015611df257818501547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611e6257611e62611c3a565b5060010190565b60008251611e7b8184602087016118a8565b9190910192915050565b815167ffffffffffffffff811115611e9f57611e9f611799565b611ead81611d068454611a6a565b602080601f831160018114611f005760008415611eca5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611cc2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611f4d57888601518255948401946001909101908401611f2e565b5085821015611df25793909601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f8600387901b161c19169092555050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff84168152604060208201526000611fc7604083018486611abd565b95945050505050565b6000815260008251611fe98160018501602087016118a8565b9190910160010192915050565b7f600b5981380380925939f300000000000000000000000000000000000000000081526000825161202e81600b8501602087016118a8565b91909101600b019291505056fea2646970667358221220829aaace410b5d4c5716d8dcea71dfcc8c5c561c651a6548ba8b8d3990f3589364736f6c63430008150033",
"devdoc": {
"details": "Note the deployed token starts out with no config at Liquidity contract. This must be done by Liquidity auths in a separate step, otherwise no deposits will be possible. This contract is not upgradeable. It supports adding new fToken creation codes for future new fToken types.",
"kind": "dev",
"methods": {
"computeToken(address,string)": {
"params": {
"asset_": "address of the asset",
"fTokenType_": "type of fToken: - if it's the native token, it should use `NativeUnderlying` - otherwise it should use `fToken` - could be more types available, check `fTokenTypes()`"
},
"returns": {
"token_": " detemrinistic address of the computed token"
}
},
"createToken(address,string,bool)": {
"params": {
"asset_": "address of the asset",
"fTokenType_": "type of fToken: - if it's the native token, it should use `NativeUnderlying` - otherwise it should use `fToken` - could be more types available, check `fTokenTypes()`",
"isNativeUnderlying_": "flag to signal fToken type that uses native underlying at Liquidity"
},
"returns": {
"token_": " address of the created token"
}
},
"setAuth(address,bool)": {
"params": {
"allowed_": "bool flag for whether address is allowed as auth or not",
"auth_": "address to set auth value for"
}
},
"setDeployer(address,bool)": {
"params": {
"allowed_": "bool flag for whether address is allowed as deployer or not",
"deployer_": "address to set deployer value for"
}
},
"setFTokenCreationCode(string,bytes)": {
"params": {
"creationCode_": "contract creation code. can be set to bytes(0) to remove a previously available `fTokenType_`",
"fTokenType_": "the fToken Type used to refer the creation code"
}
}
},
"title": "Fluid LendingFactory",
"version": 1
},
"userdoc": {
"events": {
"LogSetAuth(address,bool)": {
"notice": "emitted when an auth is modified by owner"
},
"LogSetDeployer(address,bool)": {
"notice": "emitted when a deployer is modified by owner"
},
"LogSetFTokenCreationCode(string,address)": {
"notice": "emitted when the creation code for an fTokenType is set"
},
"LogTokenCreated(address,address,uint256,string)": {
"notice": "emitted when a new fToken is created"
}
},
"kind": "user",
"methods": {
"LIQUIDITY()": {
"notice": "address of the Liquidity contract."
},
"allTokens()": {
"notice": "list of all created tokens"
},
"computeToken(address,string)": {
"notice": "computes deterministic token address for `asset_` for a lending protocol"
},
"constructor": {
"notice": "initialize liquidity contract address & owner"
},
"createToken(address,string,bool)": {
"notice": "creates token for `asset_` for a lending protocol with interest. Only callable by deployers."
},
"fTokenCreationCode(string)": {
"notice": "returns the creation code for a certain `fTokenType_`"
},
"fTokenTypes()": {
"notice": "list of all fToken types that can be deployed"
},
"isAuth(address)": {
"notice": "reads if a certain `auth_` address is an allowed auth or not. Owner is auth by default."
},
"isDeployer(address)": {
"notice": "reads if a certain `deployer_` address is an allowed deployer or not. Owner is deployer by default."
},
"setAuth(address,bool)": {
"notice": "Sets an address as allowed auth or not. Only callable by owner."
},
"setDeployer(address,bool)": {
"notice": "Sets an address as allowed deployer or not. Only callable by owner."
},
"setFTokenCreationCode(string,bytes)": {
"notice": "Sets the `creationCode_` bytecode for a certain `fTokenType_`. Only callable by auths."
}
},
"notice": "creates Fluid lending protocol fTokens, which are interacting with Fluid Liquidity. fTokens are ERC20 & ERC4626 compatible tokens that allow to deposit to Fluid Liquidity to earn interest. Tokens are created at a deterministic address (see `computeToken()`), only executable by allow-listed auths.",
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 50962,
"contract": "contracts/protocols/lending/lendingFactory/main.sol:FluidLendingFactory",
"label": "owner",
"offset": 0,
"slot": "0",
"type": "t_address"
},
{
"astId": 40256,
"contract": "contracts/protocols/lending/lendingFactory/main.sol:FluidLendingFactory",
"label": "_auths",
"offset": 0,
"slot": "1",
"type": "t_mapping(t_address,t_uint256)"
},
{
"astId": 40261,
"contract": "contracts/protocols/lending/lendingFactory/main.sol:FluidLendingFactory",
"label": "_deployers",
"offset": 0,
"slot": "2",
"type": "t_mapping(t_address,t_uint256)"
},
{
"astId": 40265,
"contract": "contracts/protocols/lending/lendingFactory/main.sol:FluidLendingFactory",
"label": "_allTokens",
"offset": 0,
"slot": "3",
"type": "t_array(t_address)dyn_storage"
},
{
"astId": 40269,
"contract": "contracts/protocols/lending/lendingFactory/main.sol:FluidLendingFactory",
"label": "_fTokenTypes",
"offset": 0,
"slot": "4",
"type": "t_array(t_string_storage)dyn_storage"
},
{
"astId": 40274,
"contract": "contracts/protocols/lending/lendingFactory/main.sol:FluidLendingFactory",
"label": "_fTokenCreationCodePointers",
"offset": 0,
"slot": "5",
"type": "t_mapping(t_bytes32,t_address)"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_address)dyn_storage": {
"base": "t_address",
"encoding": "dynamic_array",
"label": "address[]",
"numberOfBytes": "32"
},
"t_array(t_string_storage)dyn_storage": {
"base": "t_string_storage",
"encoding": "dynamic_array",
"label": "string[]",
"numberOfBytes": "32"
},
"t_bytes32": {
"encoding": "inplace",
"label": "bytes32",
"numberOfBytes": "32"
},
"t_mapping(t_address,t_uint256)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => uint256)",
"numberOfBytes": "32",
"value": "t_uint256"
},
"t_mapping(t_bytes32,t_address)": {
"encoding": "mapping",
"key": "t_bytes32",
"label": "mapping(bytes32 => address)",
"numberOfBytes": "32",
"value": "t_address"
},
"t_string_storage": {
"encoding": "bytes",
"label": "string",
"numberOfBytes": "32"
},
"t_uint256": {
"encoding": "inplace",
"label": "uint256",
"numberOfBytes": "32"
}
}
}
}