fluid-contracts-public/deployments/mainnet/LiquidityResolver.json

2545 lines
276 KiB
JSON

{
"address": "0x741c2Cd25f053a55fd94afF1afAEf146523E1249",
"abi": [
{
"inputs": [
{
"internalType": "contract IFluidLiquidity",
"name": "liquidity_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "errorId_",
"type": "uint256"
}
],
"name": "FluidLiquidityCalcsError",
"type": "error"
},
{
"inputs": [],
"name": "FluidLiquidityResolver__AddressZero",
"type": "error"
},
{
"inputs": [],
"name": "LIQUIDITY",
"outputs": [
{
"internalType": "contract IFluidLiquidity",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getExchangePricesAndConfig",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getOverallTokenData",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData",
"name": "overallTokenData_",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "tokens_",
"type": "address[]"
}
],
"name": "getOverallTokensData",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData[]",
"name": "overallTokensData_",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getRateConfig",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getRevenue",
"outputs": [
{
"internalType": "uint256",
"name": "revenueAmount_",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getRevenueCollector",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getStatus",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getTokenRateData",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData_",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "tokens_",
"type": "address[]"
}
],
"name": "getTokensRateData",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData[]",
"name": "rateDatas_",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getTotalAmounts",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getUserBorrow",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getUserBorrowData",
"outputs": [
{
"components": [
{
"internalType": "bool",
"name": "modeWithInterest",
"type": "bool"
},
{
"internalType": "uint256",
"name": "borrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandPercent",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "baseBorrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxBorrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowableUntilLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowable",
"type": "uint256"
}
],
"internalType": "struct Structs.UserBorrowData",
"name": "userBorrowData_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData",
"name": "overallTokenData_",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
}
],
"name": "getUserClass",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address[]",
"name": "tokens_",
"type": "address[]"
}
],
"name": "getUserMultipleBorrowData",
"outputs": [
{
"components": [
{
"internalType": "bool",
"name": "modeWithInterest",
"type": "bool"
},
{
"internalType": "uint256",
"name": "borrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandPercent",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "baseBorrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxBorrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowableUntilLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowable",
"type": "uint256"
}
],
"internalType": "struct Structs.UserBorrowData[]",
"name": "userBorrowingsData_",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData[]",
"name": "overallTokensData_",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address[]",
"name": "supplyTokens_",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "borrowTokens_",
"type": "address[]"
}
],
"name": "getUserMultipleBorrowSupplyData",
"outputs": [
{
"components": [
{
"internalType": "bool",
"name": "modeWithInterest",
"type": "bool"
},
{
"internalType": "uint256",
"name": "supply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawalLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandPercent",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "baseWithdrawalLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawableUntilLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawable",
"type": "uint256"
}
],
"internalType": "struct Structs.UserSupplyData[]",
"name": "userSuppliesData_",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData[]",
"name": "overallSupplyTokensData_",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "bool",
"name": "modeWithInterest",
"type": "bool"
},
{
"internalType": "uint256",
"name": "borrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandPercent",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "baseBorrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "maxBorrowLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowableUntilLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowable",
"type": "uint256"
}
],
"internalType": "struct Structs.UserBorrowData[]",
"name": "userBorrowingsData_",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData[]",
"name": "overallBorrowTokensData_",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address[]",
"name": "tokens_",
"type": "address[]"
}
],
"name": "getUserMultipleSupplyData",
"outputs": [
{
"components": [
{
"internalType": "bool",
"name": "modeWithInterest",
"type": "bool"
},
{
"internalType": "uint256",
"name": "supply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawalLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandPercent",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "baseWithdrawalLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawableUntilLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawable",
"type": "uint256"
}
],
"internalType": "struct Structs.UserSupplyData[]",
"name": "userSuppliesData_",
"type": "tuple[]"
},
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData[]",
"name": "overallTokensData_",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getUserSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user_",
"type": "address"
},
{
"internalType": "address",
"name": "token_",
"type": "address"
}
],
"name": "getUserSupplyData",
"outputs": [
{
"components": [
{
"internalType": "bool",
"name": "modeWithInterest",
"type": "bool"
},
{
"internalType": "uint256",
"name": "supply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawalLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandPercent",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expandDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "baseWithdrawalLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawableUntilLimit",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawable",
"type": "uint256"
}
],
"internalType": "struct Structs.UserSupplyData",
"name": "userSupplyData_",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "borrowRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRate",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastStoredUtilization",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "storageUpdateThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastUpdateTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowExchangePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "supplyInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowRawInterest",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "borrowInterestFree",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "totalBorrow",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "revenue",
"type": "uint256"
},
{
"components": [
{
"internalType": "uint256",
"name": "version",
"type": "uint256"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV1Params",
"name": "rateDataV1",
"type": "tuple"
},
{
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "kink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "kink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationZero",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink1",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationKink2",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rateAtUtilizationMax",
"type": "uint256"
}
],
"internalType": "struct Structs.RateDataV2Params",
"name": "rateDataV2",
"type": "tuple"
}
],
"internalType": "struct Structs.RateData",
"name": "rateData",
"type": "tuple"
}
],
"internalType": "struct Structs.OverallTokenData",
"name": "overallTokenData_",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "auth_",
"type": "address"
}
],
"name": "isAuth",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "guardian_",
"type": "address"
}
],
"name": "isGuardian",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "listedTokens",
"outputs": [
{
"internalType": "address[]",
"name": "listedTokens_",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
}
],
"transactionHash": "0xba5b43d9eb83da5c1a8d4d6a4a360389f026e66e60d9d067b060aaf66f3a3a48",
"receipt": {
"to": "0x6b75d8AF000000e20B7a7DDf000Ba900b4009A80",
"from": "0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13",
"contractAddress": null,
"transactionIndex": 0,
"gasUsed": "249288",
"logsBloom": "0x002400000000000002000000800000010000000000000000000000000000000000000080000010200000000000000000020000000800000000000000000000000000000000000000000000080000002000000000000200000040000000000000000000000000000000000000000000000000000000000000800000100000000000000040000000000000002000000200000000000000000c0104004000000000000040000000000000000000000020004000000000000000000000000000040480000002000000000000002000000000000000080000001000000000000000000000200040000000000000000400000000400040000000000000000040006000",
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf",
"transactionHash": "0xba5b43d9eb83da5c1a8d4d6a4a360389f026e66e60d9d067b060aaf66f3a3a48",
"logs": [
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xE0f63A424a4439cBE457D80E4f4b51aD25b2c56C",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80",
"0x00000000000000000000000052c77b0cb827afbad022e6d6caf2c44452edbc39"
],
"data": "0x00000000000000000000000000000000000000000000000000000cc649ad0000",
"logIndex": 0,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000052c77b0cb827afbad022e6d6caf2c44452edbc39",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80"
],
"data": "0x0000000000000000000000000000000000000000000000001c2177a500000000",
"logIndex": 1,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0x52c77b0CB827aFbAD022E6d6CAF2C44452eDbc39",
"topics": [
"0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1"
],
"data": "0x00000000000000000000000000000000000000000000000dbbc00319a9d27b4b000000000000000000000000000000000000000000000000000644895a30a8e6",
"logIndex": 2,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0x52c77b0CB827aFbAD022E6d6CAF2C44452eDbc39",
"topics": [
"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80"
],
"data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc649ad00000000000000000000000000000000000000000000000000001c2177a5000000000000000000000000000000000000000000000000000000000000000000000000",
"logIndex": 3,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80",
"0x000000000000000000000000c7cc7bc18c2147085cb320333eab92512366ea92"
],
"data": "0x00000000000000000000000000000000000000000000000003d9d09800000000",
"logIndex": 4,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xe941Bd60Bd0C92605F8D90992c7DcE3c5Fc229f3",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000c7cc7bc18c2147085cb320333eab92512366ea92",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80"
],
"data": "0x000000000000000000000000000000000000000000008347d7b6000000000000",
"logIndex": 5,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xC7cc7bC18c2147085Cb320333eab92512366eA92",
"topics": [
"0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1"
],
"data": "0x000000000000000000000000000000000000000000000000540dc56a6ed0701d0000000000000000000000000000000000000000000ab6761a91e7aa7b12e8b3",
"logIndex": 6,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xC7cc7bC18c2147085Cb320333eab92512366eA92",
"topics": [
"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80"
],
"data": "0x00000000000000000000000000000000000000000000000003d9d0980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008347d7b6000000000000",
"logIndex": 7,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80",
"0x0000000000000000000000005ead5462e7d98308e64bfe3c1d76845e5d2794a1"
],
"data": "0x0000000000000000000000000000000000000000000000000863673e00000000",
"logIndex": 8,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0x39207D2E2fEEF178FBdA8083914554C59D9f8c00",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x0000000000000000000000005ead5462e7d98308e64bfe3c1d76845e5d2794a1",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80"
],
"data": "0x000000000000000000000000000000000000000160fc07000000000000000000",
"logIndex": 9,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0x5eAD5462E7D98308E64bFe3c1D76845E5D2794A1",
"topics": [
"0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1"
],
"data": "0x0000000000000000000000000000000000000111005f2742b47a2ac5f90b6345000000000000000000000000000000000000000000000006803a2b012643545e",
"logIndex": 10,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
},
{
"transactionIndex": 0,
"blockNumber": 18459255,
"transactionHash": "0xe1e131334230f5236080606ade074876ce753e2b0bf44b2dbd8b844919386cd7",
"address": "0x5eAD5462E7D98308E64bFe3c1D76845E5D2794A1",
"topics": [
"0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80",
"0x0000000000000000000000006b75d8af000000e20b7a7ddf000ba900b4009a80"
],
"data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000863673e00000000000000000000000000000000000000000000000160fc070000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"logIndex": 11,
"blockHash": "0xf0f5b3f28dc6539838e9178029ffa4fb9c52edbe3cdfd77636fd122262dccfbf"
}
],
"blockNumber": 18459255,
"cumulativeGasUsed": "249288",
"status": 1,
"byzantium": true
},
"args": [
"0x52Aa899454998Be5b000Ad077a46Bbe360F4e497"
],
"numDeployments": 1,
"solcInputHash": "d4fa359f3002cd44062d748848196ced",
"metadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IFluidLiquidity\",\"name\":\"liquidity_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"errorId_\",\"type\":\"uint256\"}],\"name\":\"FluidLiquidityCalcsError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FluidLiquidityResolver__AddressZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LIQUIDITY\",\"outputs\":[{\"internalType\":\"contract IFluidLiquidity\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getExchangePricesAndConfig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getOverallTokenData\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData\",\"name\":\"overallTokenData_\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens_\",\"type\":\"address[]\"}],\"name\":\"getOverallTokensData\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData[]\",\"name\":\"overallTokensData_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getRateConfig\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getRevenue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"revenueAmount_\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRevenueCollector\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getTokenRateData\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData_\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens_\",\"type\":\"address[]\"}],\"name\":\"getTokensRateData\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData[]\",\"name\":\"rateDatas_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getTotalAmounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getUserBorrow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getUserBorrowData\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"modeWithInterest\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"borrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandPercent\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseBorrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBorrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowableUntilLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowable\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserBorrowData\",\"name\":\"userBorrowData_\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData\",\"name\":\"overallTokenData_\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"}],\"name\":\"getUserClass\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokens_\",\"type\":\"address[]\"}],\"name\":\"getUserMultipleBorrowData\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"modeWithInterest\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"borrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandPercent\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseBorrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBorrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowableUntilLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowable\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserBorrowData[]\",\"name\":\"userBorrowingsData_\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData[]\",\"name\":\"overallTokensData_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"supplyTokens_\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"borrowTokens_\",\"type\":\"address[]\"}],\"name\":\"getUserMultipleBorrowSupplyData\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"modeWithInterest\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawalLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandPercent\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseWithdrawalLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawableUntilLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawable\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserSupplyData[]\",\"name\":\"userSuppliesData_\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData[]\",\"name\":\"overallSupplyTokensData_\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"modeWithInterest\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"borrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandPercent\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseBorrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBorrowLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowableUntilLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowable\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserBorrowData[]\",\"name\":\"userBorrowingsData_\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData[]\",\"name\":\"overallBorrowTokensData_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokens_\",\"type\":\"address[]\"}],\"name\":\"getUserMultipleSupplyData\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"modeWithInterest\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawalLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandPercent\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseWithdrawalLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawableUntilLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawable\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserSupplyData[]\",\"name\":\"userSuppliesData_\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData[]\",\"name\":\"overallTokensData_\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getUserSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token_\",\"type\":\"address\"}],\"name\":\"getUserSupplyData\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"modeWithInterest\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawalLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandPercent\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expandDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseWithdrawalLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawableUntilLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawable\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.UserSupplyData\",\"name\":\"userSupplyData_\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"borrowRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastStoredUtilization\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"storageUpdateThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowExchangePrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"supplyInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowRawInterest\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowInterestFree\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"revenue\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV1Params\",\"name\":\"rateDataV1\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"kink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"kink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationZero\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationKink2\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rateAtUtilizationMax\",\"type\":\"uint256\"}],\"internalType\":\"struct Structs.RateDataV2Params\",\"name\":\"rateDataV2\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.RateData\",\"name\":\"rateData\",\"type\":\"tuple\"}],\"internalType\":\"struct Structs.OverallTokenData\",\"name\":\"overallTokenData_\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"auth_\",\"type\":\"address\"}],\"name\":\"isAuth\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guardian_\",\"type\":\"address\"}],\"name\":\"isGuardian\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"listedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"listedTokens_\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_NATIVE_TOKEN_ADDRESS\":{\"details\":\"address that is mapped to the chain native token\"}},\"version\":1},\"userdoc\":{\"errors\":{\"FluidLiquidityResolver__AddressZero()\":[{\"notice\":\"thrown if an input param address is zero\"}]},\"kind\":\"user\",\"methods\":{\"LIQUIDITY()\":{\"notice\":\"address of the liquidity contract\"},\"getExchangePricesAndConfig(address)\":{\"notice\":\"gets exchangePricesAndConfig packed uint256 storage slot for `token_`.\"},\"getOverallTokenData(address)\":{\"notice\":\"returns general data for `token_` such as rates, exchange prices, utilization, fee, total amounts etc.\"},\"getOverallTokensData(address[])\":{\"notice\":\"returns general data for multiple `tokens_` such as rates, exchange prices, utilization, fee, total amounts etc.\"},\"getRateConfig(address)\":{\"notice\":\"gets rateConfig packed uint256 storage slot for `token_`.\"},\"getRevenue(address)\":{\"notice\":\"gets the `revenueAmount_` for a `token_`.\"},\"getRevenueCollector()\":{\"notice\":\"address of contract that gets sent the revenue. Configurable by governance\"},\"getStatus()\":{\"notice\":\"Liquidity contract paused status: status = 1 -> normal. status = 2 -> paused.\"},\"getTokenRateData(address)\":{\"notice\":\"get the Rate config data `rateData_` for a `token_` compiled from the packed uint256 rateConfig storage slot\"},\"getTokensRateData(address[])\":{\"notice\":\"get the Rate config datas `rateDatas_` for multiple `tokens_` compiled from the packed uint256 rateConfig storage slot\"},\"getTotalAmounts(address)\":{\"notice\":\"gets totalAmounts packed uint256 storage slot for `token_`.\"},\"getUserBorrow(address,address)\":{\"notice\":\"gets userBorrow data packed uint256 storage slot for `user_` and `token_`.\"},\"getUserBorrowData(address,address)\":{\"notice\":\"returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for `token_`\"},\"getUserClass(address)\":{\"notice\":\"gets user class for `user_`. Class defines which protocols can be paused by guardians. Currently there are 2 classes: 0 can be paused by guardians. 1 cannot be paused by guardians. New protocols are added as class 0 and will be upgraded to 1 over time.\"},\"getUserMultipleBorrowData(address,address[])\":{\"notice\":\"returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `tokens_`\"},\"getUserMultipleBorrowSupplyData(address,address[],address[])\":{\"notice\":\"returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `supplyTokens_` and returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `borrowTokens_`\"},\"getUserMultipleSupplyData(address,address[])\":{\"notice\":\"returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `tokens_`\"},\"getUserSupply(address,address)\":{\"notice\":\"gets userSupply data packed uint256 storage slot for `user_` and `token_`.\"},\"getUserSupplyData(address,address)\":{\"notice\":\"returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for `token_`\"},\"isAuth(address)\":{\"notice\":\"checks if `auth_` is an allowed auth on Liquidity. Auths can set most config values. E.g. contracts that automate certain flows like e.g. adding a new fToken. Governance can add/remove auths. Governance is auth by default.\"},\"isGuardian(address)\":{\"notice\":\"checks if `guardian_` is an allowed Guardian on Liquidity. Guardians can pause lower class users. Governance can add/remove guardians. Governance is guardian by default.\"},\"listedTokens()\":{\"notice\":\"returns all `listedTokens_` at the Liquidity contract. Once configured, a token can never be removed.\"}},\"notice\":\"Fluid Liquidity resolver Implements various view-only methods to give easy access to Liquidity data.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/periphery/resolvers/liquidity/main.sol\":\"FluidLiquidityResolver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"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/bigMathMinified.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\n/// @title library that represents a number in BigNumber(coefficient and exponent) format to store in smaller bits.\\n/// @notice the number is divided into two parts: a coefficient and an exponent. This comes at a cost of losing some precision\\n/// at the end of the number because the exponent simply fills it with zeroes. This precision is oftentimes negligible and can\\n/// result in significant gas cost reduction due to storage space reduction.\\n/// Also note, a valid big number is as follows: if the exponent is > 0, then coefficient last bits should be occupied to have max precision.\\n/// @dev roundUp is more like a increase 1, which happens everytime for the same number.\\n/// roundDown simply sets trailing digits after coefficientSize to zero (floor), only once for the same number.\\nlibrary BigMathMinified {\\n /// @dev constants to use for `roundUp` input param to increase readability\\n bool internal constant ROUND_DOWN = false;\\n bool internal constant ROUND_UP = true;\\n\\n /// @dev converts `normal` number to BigNumber with `exponent` and `coefficient` (or precision).\\n /// e.g.:\\n /// 5035703444687813576399599 (normal) = (coefficient[32bits], exponent[8bits])[40bits]\\n /// 5035703444687813576399599 (decimal) => 10000101010010110100000011111011110010100110100000000011100101001101001101011101111 (binary)\\n /// => 10000101010010110100000011111011000000000000000000000000000000000000000000000000000\\n /// ^-------------------- 51(exponent) -------------- ^\\n /// coefficient = 1000,0101,0100,1011,0100,0000,1111,1011 (2236301563)\\n /// exponent = 0011,0011 (51)\\n /// bigNumber = 1000,0101,0100,1011,0100,0000,1111,1011,0011,0011 (572493200179)\\n ///\\n /// @param normal number which needs to be converted into Big Number\\n /// @param coefficientSize at max how many bits of precision there should be (64 = uint64 (64 bits precision))\\n /// @param exponentSize at max how many bits of exponent there should be (8 = uint8 (8 bits exponent))\\n /// @param roundUp signals if result should be rounded down or up\\n /// @return bigNumber converted bigNumber (coefficient << exponent)\\n function toBigNumber(\\n uint256 normal,\\n uint256 coefficientSize,\\n uint256 exponentSize,\\n bool roundUp\\n ) internal pure returns (uint256 bigNumber) {\\n assembly {\\n let lastBit_\\n let number_ := normal\\n if gt(number_, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) {\\n number_ := shr(0x80, number_)\\n lastBit_ := 0x80\\n }\\n if gt(number_, 0xFFFFFFFFFFFFFFFF) {\\n number_ := shr(0x40, number_)\\n lastBit_ := add(lastBit_, 0x40)\\n }\\n if gt(number_, 0xFFFFFFFF) {\\n number_ := shr(0x20, number_)\\n lastBit_ := add(lastBit_, 0x20)\\n }\\n if gt(number_, 0xFFFF) {\\n number_ := shr(0x10, number_)\\n lastBit_ := add(lastBit_, 0x10)\\n }\\n if gt(number_, 0xFF) {\\n number_ := shr(0x8, number_)\\n lastBit_ := add(lastBit_, 0x8)\\n }\\n if gt(number_, 0xF) {\\n number_ := shr(0x4, number_)\\n lastBit_ := add(lastBit_, 0x4)\\n }\\n if gt(number_, 0x3) {\\n number_ := shr(0x2, number_)\\n lastBit_ := add(lastBit_, 0x2)\\n }\\n if gt(number_, 0x1) {\\n lastBit_ := add(lastBit_, 1)\\n }\\n if gt(number_, 0) {\\n lastBit_ := add(lastBit_, 1)\\n }\\n if lt(lastBit_, coefficientSize) {\\n // for throw exception\\n lastBit_ := coefficientSize\\n }\\n let exponent := sub(lastBit_, coefficientSize)\\n let coefficient := shr(exponent, normal)\\n if and(roundUp, gt(exponent, 0)) {\\n // rounding up is only needed if exponent is > 0, as otherwise the coefficient fully holds the original number\\n coefficient := add(coefficient, 1)\\n if eq(shl(coefficientSize, 1), coefficient) {\\n // case were coefficient was e.g. 111, with adding 1 it became 1000 (in binary) and coefficientSize 3 bits\\n // final coefficient would exceed it's size. -> reduce coefficent to 100 and increase exponent by 1.\\n coefficient := shl(sub(coefficientSize, 1), 1)\\n exponent := add(exponent, 1)\\n }\\n }\\n if iszero(lt(exponent, shl(exponentSize, 1))) {\\n // if exponent is >= exponentSize, the normal number is too big to fit within\\n // BigNumber with too small sizes for coefficient and exponent\\n revert(0, 0)\\n }\\n bigNumber := shl(exponentSize, coefficient)\\n bigNumber := add(bigNumber, exponent)\\n }\\n }\\n\\n /// @dev get `normal` number from `bigNumber`, `exponentSize` and `exponentMask`\\n function fromBigNumber(\\n uint256 bigNumber,\\n uint256 exponentSize,\\n uint256 exponentMask\\n ) internal pure returns (uint256 normal) {\\n assembly {\\n let coefficient := shr(exponentSize, bigNumber)\\n let exponent := and(bigNumber, exponentMask)\\n normal := shl(exponent, coefficient)\\n }\\n }\\n\\n /// @dev gets the most significant bit `lastBit` of a `normal` number (length of given number of binary format).\\n /// e.g.\\n /// 5035703444687813576399599 = 10000101010010110100000011111011110010100110100000000011100101001101001101011101111\\n /// lastBit = ^--------------------------------- 83 ----------------------------------------^\\n function mostSignificantBit(uint256 normal) internal pure returns (uint lastBit) {\\n assembly {\\n let number_ := normal\\n if gt(normal, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) {\\n number_ := shr(0x80, number_)\\n lastBit := 0x80\\n }\\n if gt(number_, 0xFFFFFFFFFFFFFFFF) {\\n number_ := shr(0x40, number_)\\n lastBit := add(lastBit, 0x40)\\n }\\n if gt(number_, 0xFFFFFFFF) {\\n number_ := shr(0x20, number_)\\n lastBit := add(lastBit, 0x20)\\n }\\n if gt(number_, 0xFFFF) {\\n number_ := shr(0x10, number_)\\n lastBit := add(lastBit, 0x10)\\n }\\n if gt(number_, 0xFF) {\\n number_ := shr(0x8, number_)\\n lastBit := add(lastBit, 0x8)\\n }\\n if gt(number_, 0xF) {\\n number_ := shr(0x4, number_)\\n lastBit := add(lastBit, 0x4)\\n }\\n if gt(number_, 0x3) {\\n number_ := shr(0x2, number_)\\n lastBit := add(lastBit, 0x2)\\n }\\n if gt(number_, 0x1) {\\n lastBit := add(lastBit, 1)\\n }\\n if gt(number_, 0) {\\n lastBit := add(lastBit, 1)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf0be1002909edf30aec3dc6623c2bd2407ed94064b62674c01032b844dec206a\",\"license\":\"BUSL-1.1\"},\"contracts/libraries/errorTypes.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nlibrary LibsErrorTypes {\\n /***********************************|\\n | LiquidityCalcs | \\n |__________________________________*/\\n\\n /// @notice thrown when supply or borrow exchange price is zero at calc token data (token not configured yet)\\n uint256 internal constant LiquidityCalcs__ExchangePriceZero = 70001;\\n\\n /// @notice thrown when rate data is set to a version that is not implemented\\n uint256 internal constant LiquidityCalcs__UnsupportedRateVersion = 70002;\\n\\n /***********************************|\\n | SafeTransfer | \\n |__________________________________*/\\n\\n /// @notice thrown when safe transfer from for an ERC20 fails\\n uint256 internal constant SafeTransfer__TransferFromFailed = 71001;\\n\\n /// @notice thrown when safe transfer for an ERC20 fails\\n uint256 internal constant SafeTransfer__TransferFailed = 71002;\\n}\\n\",\"keccak256\":\"0xfcd8d3b052c8e023b0db72cb9afe55c552d5a1ef4741dbcd1a494145f2d5ff62\",\"license\":\"BUSL-1.1\"},\"contracts/libraries/liquidityCalcs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { LibsErrorTypes as ErrorTypes } from \\\"./errorTypes.sol\\\";\\nimport { LiquiditySlotsLink } from \\\"./liquiditySlotsLink.sol\\\";\\nimport { BigMathMinified } from \\\"./bigMathMinified.sol\\\";\\n\\n/// @notice implements calculation methods used for Fluid liquidity such as updated exchange prices,\\n/// borrow rate, withdrawal / borrow limits, revenue amount.\\nlibrary LiquidityCalcs {\\n error FluidLiquidityCalcsError(uint256 errorId_);\\n\\n /// @notice emitted if the calculated borrow rate surpassed max borrow rate (16 bits) and was capped at maximum value 65535\\n event BorrowRateMaxCap();\\n\\n /// @dev constants as from Liquidity variables.sol\\n uint256 internal constant EXCHANGE_PRICES_PRECISION = 1e12;\\n\\n /// @dev Ignoring leap years\\n uint256 internal constant SECONDS_PER_YEAR = 365 days;\\n // constants used for BigMath conversion from and to storage\\n uint256 internal constant DEFAULT_EXPONENT_SIZE = 8;\\n uint256 internal constant DEFAULT_EXPONENT_MASK = 0xFF;\\n\\n uint256 internal constant FOUR_DECIMALS = 1e4;\\n uint256 internal constant TWELVE_DECIMALS = 1e12;\\n uint256 internal constant X14 = 0x3fff;\\n uint256 internal constant X15 = 0x7fff;\\n uint256 internal constant X16 = 0xffff;\\n uint256 internal constant X18 = 0x3ffff;\\n uint256 internal constant X24 = 0xffffff;\\n uint256 internal constant X33 = 0x1ffffffff;\\n uint256 internal constant X64 = 0xffffffffffffffff;\\n\\n ///////////////////////////////////////////////////////////////////////////\\n ////////// CALC EXCHANGE PRICES /////////\\n ///////////////////////////////////////////////////////////////////////////\\n\\n /// @dev calculates interest (exchange prices) for a token given its' exchangePricesAndConfig from storage.\\n /// @param exchangePricesAndConfig_ exchange prices and config packed uint256 read from storage\\n /// @return supplyExchangePrice_ updated supplyExchangePrice\\n /// @return borrowExchangePrice_ updated borrowExchangePrice\\n function calcExchangePrices(\\n uint256 exchangePricesAndConfig_\\n ) internal view returns (uint256 supplyExchangePrice_, uint256 borrowExchangePrice_) {\\n // Extracting exchange prices\\n supplyExchangePrice_ =\\n (exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_SUPPLY_EXCHANGE_PRICE) &\\n X64;\\n borrowExchangePrice_ =\\n (exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_BORROW_EXCHANGE_PRICE) &\\n X64;\\n\\n if (supplyExchangePrice_ == 0 || borrowExchangePrice_ == 0) {\\n revert FluidLiquidityCalcsError(ErrorTypes.LiquidityCalcs__ExchangePriceZero);\\n }\\n\\n uint256 temp_ = exchangePricesAndConfig_ & X16; // temp_ = borrowRate\\n\\n unchecked {\\n // last timestamp can not be > current timestamp\\n uint256 secondsSinceLastUpdate_ = block.timestamp -\\n ((exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_LAST_TIMESTAMP) & X33);\\n\\n uint256 borrowRatio_ = (exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_BORROW_RATIO) &\\n X15;\\n if (secondsSinceLastUpdate_ == 0 || temp_ == 0 || borrowRatio_ == 1) {\\n // if no time passed, borrow rate is 0, or no raw borrowings: no exchange price update needed\\n // (if borrowRatio_ == 1 means there is only borrowInterestFree, as first bit is 1 and rest is 0)\\n return (supplyExchangePrice_, borrowExchangePrice_);\\n }\\n\\n // calculate new borrow exchange price.\\n // formula borrowExchangePriceIncrease: previous price * borrow rate * secondsSinceLastUpdate_.\\n // nominator is max uint112 (uint64 * uint16 * uint32). Divisor can not be 0.\\n borrowExchangePrice_ +=\\n (borrowExchangePrice_ * temp_ * secondsSinceLastUpdate_) /\\n (SECONDS_PER_YEAR * FOUR_DECIMALS);\\n\\n // FOR SUPPLY EXCHANGE PRICE:\\n // all yield paid by borrowers (in mode with interest) goes to suppliers in mode with interest.\\n // formula: previous price * supply rate * secondsSinceLastUpdate_.\\n // where supply rate = (borrow rate - revenueFee%) * ratioSupplyYield. And\\n // ratioSupplyYield = utilization * supplyRatio * borrowRatio\\n //\\n // Example:\\n // supplyRawInterest is 80, supplyInterestFree is 20. totalSupply is 100. BorrowedRawInterest is 50.\\n // BorrowInterestFree is 10. TotalBorrow is 60. borrow rate 40%, revenueFee 10%.\\n // yield is 10 (so half a year must have passed).\\n // supplyRawInterest must become worth 89. totalSupply must become 109. BorrowedRawInterest must become 60.\\n // borrowInterestFree must still be 10. supplyInterestFree still 20. totalBorrow 70.\\n // supplyExchangePrice would have to go from 1 to 1,125 (+ 0.125). borrowExchangePrice from 1 to 1,2 (+0.2).\\n // utilization is 60%. supplyRatio = 20 / 80 = 25% (only 80% of lenders receiving yield).\\n // borrowRatio = 10 / 50 = 20% (only 83,333% of borrowers paying yield):\\n // x of borrowers paying yield = 100% - (20 / (100 + 20)) = 100% - 16.6666666% = 83,333%.\\n // ratioSupplyYield = 60% * 83,33333% * (100% + 20%) = 62,5%\\n // supplyRate = (40% * (100% - 10%)) * = 36% * 62,5% = 22.5%\\n // increase in supplyExchangePrice, assuming 100 as previous price.\\n // 100 * 22,5% * 1/2 (half a year) = 0,1125.\\n // cross-check supplyRawInterest worth = 80 * 1.1125 = 89. totalSupply worth = 89 + 20.\\n\\n // -------------- 1. calculate ratioSupplyYield --------------------------------\\n // step1: utilization * supplyRatio (or actually part of lenders receiving yield)\\n\\n // temp_ => supplyRatio (in 1e2: 100% = 10_000; 1% = 100 -> max value 16_383)\\n // if first bit 0 then ratio is supplyInterestFree / supplyWithInterest (supplyWithInterest is bigger)\\n // else ratio is supplyWithInterest / supplyInterestFree (supplyInterestFree is bigger)\\n temp_ = (exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_SUPPLY_RATIO) & X15;\\n\\n if (temp_ == 1) {\\n // if no raw supply: no exchange price update needed\\n // (if supplyRatio_ == 1 means there is only supplyInterestFree, as first bit is 1 and rest is 0)\\n return (supplyExchangePrice_, borrowExchangePrice_);\\n }\\n\\n // ratioSupplyYield precision is 1e27 as 100% for increased precision when supplyInterestFree > supplyWithInterest\\n if (temp_ & 1 == 1) {\\n // ratio is supplyWithInterest / supplyInterestFree (supplyInterestFree is bigger)\\n temp_ = temp_ >> 1;\\n\\n // Note: case where temp_ == 0 (only supplyInterestFree, no yield) already covered by early return\\n // in the if statement a little above.\\n\\n // based on above example but supplyRawInterest is 20, supplyInterestFree is 80. no fee.\\n // supplyRawInterest must become worth 30. totalSupply must become 110.\\n // supplyExchangePrice would have to go from 1 to 1,5. borrowExchangePrice from 1 to 1,2.\\n // so ratioSupplyYield must come out as 2.5 (250%).\\n // supplyRatio would be (20 * 10_000 / 80) = 2500. but must be inverted.\\n temp_ = (1e27 * FOUR_DECIMALS) / temp_; // e.g. 1e31 / 2500 = 4e27. (* 1e27 for precision)\\n // e.g. 5_000 * (1e27 + 4e27) / 1e27 = 25_000 (=250%).\\n temp_ =\\n // utilization * (100% + 100% / supplyRatio)\\n (((exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_UTILIZATION) & X14) *\\n (1e27 + temp_)) / // extract utilization (max 16_383 so there is no way this can overflow).\\n (FOUR_DECIMALS);\\n // max possible value of temp_ here is 16383 * (1e27 + 1e31) / 1e4 = ~1.64e31\\n } else {\\n // ratio is supplyInterestFree / supplyWithInterest (supplyWithInterest is bigger)\\n temp_ = temp_ >> 1;\\n // if temp_ == 0 then only supplyWithInterest => full yield. temp_ is already 0\\n\\n // e.g. 5_000 * 10_000 + (20 * 10_000 / 80) / 10_000 = 5000 * 12500 / 10000 = 6250 (=62.5%).\\n temp_ =\\n // 1e27 * utilization * (100% + supplyRatio) / 100%\\n (1e27 *\\n ((exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_UTILIZATION) & X14) * // extract utilization (max 16_383 so there is no way this can overflow).\\n (FOUR_DECIMALS + temp_)) /\\n (FOUR_DECIMALS * FOUR_DECIMALS);\\n // max possible temp_ value: 1e27 * 16383 * 2e4 / 1e8 = 3.2766e27\\n }\\n // from here temp_ => ratioSupplyYield (utilization * supplyRatio part) scaled by 1e27. max possible value ~1.64e31\\n\\n // step2 of ratioSupplyYield: add borrowRatio (only x% of borrowers paying yield)\\n if (borrowRatio_ & 1 == 1) {\\n // ratio is borrowWithInterest / borrowInterestFree (borrowInterestFree is bigger)\\n borrowRatio_ = borrowRatio_ >> 1;\\n // borrowRatio_ => x of total bororwers paying yield. scale to 1e27.\\n\\n // Note: case where borrowRatio_ == 0 (only borrowInterestFree, no yield) already covered\\n // at the beginning of the method by early return if `borrowRatio_ == 1`.\\n\\n // based on above example but borrowRawInterest is 10, borrowInterestFree is 50. no fee. borrowRatio = 20%.\\n // so only 16.66% of borrowers are paying yield. so the 100% - part of the formula is not needed.\\n // x of borrowers paying yield = (borrowRatio / (100 + borrowRatio)) = 16.6666666%\\n // borrowRatio_ => x of total bororwers paying yield. scale to 1e27.\\n borrowRatio_ = (borrowRatio_ * 1e27) / (FOUR_DECIMALS + borrowRatio_);\\n // max value here for borrowRatio_ is (1e31 / (1e4 + 1e4))= 5e26 (= 50% of borrowers paying yield).\\n } else {\\n // ratio is borrowInterestFree / borrowWithInterest (borrowWithInterest is bigger)\\n borrowRatio_ = borrowRatio_ >> 1;\\n\\n // borrowRatio_ => x of total bororwers paying yield. scale to 1e27.\\n // x of borrowers paying yield = 100% - (borrowRatio / (100 + borrowRatio)) = 100% - 16.6666666% = 83,333%.\\n borrowRatio_ = (1e27 - ((borrowRatio_ * 1e27) / (FOUR_DECIMALS + borrowRatio_)));\\n // borrowRatio can never be > 100%. so max subtraction can be 100% - 100% / 200%.\\n // or if borrowRatio_ is 0 -> 100% - 0. or if borrowRatio_ is 1 -> 100% - 1 / 101.\\n // max value here for borrowRatio_ is 1e27 - 0 = 1e27 (= 100% of borrowers paying yield).\\n }\\n\\n // temp_ => ratioSupplyYield. scaled down from 1e25 = 1% each to normal percent precision 1e2 = 1%.\\n // max nominator value is ~1.64e31 * 1e27 = 1.64e58. max result = 1.64e8\\n temp_ = (FOUR_DECIMALS * temp_ * borrowRatio_) / 1e54;\\n\\n // 2. calculate supply rate\\n // temp_ => supply rate (borrow rate - revenueFee%) * ratioSupplyYield.\\n // division part is done in next step to increase precision. (divided by 2x FOUR_DECIMALS, fee + borrowRate)\\n // Note that all calculation divisions for supplyExchangePrice are rounded down.\\n // Note supply rate can be bigger than the borrowRate, e.g. if there are only few lenders with interest\\n // but more suppliers not earning interest.\\n temp_ = ((exchangePricesAndConfig_ & X16) * // borrow rate\\n temp_ * // ratioSupplyYield\\n (FOUR_DECIMALS - ((exchangePricesAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_FEE) & X14))); // revenueFee\\n // fee can not be > 100%. max possible = 65535 * ~1.64e8 * 1e4 =~1.074774e17.\\n\\n // 3. calculate increase in supply exchange price\\n supplyExchangePrice_ += ((supplyExchangePrice_ * temp_ * secondsSinceLastUpdate_) /\\n (SECONDS_PER_YEAR * FOUR_DECIMALS * FOUR_DECIMALS * FOUR_DECIMALS));\\n // max possible nominator = max uint 64 * 1.074774e17 * max uint32 = ~8.52e45. Denominator can not be 0.\\n }\\n }\\n\\n ///////////////////////////////////////////////////////////////////////////\\n ////////// CALC REVENUE /////////\\n ///////////////////////////////////////////////////////////////////////////\\n\\n /// @dev gets the `revenueAmount_` for a token given its' totalAmounts and exchangePricesAndConfig from storage\\n /// and the current balance of the Fluid liquidity contract for the token.\\n /// @param totalAmounts_ total amounts packed uint256 read from storage\\n /// @param exchangePricesAndConfig_ exchange prices and config packed uint256 read from storage\\n /// @param liquidityTokenBalance_ current balance of Liquidity contract (IERC20(token_).balanceOf(address(this)))\\n /// @return revenueAmount_ collectable revenue amount\\n function calcRevenue(\\n uint256 totalAmounts_,\\n uint256 exchangePricesAndConfig_,\\n uint256 liquidityTokenBalance_\\n ) internal view returns (uint256 revenueAmount_) {\\n // @dev no need to super-optimize this method as it is only used by admin\\n\\n // calculate the new exchange prices based on earned interest\\n (uint256 supplyExchangePrice_, uint256 borrowExchangePrice_) = calcExchangePrices(exchangePricesAndConfig_);\\n\\n // total supply = interest free + with interest converted from raw\\n uint256 totalSupply_ = getTotalSupply(totalAmounts_, supplyExchangePrice_);\\n\\n if (totalSupply_ > 0) {\\n // available revenue: balanceOf(token) + totalBorrowings - totalLendings.\\n revenueAmount_ = liquidityTokenBalance_ + getTotalBorrow(totalAmounts_, borrowExchangePrice_);\\n // ensure there is no possible case because of rounding etc. where this would revert,\\n // explicitly check if >\\n revenueAmount_ = revenueAmount_ > totalSupply_ ? revenueAmount_ - totalSupply_ : 0;\\n // Note: if utilization > 100% (totalSupply < totalBorrow), then all the amount above 100% utilization\\n // can only be revenue.\\n } else {\\n // if supply is 0, then rest of balance can be withdrawn as revenue so that no amounts get stuck\\n revenueAmount_ = liquidityTokenBalance_;\\n }\\n }\\n\\n ///////////////////////////////////////////////////////////////////////////\\n ////////// CALC LIMITS /////////\\n ///////////////////////////////////////////////////////////////////////////\\n\\n /// @dev calculates withdrawal limit before an operate execution:\\n /// amount of user supply that must stay supplied (not amount that can be withdrawn).\\n /// i.e. if user has supplied 100m and can withdraw 5M, this method returns the 95M, not the withdrawable amount 5M\\n /// @param userSupplyData_ user supply data packed uint256 from storage\\n /// @param userSupply_ current user supply amount already extracted from `userSupplyData_` and converted from BigMath\\n /// @return currentWithdrawalLimit_ current withdrawal limit updated for expansion since last interaction.\\n /// returned value is in raw for with interest mode, normal amount for interest free mode!\\n function calcWithdrawalLimitBeforeOperate(\\n uint256 userSupplyData_,\\n uint256 userSupply_\\n ) internal view returns (uint256 currentWithdrawalLimit_) {\\n // @dev must support handling the case where timestamp is 0 (config is set but no interactions yet).\\n // first tx where timestamp is 0 will enter `if (lastWithdrawalLimit_ == 0)` because lastWithdrawalLimit_ is not set yet.\\n // returning max withdrawal allowed, which is not exactly right but doesn't matter because the first interaction must be\\n // a deposit anyway. Important is that it would not revert.\\n\\n // Note the first time a deposit brings the user supply amount to above the base withdrawal limit, the active limit\\n // is the fully expanded limit immediately.\\n\\n // extract last set withdrawal limit\\n uint256 lastWithdrawalLimit_ = (userSupplyData_ >>\\n LiquiditySlotsLink.BITS_USER_SUPPLY_PREVIOUS_WITHDRAWAL_LIMIT) & X64;\\n lastWithdrawalLimit_ =\\n (lastWithdrawalLimit_ >> DEFAULT_EXPONENT_SIZE) <<\\n (lastWithdrawalLimit_ & DEFAULT_EXPONENT_MASK);\\n if (lastWithdrawalLimit_ == 0) {\\n // withdrawal limit is not activated. Max withdrawal allowed\\n return 0;\\n }\\n\\n uint256 maxWithdrawableLimit_;\\n uint256 temp_;\\n unchecked {\\n // extract max withdrawable percent of user supply and\\n // calculate maximum withdrawable amount expandPercentage of user supply at full expansion duration elapsed\\n // e.g.: if 10% expandPercentage, meaning 10% is withdrawable after full expandDuration has elapsed.\\n\\n // userSupply_ needs to be atleast 1e73 to overflow max limit of ~1e77 in uint256 (no token in existence where this is possible).\\n maxWithdrawableLimit_ =\\n (((userSupplyData_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_EXPAND_PERCENT) & X14) * userSupply_) /\\n FOUR_DECIMALS;\\n\\n // time elapsed since last withdrawal limit was set (in seconds)\\n // @dev last process timestamp is guaranteed to exist for withdrawal, as a supply must have happened before.\\n // last timestamp can not be > current timestamp\\n temp_ =\\n block.timestamp -\\n ((userSupplyData_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_LAST_UPDATE_TIMESTAMP) & X33);\\n }\\n // calculate withdrawable amount of expandPercent that is elapsed of expandDuration.\\n // e.g. if 60% of expandDuration has elapsed, then user should be able to withdraw 6% of user supply, down to 94%.\\n // Note: no explicit check for this needed, it is covered by setting minWithdrawalLimit_ if needed.\\n temp_ =\\n (maxWithdrawableLimit_ * temp_) /\\n // extract expand duration: After this, decrement won't happen (user can withdraw 100% of withdraw limit)\\n ((userSupplyData_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_EXPAND_DURATION) & X24); // expand duration can never be 0\\n // calculate expanded withdrawal limit: last withdrawal limit - withdrawable amount.\\n // Note: withdrawable amount here can grow bigger than userSupply if timeElapsed is a lot bigger than expandDuration,\\n // which would cause the subtraction `lastWithdrawalLimit_ - withdrawableAmount_` to revert. In that case, set 0\\n // which will cause minimum (fully expanded) withdrawal limit to be set in lines below.\\n unchecked {\\n // underflow explicitly checked & handled\\n currentWithdrawalLimit_ = lastWithdrawalLimit_ > temp_ ? lastWithdrawalLimit_ - temp_ : 0;\\n // calculate minimum withdrawal limit: minimum amount of user supply that must stay supplied at full expansion.\\n // subtraction can not underflow as maxWithdrawableLimit_ is a percentage amount (<=100%) of userSupply_\\n temp_ = userSupply_ - maxWithdrawableLimit_;\\n }\\n // if withdrawal limit is decreased below minimum then set minimum\\n // (e.g. when more than expandDuration time has elapsed)\\n if (temp_ > currentWithdrawalLimit_) {\\n currentWithdrawalLimit_ = temp_;\\n }\\n }\\n\\n /// @dev calculates withdrawal limit after an operate execution:\\n /// amount of user supply that must stay supplied (not amount that can be withdrawn).\\n /// i.e. if user has supplied 100m and can withdraw 5M, this method returns the 95M, not the withdrawable amount 5M\\n /// @param userSupplyData_ user supply data packed uint256 from storage\\n /// @param userSupply_ current user supply amount already extracted from `userSupplyData_` and added / subtracted with the executed operate amount\\n /// @param newWithdrawalLimit_ current withdrawal limit updated for expansion since last interaction, result from `calcWithdrawalLimitBeforeOperate`\\n /// @return withdrawalLimit_ updated withdrawal limit that should be written to storage. returned value is in\\n /// raw for with interest mode, normal amount for interest free mode!\\n function calcWithdrawalLimitAfterOperate(\\n uint256 userSupplyData_,\\n uint256 userSupply_,\\n uint256 newWithdrawalLimit_\\n ) internal pure returns (uint256) {\\n // temp_ => base withdrawal limit. below this, maximum withdrawals are allowed\\n uint256 temp_ = (userSupplyData_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_BASE_WITHDRAWAL_LIMIT) & X18;\\n temp_ = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n\\n // if user supply is below base limit then max withdrawals are allowed\\n if (userSupply_ < temp_) {\\n return 0;\\n }\\n // temp_ => withdrawal limit expandPercent (is in 1e2 decimals)\\n temp_ = (userSupplyData_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_EXPAND_PERCENT) & X14;\\n unchecked {\\n // temp_ => minimum withdrawal limit: userSupply - max withdrawable limit (userSupply * expandPercent))\\n // userSupply_ needs to be atleast 1e73 to overflow max limit of ~1e77 in uint256 (no token in existence where this is possible).\\n // subtraction can not underflow as maxWithdrawableLimit_ is a percentage amount (<=100%) of userSupply_\\n temp_ = userSupply_ - ((userSupply_ * temp_) / FOUR_DECIMALS);\\n }\\n // if new (before operation) withdrawal limit is less than minimum limit then set minimum limit.\\n // e.g. can happen on new deposits. withdrawal limit is instantly fully expanded in a scenario where\\n // increased deposit amount outpaces withrawals.\\n if (temp_ > newWithdrawalLimit_) {\\n return temp_;\\n }\\n return newWithdrawalLimit_;\\n }\\n\\n /// @dev calculates borrow limit before an operate execution:\\n /// total amount user borrow can reach (not borrowable amount in current operation).\\n /// i.e. if user has borrowed 50M and can still borrow 5M, this method returns the total 55M, not the borrowable amount 5M\\n /// @param userBorrowData_ user borrow data packed uint256 from storage\\n /// @param userBorrow_ current user borrow amount already extracted from `userBorrowData_`\\n /// @return currentBorrowLimit_ current borrow limit updated for expansion since last interaction. returned value is in\\n /// raw for with interest mode, normal amount for interest free mode!\\n function calcBorrowLimitBeforeOperate(\\n uint256 userBorrowData_,\\n uint256 userBorrow_\\n ) internal view returns (uint256 currentBorrowLimit_) {\\n // @dev must support handling the case where timestamp is 0 (config is set but no interactions yet) -> base limit.\\n // first tx where timestamp is 0 will enter `if (maxExpandedBorrowLimit_ < baseBorrowLimit_)` because `userBorrow_` and thus\\n // `maxExpansionLimit_` and thus `maxExpandedBorrowLimit_` is 0 and `baseBorrowLimit_` can not be 0.\\n\\n // temp_ = extract borrow expand percent (is in 1e2 decimals)\\n uint256 temp_ = (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_EXPAND_PERCENT) & X14;\\n\\n uint256 maxExpansionLimit_;\\n uint256 maxExpandedBorrowLimit_;\\n unchecked {\\n // calculate max expansion limit: Max amount limit can expand to since last interaction\\n // userBorrow_ needs to be atleast 1e73 to overflow max limit of ~1e77 in uint256 (no token in existence where this is possible).\\n maxExpansionLimit_ = ((userBorrow_ * temp_) / FOUR_DECIMALS);\\n\\n // calculate max borrow limit: Max point limit can increase to since last interaction\\n maxExpandedBorrowLimit_ = userBorrow_ + maxExpansionLimit_;\\n }\\n\\n // currentBorrowLimit_ = extract base borrow limit\\n currentBorrowLimit_ = (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_BASE_BORROW_LIMIT) & X18;\\n currentBorrowLimit_ =\\n (currentBorrowLimit_ >> DEFAULT_EXPONENT_SIZE) <<\\n (currentBorrowLimit_ & DEFAULT_EXPONENT_MASK);\\n\\n if (maxExpandedBorrowLimit_ < currentBorrowLimit_) {\\n return currentBorrowLimit_;\\n }\\n // time elapsed since last borrow limit was set (in seconds)\\n unchecked {\\n // temp_ = timeElapsed_ (last timestamp can not be > current timestamp)\\n temp_ =\\n block.timestamp -\\n ((userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_LAST_UPDATE_TIMESTAMP) & X33); // extract last udpate timestamp\\n }\\n\\n // currentBorrowLimit_ = expandedBorrowableAmount + extract last set borrow limit\\n currentBorrowLimit_ =\\n // calculate borrow limit expansion since last interaction for `expandPercent` that is elapsed of `expandDuration`.\\n // divisor is extract expand duration (after this, full expansion to expandPercentage happened).\\n ((maxExpansionLimit_ * temp_) /\\n ((userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_EXPAND_DURATION) & X24)) + // expand duration can never be 0\\n // extract last set borrow limit\\n BigMathMinified.fromBigNumber(\\n (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_PREVIOUS_BORROW_LIMIT) & X64,\\n DEFAULT_EXPONENT_SIZE,\\n DEFAULT_EXPONENT_MASK\\n );\\n\\n // if timeElapsed is bigger than expandDuration, new borrow limit would be > max expansion,\\n // so set to `maxExpandedBorrowLimit_` in that case.\\n // also covers the case where last process timestamp = 0 (timeElapsed would simply be very big)\\n if (currentBorrowLimit_ > maxExpandedBorrowLimit_) {\\n currentBorrowLimit_ = maxExpandedBorrowLimit_;\\n }\\n // temp_ = extract hard max borrow limit. Above this user can never borrow (not expandable above)\\n temp_ = (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_MAX_BORROW_LIMIT) & X18;\\n temp_ = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n\\n if (currentBorrowLimit_ > temp_) {\\n currentBorrowLimit_ = temp_;\\n }\\n }\\n\\n /// @dev calculates borrow limit after an operate execution:\\n /// total amount user borrow can reach (not borrowable amount in current operation).\\n /// i.e. if user has borrowed 50M and can still borrow 5M, this method returns the total 55M, not the borrowable amount 5M\\n /// @param userBorrowData_ user borrow data packed uint256 from storage\\n /// @param userBorrow_ current user borrow amount already extracted from `userBorrowData_` and added / subtracted with the executed operate amount\\n /// @param newBorrowLimit_ current borrow limit updated for expansion since last interaction, result from `calcBorrowLimitBeforeOperate`\\n /// @return borrowLimit_ updated borrow limit that should be written to storage.\\n /// returned value is in raw for with interest mode, normal amount for interest free mode!\\n function calcBorrowLimitAfterOperate(\\n uint256 userBorrowData_,\\n uint256 userBorrow_,\\n uint256 newBorrowLimit_\\n ) internal pure returns (uint256 borrowLimit_) {\\n // temp_ = extract borrow expand percent\\n uint256 temp_ = (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_EXPAND_PERCENT) & X14; // (is in 1e2 decimals)\\n\\n unchecked {\\n // borrowLimit_ = calculate maximum borrow limit at full expansion.\\n // userBorrow_ needs to be at least 1e73 to overflow max limit of ~1e77 in uint256 (no token in existence where this is possible).\\n borrowLimit_ = userBorrow_ + ((userBorrow_ * temp_) / FOUR_DECIMALS);\\n }\\n\\n // temp_ = extract base borrow limit\\n temp_ = (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_BASE_BORROW_LIMIT) & X18;\\n temp_ = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n\\n if (borrowLimit_ < temp_) {\\n // below base limit, borrow limit is always base limit\\n return temp_;\\n }\\n // temp_ = extract hard max borrow limit. Above this user can never borrow (not expandable above)\\n temp_ = (userBorrowData_ >> LiquiditySlotsLink.BITS_USER_BORROW_MAX_BORROW_LIMIT) & X18;\\n temp_ = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n\\n // make sure fully expanded borrow limit is not above hard max borrow limit\\n if (borrowLimit_ > temp_) {\\n borrowLimit_ = temp_;\\n }\\n // if new borrow limit (from before operate) is > max borrow limit, set max borrow limit.\\n // (e.g. on a repay shrinking instantly to fully expanded borrow limit from new borrow amount. shrinking is instant)\\n if (newBorrowLimit_ > borrowLimit_) {\\n return borrowLimit_;\\n }\\n return newBorrowLimit_;\\n }\\n\\n ///////////////////////////////////////////////////////////////////////////\\n ////////// CALC RATES /////////\\n ///////////////////////////////////////////////////////////////////////////\\n\\n /// @dev Calculates new borrow rate from utilization for a token\\n /// @param rateData_ rate data packed uint256 from storage for the token\\n /// @param utilization_ totalBorrow / totalSupply. 1e4 = 100% utilization\\n /// @return rate_ rate for that particular token in 1e2 precision (e.g. 5% rate = 500)\\n function calcBorrowRateFromUtilization(uint256 rateData_, uint256 utilization_) internal returns (uint256 rate_) {\\n // extract rate version: 4 bits (0xF) starting from bit 0\\n uint256 rateVersion_ = (rateData_ & 0xF);\\n\\n if (rateVersion_ == 1) {\\n rate_ = calcRateV1(rateData_, utilization_);\\n } else if (rateVersion_ == 2) {\\n rate_ = calcRateV2(rateData_, utilization_);\\n } else {\\n revert FluidLiquidityCalcsError(ErrorTypes.LiquidityCalcs__UnsupportedRateVersion);\\n }\\n\\n if (rate_ > X16) {\\n // hard cap for borrow rate at maximum value 16 bits (65535) to make sure it does not overflow storage space.\\n // this is unlikely to ever happen if configs stay within expected levels.\\n rate_ = X16;\\n // emit event to more easily become aware\\n emit BorrowRateMaxCap();\\n }\\n }\\n\\n /// @dev calculates the borrow rate based on utilization for rate data version 1 (with one kink) in 1e2 precision\\n /// @param rateData_ rate data packed uint256 from storage for the token\\n /// @param utilization_ in 1e2 (100% = 1e4)\\n /// @return rate_ rate in 1e2 precision\\n function calcRateV1(uint256 rateData_, uint256 utilization_) internal pure returns (uint256 rate_) {\\n /// For rate v1 (one kink) ------------------------------------------------------\\n /// Next 16 bits => 4 - 19 => Rate at utilization 0% (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 20- 35 => Utilization at kink1 (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 36- 51 => Rate at utilization kink1 (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 52- 67 => Rate at utilization 100% (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Last 188 bits => 68-255 => blank, might come in use in future\\n\\n // y = mx + c.\\n // y is borrow rate\\n // x is utilization\\n // m = slope (m can be 0 but never negative)\\n // c is constant (c can be negative)\\n\\n uint256 y1_;\\n uint256 y2_;\\n uint256 x1_;\\n uint256 x2_;\\n\\n // extract kink1: 16 bits (0xFFFF) starting from bit 20\\n // kink is in 1e2, same as utilization, so no conversion needed for direct comparison of the two\\n uint256 kink1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_UTILIZATION_AT_KINK) & X16;\\n if (utilization_ < kink1_) {\\n // if utilization is less than kink\\n y1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_ZERO) & X16;\\n y2_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_KINK) & X16;\\n x1_ = 0; // 0%\\n x2_ = kink1_;\\n } else {\\n // else utilization is greater than kink\\n y1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_KINK) & X16;\\n y2_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_MAX) & X16;\\n x1_ = kink1_;\\n x2_ = FOUR_DECIMALS; // 100%\\n }\\n\\n int256 constant_;\\n uint256 slope_;\\n unchecked {\\n // calculating slope with twelve decimal precision. m = (y2 - y1) / (x2 - x1).\\n // utilization of x2 can not be <= utilization of x1 (so no underflow or 0 divisor) and rate at y2 can not be < rate at y1\\n // y is in 1e2 so can not overflow when multiplied with TWELVE_DECIMALS\\n slope_ = ((y2_ - y1_) * TWELVE_DECIMALS) / (x2_ - x1_);\\n\\n // calculating constant at 12 decimal precision. slope is already in 12 decimal hence only multiple with y1. c = y - mx.\\n // maximum y1_ value is 65535. 65535 * 1e12 can not overflow int256\\n // maximum slope is 65535 - 0 * TWELVE_DECIMALS / 1 = 65535 * 1e12;\\n // maximum x1_ is 100% (9_999 actually) => slope_ * x1_ can not overflow int256\\n // subtraction most extreme case would be 0 - max value slope_ * x1_ => can not underflow int256\\n constant_ = int256(y1_ * TWELVE_DECIMALS) - int256(slope_ * x1_);\\n\\n // calculating new borrow rate\\n // - slope_ max value is 65535 * 1e12,\\n // - utilization max value is let's say 500% (extreme case where borrow rate increases borrow amount without new supply)\\n // - constant max value is 65535 * 1e12\\n // so max values are 65535 * 1e12 * 50_000 + 65535 * 1e12 -> 3.2768*10^21, which easily fits int256\\n // divisor TWELVE_DECIMALS can not be 0\\n rate_ = (uint256(int256(slope_ * utilization_) + constant_)) / TWELVE_DECIMALS;\\n }\\n }\\n\\n /// @dev calculates the borrow rate based on utilization for rate data version 2 (with two kinks) in 1e4 precision\\n /// @param rateData_ rate data packed uint256 from storage for the token\\n /// @param utilization_ in 1e2 (100% = 1e4)\\n /// @return rate_ rate in 1e4 precision\\n function calcRateV2(uint256 rateData_, uint256 utilization_) internal pure returns (uint256 rate_) {\\n /// For rate v2 (two kinks) -----------------------------------------------------\\n /// Next 16 bits => 4 - 19 => Rate at utilization 0% (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 20- 35 => Utilization at kink1 (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 36- 51 => Rate at utilization kink1 (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 52- 67 => Utilization at kink2 (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 68- 83 => Rate at utilization kink2 (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Next 16 bits => 84- 99 => Rate at utilization 100% (in 1e2: 100% = 10_000; 1% = 100 -> max value 65535)\\n /// Last 156 bits => 100-255 => blank, might come in use in future\\n\\n // y = mx + c.\\n // y is borrow rate\\n // x is utilization\\n // m = slope (m can be 0 but never negative)\\n // c is constant (c can be negative)\\n\\n uint256 y1_;\\n uint256 y2_;\\n uint256 x1_;\\n uint256 x2_;\\n\\n // extract kink1: 16 bits (0xFFFF) starting from bit 20\\n // kink is in 1e2, same as utilization, so no conversion needed for direct comparison of the two\\n uint256 kink1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_UTILIZATION_AT_KINK1) & X16;\\n if (utilization_ < kink1_) {\\n // if utilization is less than kink1\\n y1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_ZERO) & X16;\\n y2_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK1) & X16;\\n x1_ = 0; // 0%\\n x2_ = kink1_;\\n } else {\\n // extract kink2: 16 bits (0xFFFF) starting from bit 52\\n uint256 kink2_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_UTILIZATION_AT_KINK2) & X16;\\n if (utilization_ < kink2_) {\\n // if utilization is less than kink2\\n y1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK1) & X16;\\n y2_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK2) & X16;\\n x1_ = kink1_;\\n x2_ = kink2_;\\n } else {\\n // else utilization is greater than kink2\\n y1_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK2) & X16;\\n y2_ = (rateData_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_MAX) & X16;\\n x1_ = kink2_;\\n x2_ = FOUR_DECIMALS;\\n }\\n }\\n\\n int256 constant_;\\n uint256 slope_;\\n unchecked {\\n // calculating slope with twelve decimal precision. m = (y2 - y1) / (x2 - x1).\\n // utilization of x2 can not be <= utilization of x1 (so no underflow or 0 divisor) and rate at y2 can not be < rate at y1\\n // y is in 1e2 so can not overflow when multiplied with TWELVE_DECIMALS\\n slope_ = ((y2_ - y1_) * TWELVE_DECIMALS) / (x2_ - x1_);\\n\\n // calculating constant at 12 decimal precision. slope is already in 12 decimal hence only multiple with y1. c = y - mx.\\n // maximum y1_ value is 65535. 65535 * 1e12 can not overflow int256\\n // maximum slope is 65535 - 0 * TWELVE_DECIMALS / 1 = 65535 * 1e12;\\n // maximum x1_ is 100% (9_999 actually) => slope_ * x1_ can not overflow int256\\n // subtraction most extreme case would be 0 - max value slope_ * x1_ => can not underflow int256\\n constant_ = int256(y1_ * TWELVE_DECIMALS) - int256(slope_ * x1_);\\n\\n // calculating new borrow rate\\n // - slope_ max value is 65535 * 1e12,\\n // - utilization max value is let's say 500% (extreme case where borrow rate increases borrow amount without new supply)\\n // - constant max value is 65535 * 1e12\\n // so max values are 65535 * 1e12 * 50_000 + 65535 * 1e12 -> 3.2768*10^21, which easily fits int256\\n // divisor TWELVE_DECIMALS can not be 0\\n rate_ = (uint256(int256(slope_ * utilization_) + constant_)) / TWELVE_DECIMALS;\\n }\\n }\\n\\n /// @dev reads the total supply out of Liquidity packed storage `totalAmounts_` for `supplyExchangePrice_`\\n function getTotalSupply(\\n uint256 totalAmounts_,\\n uint256 supplyExchangePrice_\\n ) internal pure returns (uint256 totalSupply_) {\\n // totalSupply_ => supplyInterestFree\\n totalSupply_ = (totalAmounts_ >> LiquiditySlotsLink.BITS_TOTAL_AMOUNTS_SUPPLY_INTEREST_FREE) & X64;\\n totalSupply_ = (totalSupply_ >> DEFAULT_EXPONENT_SIZE) << (totalSupply_ & DEFAULT_EXPONENT_MASK);\\n\\n uint256 totalSupplyRaw_ = totalAmounts_ & X64; // no shifting as supplyRaw is first 64 bits\\n totalSupplyRaw_ = (totalSupplyRaw_ >> DEFAULT_EXPONENT_SIZE) << (totalSupplyRaw_ & DEFAULT_EXPONENT_MASK);\\n\\n // totalSupply = supplyInterestFree + supplyRawInterest normalized from raw\\n totalSupply_ += ((totalSupplyRaw_ * supplyExchangePrice_) / EXCHANGE_PRICES_PRECISION);\\n }\\n\\n /// @dev reads the total borrow out of Liquidity packed storage `totalAmounts_` for `borrowExchangePrice_`\\n function getTotalBorrow(\\n uint256 totalAmounts_,\\n uint256 borrowExchangePrice_\\n ) internal pure returns (uint256 totalBorrow_) {\\n // totalBorrow_ => borrowInterestFree\\n // no & mask needed for borrow interest free as it occupies the last bits in the storage slot\\n totalBorrow_ = (totalAmounts_ >> LiquiditySlotsLink.BITS_TOTAL_AMOUNTS_BORROW_INTEREST_FREE);\\n totalBorrow_ = (totalBorrow_ >> DEFAULT_EXPONENT_SIZE) << (totalBorrow_ & DEFAULT_EXPONENT_MASK);\\n\\n uint256 totalBorrowRaw_ = (totalAmounts_ >> LiquiditySlotsLink.BITS_TOTAL_AMOUNTS_BORROW_WITH_INTEREST) & X64;\\n totalBorrowRaw_ = (totalBorrowRaw_ >> DEFAULT_EXPONENT_SIZE) << (totalBorrowRaw_ & DEFAULT_EXPONENT_MASK);\\n\\n // totalBorrow = borrowInterestFree + borrowRawInterest normalized from raw\\n totalBorrow_ += ((totalBorrowRaw_ * borrowExchangePrice_) / EXCHANGE_PRICES_PRECISION);\\n }\\n}\\n\",\"keccak256\":\"0x1abba442b74ee50d039a5491aae9e7a156a62f783363ce545e44ee82cc699f27\",\"license\":\"BUSL-1.1\"},\"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/periphery/resolvers/liquidity/iLiquidityResolver.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.21;\\n\\nimport { Structs as LiquidityStructs } from \\\"../../../periphery/resolvers/liquidity/structs.sol\\\";\\n\\ninterface IFluidLiquidityResolver {\\n /// @notice gets the `revenueAmount_` for a `token_`.\\n function getRevenue(address token_) external view returns (uint256 revenueAmount_);\\n\\n /// @notice address of contract that gets sent the revenue. Configurable by governance\\n function getRevenueCollector() external view returns (address);\\n\\n /// @notice Liquidity contract paused status: status = 1 -> normal. status = 2 -> paused.\\n function getStatus() external view returns (uint256);\\n\\n /// @notice checks if `auth_` is an allowed auth on Liquidity.\\n /// Auths can set most config values. E.g. contracts that automate certain flows like e.g. adding a new fToken.\\n /// Governance can add/remove auths. Governance is auth by default.\\n function isAuth(address auth_) external view returns (uint256);\\n\\n /// @notice checks if `guardian_` is an allowed Guardian on Liquidity.\\n /// Guardians can pause lower class users.\\n /// Governance can add/remove guardians. Governance is guardian by default.\\n function isGuardian(address guardian_) external view returns (uint256);\\n\\n /// @notice gets user class for `user_`. Class defines which protocols can be paused by guardians.\\n /// Currently there are 2 classes: 0 can be paused by guardians. 1 cannot be paused by guardians.\\n /// New protocols are added as class 0 and will be upgraded to 1 over time.\\n function getUserClass(address user_) external view returns (uint256);\\n\\n /// @notice gets exchangePricesAndConfig packed uint256 storage slot for `token_`.\\n function getExchangePricesAndConfig(address token_) external view returns (uint256);\\n\\n /// @notice gets rateConfig packed uint256 storage slot for `token_`.\\n function getRateConfig(address token_) external view returns (uint256);\\n\\n /// @notice gets totalAmounts packed uint256 storage slot for `token_`.\\n function getTotalAmounts(address token_) external view returns (uint256);\\n\\n /// @notice gets userSupply data packed uint256 storage slot for `user_` and `token_`.\\n function getUserSupply(address user_, address token_) external view returns (uint256);\\n\\n /// @notice gets userBorrow data packed uint256 storage slot for `user_` and `token_`.\\n function getUserBorrow(address user_, address token_) external view returns (uint256);\\n\\n /// @notice returns all `listedTokens_` at the Liquidity contract. Once configured, a token can never be removed.\\n function listedTokens() external view returns (address[] memory listedTokens_);\\n\\n /// @notice get the Rate config data `rateData_` for a `token_` compiled from the packed uint256 rateConfig storage slot\\n function getTokenRateData(address token_) external view returns (LiquidityStructs.RateData memory rateData_);\\n\\n /// @notice get the Rate config datas `rateDatas_` for multiple `tokens_` compiled from the packed uint256 rateConfig storage slot\\n function getTokensRateData(\\n address[] calldata tokens_\\n ) external view returns (LiquidityStructs.RateData[] memory rateDatas_);\\n\\n /// @notice returns general data for `token_` such as rates, exchange prices, utilization, fee, total amounts etc.\\n function getOverallTokenData(\\n address token_\\n ) external view returns (LiquidityStructs.OverallTokenData memory overallTokenData_);\\n\\n /// @notice returns general data for multiple `tokens_` such as rates, exchange prices, utilization, fee, total amounts etc.\\n function getOverallTokensData(\\n address[] calldata tokens_\\n ) external view returns (LiquidityStructs.OverallTokenData[] memory overallTokensData_);\\n\\n /// @notice returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for `token_`\\n function getUserSupplyData(\\n address user_,\\n address token_\\n )\\n external\\n view\\n returns (\\n LiquidityStructs.UserSupplyData memory userSupplyData_,\\n LiquidityStructs.OverallTokenData memory overallTokenData_\\n );\\n\\n /// @notice returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `tokens_`\\n function getUserMultipleSupplyData(\\n address user_,\\n address[] calldata tokens_\\n )\\n external\\n view\\n returns (\\n LiquidityStructs.UserSupplyData[] memory userSuppliesData_,\\n LiquidityStructs.OverallTokenData[] memory overallTokensData_\\n );\\n\\n /// @notice returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for `token_`\\n function getUserBorrowData(\\n address user_,\\n address token_\\n )\\n external\\n view\\n returns (\\n LiquidityStructs.UserBorrowData memory userBorrowData_,\\n LiquidityStructs.OverallTokenData memory overallTokenData_\\n );\\n\\n /// @notice returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `tokens_`\\n function getUserMultipleBorrowData(\\n address user_,\\n address[] calldata tokens_\\n )\\n external\\n view\\n returns (\\n LiquidityStructs.UserBorrowData[] memory userBorrowingsData_,\\n LiquidityStructs.OverallTokenData[] memory overallTokensData_\\n );\\n\\n /// @notice returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `supplyTokens_`\\n /// and returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `borrowTokens_`\\n function getUserMultipleBorrowSupplyData(\\n address user_,\\n address[] calldata supplyTokens_,\\n address[] calldata borrowTokens_\\n )\\n external\\n view\\n returns (\\n LiquidityStructs.UserSupplyData[] memory userSuppliesData_,\\n LiquidityStructs.OverallTokenData[] memory overallSupplyTokensData_,\\n LiquidityStructs.UserBorrowData[] memory userBorrowingsData_,\\n LiquidityStructs.OverallTokenData[] memory overallBorrowTokensData_\\n );\\n}\\n\",\"keccak256\":\"0xb446bc409296f5e761f9d2038ce93511c13745683191caa1d9781d58e68ba3eb\",\"license\":\"MIT\"},\"contracts/periphery/resolvers/liquidity/main.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { IERC20 } from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\nimport { LiquidityCalcs } from \\\"../../../libraries/liquidityCalcs.sol\\\";\\nimport { BigMathMinified } from \\\"../../../libraries/bigMathMinified.sol\\\";\\nimport { LiquiditySlotsLink } from \\\"../../../libraries/liquiditySlotsLink.sol\\\";\\nimport { IFluidLiquidity } from \\\"../../../liquidity/interfaces/iLiquidity.sol\\\";\\nimport { IFluidLiquidityResolver } from \\\"./iLiquidityResolver.sol\\\";\\nimport { Structs } from \\\"./structs.sol\\\";\\nimport { Variables } from \\\"./variables.sol\\\";\\n\\ninterface TokenInterface {\\n function balanceOf(address) external view returns (uint);\\n}\\n\\n/// @notice Fluid Liquidity resolver\\n/// Implements various view-only methods to give easy access to Liquidity data.\\ncontract FluidLiquidityResolver is IFluidLiquidityResolver, Variables, Structs {\\n /// @dev address that is mapped to the chain native token\\n address internal constant _NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\\n\\n /// @notice thrown if an input param address is zero\\n error FluidLiquidityResolver__AddressZero();\\n\\n constructor(IFluidLiquidity liquidity_) Variables(liquidity_) {\\n if (address(liquidity_) == address(0)) {\\n revert FluidLiquidityResolver__AddressZero();\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getRevenueCollector() public view returns (address) {\\n return address(uint160(LIQUIDITY.readFromStorage(bytes32(0))));\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getRevenue(address token_) public view returns (uint256 revenueAmount_) {\\n uint256 liquidityTokenBalance_ = token_ == _NATIVE_TOKEN_ADDRESS\\n ? address(LIQUIDITY).balance\\n : IERC20(token_).balanceOf(address(LIQUIDITY));\\n\\n return\\n LiquidityCalcs.calcRevenue(\\n getTotalAmounts(token_),\\n getExchangePricesAndConfig(token_),\\n liquidityTokenBalance_\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getStatus() public view returns (uint256) {\\n return LIQUIDITY.readFromStorage(bytes32(LiquiditySlotsLink.LIQUIDITY_STATUS_SLOT));\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function isAuth(address auth_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(LiquiditySlotsLink.LIQUIDITY_AUTHS_MAPPING_SLOT, auth_)\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function isGuardian(address guardian_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_GUARDIANS_MAPPING_SLOT,\\n guardian_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserClass(address user_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_USER_CLASS_MAPPING_SLOT,\\n user_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getExchangePricesAndConfig(address token_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_EXCHANGE_PRICES_MAPPING_SLOT,\\n token_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getRateConfig(address token_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_RATE_DATA_MAPPING_SLOT,\\n token_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getTotalAmounts(address token_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_TOTAL_AMOUNTS_MAPPING_SLOT,\\n token_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserSupply(address user_, address token_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateDoubleMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_USER_SUPPLY_DOUBLE_MAPPING_SLOT,\\n user_,\\n token_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserBorrow(address user_, address token_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateDoubleMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_USER_BORROW_DOUBLE_MAPPING_SLOT,\\n user_,\\n token_\\n )\\n );\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function listedTokens() public view returns (address[] memory listedTokens_) {\\n uint256 length_ = LIQUIDITY.readFromStorage(bytes32(LiquiditySlotsLink.LIQUIDITY_LISTED_TOKENS_ARRAY_SLOT));\\n\\n listedTokens_ = new address[](length_);\\n\\n uint256 startingSlotForArrayElements_ = uint256(\\n keccak256(abi.encode(LiquiditySlotsLink.LIQUIDITY_LISTED_TOKENS_ARRAY_SLOT))\\n );\\n\\n for (uint256 i; i < length_; i++) {\\n listedTokens_[i] = address(uint160(LIQUIDITY.readFromStorage(bytes32(startingSlotForArrayElements_ + i))));\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getTokenRateData(address token_) public view returns (RateData memory rateData_) {\\n uint256 rateConfig_ = getRateConfig(token_);\\n\\n rateData_.version = rateConfig_ & 0xF;\\n\\n if (rateData_.version == 1) {\\n rateData_.rateDataV1.rateAtUtilizationZero =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_ZERO) &\\n X16;\\n rateData_.rateDataV1.kink = (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_UTILIZATION_AT_KINK) & X16;\\n rateData_.rateDataV1.rateAtUtilizationKink =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_KINK) &\\n X16;\\n rateData_.rateDataV1.rateAtUtilizationMax =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V1_RATE_AT_UTILIZATION_MAX) &\\n X16;\\n } else if (rateData_.version == 2) {\\n rateData_.rateDataV2.rateAtUtilizationZero =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_ZERO) &\\n X16;\\n rateData_.rateDataV2.kink1 =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_UTILIZATION_AT_KINK1) &\\n X16;\\n rateData_.rateDataV2.rateAtUtilizationKink1 =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK1) &\\n X16;\\n rateData_.rateDataV2.kink2 =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_UTILIZATION_AT_KINK2) &\\n X16;\\n rateData_.rateDataV2.rateAtUtilizationKink2 =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_KINK2) &\\n X16;\\n rateData_.rateDataV2.rateAtUtilizationMax =\\n (rateConfig_ >> LiquiditySlotsLink.BITS_RATE_DATA_V2_RATE_AT_UTILIZATION_MAX) &\\n X16;\\n } else {\\n revert(\\\"not-valid-rate-version\\\");\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getTokensRateData(address[] calldata tokens_) public view returns (RateData[] memory rateDatas_) {\\n uint256 length_ = tokens_.length;\\n rateDatas_ = new RateData[](length_);\\n\\n for (uint256 i; i < length_; i++) {\\n rateDatas_[i] = getTokenRateData(tokens_[i]);\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getOverallTokenData(\\n address token_\\n ) public view returns (Structs.OverallTokenData memory overallTokenData_) {\\n uint256 exchangePriceAndConfig_ = getExchangePricesAndConfig(token_);\\n uint256 totalAmounts_ = getTotalAmounts(token_);\\n\\n (overallTokenData_.supplyExchangePrice, overallTokenData_.borrowExchangePrice) = LiquidityCalcs\\n .calcExchangePrices(exchangePriceAndConfig_);\\n\\n overallTokenData_.borrowRate = exchangePriceAndConfig_ & X16;\\n overallTokenData_.fee = (exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_FEE) & X14;\\n overallTokenData_.lastStoredUtilization =\\n (exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_UTILIZATION) &\\n X14;\\n overallTokenData_.storageUpdateThreshold =\\n (exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_UPDATE_THRESHOLD) &\\n X14;\\n overallTokenData_.lastUpdateTimestamp =\\n (exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_LAST_TIMESTAMP) &\\n X33;\\n\\n // Extract supply & borrow amounts\\n uint256 temp_ = totalAmounts_ & X64;\\n overallTokenData_.supplyRawInterest = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n temp_ = (totalAmounts_ >> LiquiditySlotsLink.BITS_TOTAL_AMOUNTS_SUPPLY_INTEREST_FREE) & X64;\\n overallTokenData_.supplyInterestFree = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n temp_ = (totalAmounts_ >> LiquiditySlotsLink.BITS_TOTAL_AMOUNTS_BORROW_WITH_INTEREST) & X64;\\n overallTokenData_.borrowRawInterest = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n // no & mask needed for borrow interest free as it occupies the last bits in the storage slot\\n temp_ = (totalAmounts_ >> LiquiditySlotsLink.BITS_TOTAL_AMOUNTS_BORROW_INTEREST_FREE);\\n overallTokenData_.borrowInterestFree = (temp_ >> DEFAULT_EXPONENT_SIZE) << (temp_ & DEFAULT_EXPONENT_MASK);\\n\\n uint256 supplyWithInterest_;\\n uint256 borrowWithInterest_;\\n if (overallTokenData_.supplyRawInterest > 0) {\\n // use old exchange prices for supply rate to be at same level as borrow rate from storage.\\n // Note the rate here can be a tiny bit with higher precision because we use borrowWithInterest_ / supplyWithInterest_\\n // which has higher precision than the utilization used from storage in LiquidityCalcs\\n supplyWithInterest_ =\\n (overallTokenData_.supplyRawInterest *\\n ((exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_SUPPLY_EXCHANGE_PRICE) &\\n X64)) /\\n EXCHANGE_PRICES_PRECISION; // normalized from raw\\n borrowWithInterest_ =\\n (overallTokenData_.borrowRawInterest *\\n ((exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_BORROW_EXCHANGE_PRICE) &\\n X64)) /\\n EXCHANGE_PRICES_PRECISION; // normalized from raw\\n\\n overallTokenData_.supplyRate =\\n (overallTokenData_.borrowRate * (FOUR_DECIMALS - overallTokenData_.fee) * borrowWithInterest_) /\\n (supplyWithInterest_ * FOUR_DECIMALS);\\n }\\n\\n supplyWithInterest_ =\\n (overallTokenData_.supplyRawInterest * overallTokenData_.supplyExchangePrice) /\\n EXCHANGE_PRICES_PRECISION; // normalized from raw\\n overallTokenData_.totalSupply = supplyWithInterest_ + overallTokenData_.supplyInterestFree;\\n borrowWithInterest_ =\\n (overallTokenData_.borrowRawInterest * overallTokenData_.borrowExchangePrice) /\\n EXCHANGE_PRICES_PRECISION; // normalized from raw\\n overallTokenData_.totalBorrow = borrowWithInterest_ + overallTokenData_.borrowInterestFree;\\n\\n overallTokenData_.revenue = getRevenue(token_);\\n overallTokenData_.rateData = getTokenRateData(token_);\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getOverallTokensData(\\n address[] calldata tokens_\\n ) public view returns (Structs.OverallTokenData[] memory overallTokensData_) {\\n uint256 length_ = tokens_.length;\\n overallTokensData_ = new Structs.OverallTokenData[](length_);\\n for (uint256 i; i < length_; i++) {\\n overallTokensData_[i] = getOverallTokenData(tokens_[i]);\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserSupplyData(\\n address user_,\\n address token_\\n )\\n public\\n view\\n returns (Structs.UserSupplyData memory userSupplyData_, Structs.OverallTokenData memory overallTokenData_)\\n {\\n overallTokenData_ = getOverallTokenData(token_);\\n uint256 userSupply_ = getUserSupply(user_, token_);\\n\\n userSupplyData_.modeWithInterest = userSupply_ & 1 == 1;\\n userSupplyData_.supply = BigMathMinified.fromBigNumber(\\n (userSupply_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_AMOUNT) & X64,\\n DEFAULT_EXPONENT_SIZE,\\n DEFAULT_EXPONENT_MASK\\n );\\n\\n // get updated expanded withdrawal limit\\n userSupplyData_.withdrawalLimit = LiquidityCalcs.calcWithdrawalLimitBeforeOperate(\\n userSupply_,\\n userSupplyData_.supply\\n );\\n\\n userSupplyData_.lastUpdateTimestamp =\\n (userSupply_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_LAST_UPDATE_TIMESTAMP) &\\n X33;\\n userSupplyData_.expandPercent = (userSupply_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_EXPAND_PERCENT) & X14;\\n userSupplyData_.expandDuration = (userSupply_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_EXPAND_DURATION) & X24;\\n userSupplyData_.baseWithdrawalLimit = BigMathMinified.fromBigNumber(\\n (userSupply_ >> LiquiditySlotsLink.BITS_USER_SUPPLY_BASE_WITHDRAWAL_LIMIT) & X18,\\n DEFAULT_EXPONENT_SIZE,\\n DEFAULT_EXPONENT_MASK\\n );\\n\\n if (userSupplyData_.modeWithInterest) {\\n // convert raw amounts to normal for withInterest mode\\n userSupplyData_.supply =\\n (userSupplyData_.supply * overallTokenData_.supplyExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n userSupplyData_.withdrawalLimit =\\n (userSupplyData_.withdrawalLimit * overallTokenData_.supplyExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n userSupplyData_.baseWithdrawalLimit =\\n (userSupplyData_.baseWithdrawalLimit * overallTokenData_.supplyExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n }\\n\\n userSupplyData_.withdrawableUntilLimit = userSupplyData_.supply > userSupplyData_.withdrawalLimit\\n ? userSupplyData_.supply - userSupplyData_.withdrawalLimit\\n : 0;\\n uint balanceOf_ = token_ == _NATIVE_TOKEN_ADDRESS\\n ? address(LIQUIDITY).balance\\n : TokenInterface(token_).balanceOf(address(LIQUIDITY));\\n\\n userSupplyData_.withdrawable = balanceOf_ > userSupplyData_.withdrawableUntilLimit\\n ? userSupplyData_.withdrawableUntilLimit\\n : balanceOf_;\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserMultipleSupplyData(\\n address user_,\\n address[] calldata tokens_\\n )\\n public\\n view\\n returns (\\n Structs.UserSupplyData[] memory userSuppliesData_,\\n Structs.OverallTokenData[] memory overallTokensData_\\n )\\n {\\n uint256 length_ = tokens_.length;\\n userSuppliesData_ = new Structs.UserSupplyData[](length_);\\n overallTokensData_ = new Structs.OverallTokenData[](length_);\\n\\n for (uint256 i; i < length_; i++) {\\n (userSuppliesData_[i], overallTokensData_[i]) = getUserSupplyData(user_, tokens_[i]);\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserBorrowData(\\n address user_,\\n address token_\\n )\\n public\\n view\\n returns (Structs.UserBorrowData memory userBorrowData_, Structs.OverallTokenData memory overallTokenData_)\\n {\\n overallTokenData_ = getOverallTokenData(token_);\\n uint256 userBorrow_ = getUserBorrow(user_, token_);\\n\\n userBorrowData_.modeWithInterest = userBorrow_ & 1 == 1;\\n\\n userBorrowData_.borrow = BigMathMinified.fromBigNumber(\\n (userBorrow_ >> LiquiditySlotsLink.BITS_USER_BORROW_AMOUNT) & X64,\\n DEFAULT_EXPONENT_SIZE,\\n DEFAULT_EXPONENT_MASK\\n );\\n\\n // get updated expanded borrow limit\\n userBorrowData_.borrowLimit = LiquidityCalcs.calcBorrowLimitBeforeOperate(userBorrow_, userBorrowData_.borrow);\\n\\n userBorrowData_.lastUpdateTimestamp =\\n (userBorrow_ >> LiquiditySlotsLink.BITS_USER_BORROW_LAST_UPDATE_TIMESTAMP) &\\n X33;\\n userBorrowData_.expandPercent = (userBorrow_ >> LiquiditySlotsLink.BITS_USER_BORROW_EXPAND_PERCENT) & X14;\\n userBorrowData_.expandDuration = (userBorrow_ >> LiquiditySlotsLink.BITS_USER_BORROW_EXPAND_DURATION) & X24;\\n userBorrowData_.baseBorrowLimit = BigMathMinified.fromBigNumber(\\n (userBorrow_ >> LiquiditySlotsLink.BITS_USER_BORROW_BASE_BORROW_LIMIT) & X18,\\n DEFAULT_EXPONENT_SIZE,\\n DEFAULT_EXPONENT_MASK\\n );\\n userBorrowData_.maxBorrowLimit = BigMathMinified.fromBigNumber(\\n (userBorrow_ >> LiquiditySlotsLink.BITS_USER_BORROW_MAX_BORROW_LIMIT) & X18,\\n DEFAULT_EXPONENT_SIZE,\\n DEFAULT_EXPONENT_MASK\\n );\\n\\n if (userBorrowData_.modeWithInterest) {\\n // convert raw amounts to normal for withInterest mode\\n userBorrowData_.borrow =\\n (userBorrowData_.borrow * overallTokenData_.borrowExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n userBorrowData_.borrowLimit =\\n (userBorrowData_.borrowLimit * overallTokenData_.borrowExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n userBorrowData_.baseBorrowLimit =\\n (userBorrowData_.baseBorrowLimit * overallTokenData_.borrowExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n userBorrowData_.maxBorrowLimit =\\n (userBorrowData_.maxBorrowLimit * overallTokenData_.borrowExchangePrice) /\\n EXCHANGE_PRICES_PRECISION;\\n }\\n\\n userBorrowData_.borrowableUntilLimit = userBorrowData_.borrowLimit > userBorrowData_.borrow\\n ? userBorrowData_.borrowLimit - userBorrowData_.borrow\\n : 0;\\n uint balanceOf_ = token_ == _NATIVE_TOKEN_ADDRESS\\n ? address(LIQUIDITY).balance\\n : TokenInterface(token_).balanceOf(address(LIQUIDITY));\\n\\n userBorrowData_.borrowable = balanceOf_ > userBorrowData_.borrowableUntilLimit\\n ? userBorrowData_.borrowableUntilLimit\\n : balanceOf_;\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserMultipleBorrowData(\\n address user_,\\n address[] calldata tokens_\\n )\\n public\\n view\\n returns (\\n Structs.UserBorrowData[] memory userBorrowingsData_,\\n Structs.OverallTokenData[] memory overallTokensData_\\n )\\n {\\n uint256 length_ = tokens_.length;\\n userBorrowingsData_ = new UserBorrowData[](length_);\\n\\n for (uint256 i; i < length_; i++) {\\n (userBorrowingsData_[i], overallTokensData_[i]) = getUserBorrowData(user_, tokens_[i]);\\n }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getUserMultipleBorrowSupplyData(\\n address user_,\\n address[] calldata supplyTokens_,\\n address[] calldata borrowTokens_\\n )\\n public\\n view\\n returns (\\n Structs.UserSupplyData[] memory userSuppliesData_,\\n Structs.OverallTokenData[] memory overallSupplyTokensData_,\\n Structs.UserBorrowData[] memory userBorrowingsData_,\\n Structs.OverallTokenData[] memory overallBorrowTokensData_\\n )\\n {\\n uint256 length_ = supplyTokens_.length;\\n userSuppliesData_ = new Structs.UserSupplyData[](length_);\\n overallSupplyTokensData_ = new Structs.OverallTokenData[](length_);\\n for (uint256 i; i < length_; i++) {\\n (userSuppliesData_[i], overallSupplyTokensData_[i]) = getUserSupplyData(user_, supplyTokens_[i]);\\n }\\n\\n length_ = borrowTokens_.length;\\n userBorrowingsData_ = new UserBorrowData[](length_);\\n overallBorrowTokensData_ = new Structs.OverallTokenData[](length_);\\n for (uint256 i; i < length_; i++) {\\n (userBorrowingsData_[i], overallBorrowTokensData_[i]) = getUserBorrowData(user_, borrowTokens_[i]);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x759e06ad836d46439ca6047637b593c5b0d026dbfd049ebeaf3931d32c967f84\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/liquidity/structs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { Structs as AdminModuleStructs } from \\\"../../../liquidity/adminModule/structs.sol\\\";\\n\\nabstract contract Structs {\\n struct RateData {\\n uint256 version;\\n AdminModuleStructs.RateDataV1Params rateDataV1;\\n AdminModuleStructs.RateDataV2Params rateDataV2;\\n }\\n\\n struct OverallTokenData {\\n uint256 borrowRate;\\n uint256 supplyRate;\\n uint256 fee; // revenue fee\\n uint256 lastStoredUtilization;\\n uint256 storageUpdateThreshold;\\n uint256 lastUpdateTimestamp;\\n uint256 supplyExchangePrice;\\n uint256 borrowExchangePrice;\\n uint256 supplyRawInterest;\\n uint256 supplyInterestFree;\\n uint256 borrowRawInterest;\\n uint256 borrowInterestFree;\\n uint256 totalSupply;\\n uint256 totalBorrow;\\n uint256 revenue;\\n RateData rateData;\\n }\\n\\n // amounts are always in normal (for withInterest already multiplied with exchange price)\\n struct UserSupplyData {\\n bool modeWithInterest; // true if mode = with interest, false = without interest\\n uint256 supply; // user supply amount\\n // the withdrawal limit (e.g. if 10% is the limit, and 100M is supplied, it would be 90M)\\n uint256 withdrawalLimit;\\n uint256 lastUpdateTimestamp;\\n uint256 expandPercent; // withdrawal limit expand percent in 1e2\\n uint256 expandDuration; // withdrawal limit expand duration in seconds\\n uint256 baseWithdrawalLimit;\\n // the current actual max withdrawable amount (e.g. if 10% is the limit, and 100M is supplied, it would be 10M)\\n uint256 withdrawableUntilLimit;\\n uint256 withdrawable; // actual currently withdrawable amount (supply - withdrawal Limit) & considering balance\\n }\\n\\n // amounts are always in normal (for withInterest already multiplied with exchange price)\\n struct UserBorrowData {\\n bool modeWithInterest; // true if mode = with interest, false = without interest\\n uint256 borrow; // user borrow amount\\n uint256 borrowLimit;\\n uint256 lastUpdateTimestamp;\\n uint256 expandPercent;\\n uint256 expandDuration;\\n uint256 baseBorrowLimit;\\n uint256 maxBorrowLimit;\\n uint256 borrowableUntilLimit;\\n uint256 borrowable; // actual currently borrowable amount (borrow limit - already borrowed) & considering balance\\n }\\n}\\n\",\"keccak256\":\"0x4a935db0fd6fee3a9a9456b0655953ee03158a975ef77faa5d390e4066f1ee89\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/liquidity/variables.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { IFluidLiquidity } from \\\"../../../liquidity/interfaces/iLiquidity.sol\\\";\\n\\ncontract Variables {\\n /// @dev Storage slot with the admin of the contract. Logic from \\\"proxy.sol\\\".\\n /// This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n /// validated in the constructor.\\n bytes32 internal constant GOVERNANCE_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n uint256 internal constant EXCHANGE_PRICES_PRECISION = 1e12;\\n\\n /// @dev Ignoring leap years\\n uint256 internal constant SECONDS_PER_YEAR = 365 days;\\n // constants used for BigMath conversion from and to storage\\n uint256 internal constant SMALL_COEFFICIENT_SIZE = 10;\\n uint256 internal constant DEFAULT_COEFFICIENT_SIZE = 56;\\n uint256 internal constant DEFAULT_EXPONENT_SIZE = 8;\\n uint256 internal constant DEFAULT_EXPONENT_MASK = 0xFF;\\n\\n uint256 internal constant FOUR_DECIMALS = 10000;\\n uint256 internal constant X8 = 0xff;\\n uint256 internal constant X14 = 0x3fff;\\n uint256 internal constant X16 = 0xffff;\\n uint256 internal constant X18 = 0x3ffff;\\n uint256 internal constant X24 = 0xffffff;\\n uint256 internal constant X33 = 0x1ffffffff;\\n uint256 internal constant X64 = 0xffffffffffffffff;\\n\\n /// @notice address of the liquidity contract\\n IFluidLiquidity public immutable LIQUIDITY;\\n\\n constructor(IFluidLiquidity liquidity_) {\\n LIQUIDITY = IFluidLiquidity(liquidity_);\\n }\\n}\\n\",\"keccak256\":\"0xb80836f87daac511bbd3380599920519fa934cc274350c0d69c190cf32ad674c\",\"license\":\"BUSL-1.1\"}},\"version\":1}",
"bytecode": "0x60a06040523480156200001157600080fd5b506040516200325038038062003250833981016040819052620000349162000068565b6001600160a01b03811660808190526200006157604051630dd6e9eb60e41b815260040160405180910390fd5b506200009a565b6000602082840312156200007b57600080fd5b81516001600160a01b03811681146200009357600080fd5b9392505050565b60805161311c620001346000396000818161021901528181610425015281816107ce0152818161084201528181610af301528181610c1601528181610cd101528181610deb01528181610f1301528181610f9f01528181611013015281816110b00152818161112a015281816113e601528181611460015281816119fc01528181611c9c01528181611d160152611de6015261311c6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c80634e69d560116100d8578063b3fc48bc1161008c578063cdb5964411610066578063cdb5964414610396578063e72ef91b146103a9578063ee9e836d146103ca57600080fd5b8063b3fc48bc14610332578063b505b75014610355578063cd4a7e141461037657600080fd5b80636e938406116100bd5780636e938406146102eb57806385b67095146102fe578063967915d61461031157600080fd5b80634e69d560146102d057806360fed05f146102d857600080fd5b80632861c7d11161013a5780632b66fc05116101145780632b66fc051461029357806334a2e659146102b35780634a3d6bda146102bb57600080fd5b80632861c7d11461021457806329e04fbf146102605780632b0018331461028057600080fd5b80631dacf0371161016b5780631dacf037146101ce5780631f735227146101ee5780632520e7ff1461020157600080fd5b80630c68ba211461018757806314c0ac36146101ad575b600080fd5b61019a6101953660046123c1565b6103dd565b6040519081526020015b60405180910390f35b6101c06101bb366004612428565b6104b2565b6040516101a492919061268b565b6101e16101dc3660046123c1565b610636565b6040516101a491906126b9565b61019a6101fc3660046123c1565b610786565b61019a61020f3660046123c1565b6107fa565b61023b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a4565b61027361026e3660046123c1565b61086e565b6040516101a49190612769565b61019a61028e3660046123c1565b610aab565b6102a66102a13660046128ad565b610b1f565b6040516101a491906128ef565b61023b610be4565b6102c3610c9c565b6040516101a491906129df565b61019a610ee1565b61019a6102e63660046123c1565b610f57565b61019a6102f93660046123c1565b610fcb565b61019a61030c3660046123c1565b61103f565b61032461031f366004612a2d565b611185565b6040516101a4929190612a60565b610345610340366004612c18565b6114c3565b6040516101a49493929190612d37565b610368610363366004612428565b6117b9565b6040516101a4929190612d8f565b6103896103843660046128ad565b6118d0565b6040516101a49190612da2565b61019a6103a4366004612a2d565b61198d565b6103bc6103b7366004612a2d565b611a83565b6040516101a4929190612db5565b61019a6103d8366004612a2d565b611d77565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526003838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b815260040161046b91815260200190565b602060405180830381865afa158015610488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ac9190612f61565b92915050565b606080828067ffffffffffffffff8111156104cf576104cf612f7a565b60405190808252806020026020018201604052801561055157816020015b61053e60405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816104ed5790505b5092508067ffffffffffffffff81111561056d5761056d612f7a565b6040519080825280602002602001820160405280156105a657816020015b610593612261565b81526020019060019003908161058b5790505b50915060005b8181101561062c576105df878787848181106105ca576105ca612fa9565b90506020020160208101906103b791906123c1565b8583815181106105f1576105f1612fa9565b6020026020010185848151811061060a5761060a612fa9565b602002602001018290528290525050808061062490613007565b9150506105ac565b5050935093915050565b61063e6122e3565b600061064983610f57565b600f81168084529091506001036106a6576020828101805161ffff600485901c81166040909201919091528151601485901c82169301929092528051602484901c831660609091015251603483901c909116608090910152610780565b8151600203610719576040828101805161ffff600485901c81166060909201919091528151601485901c82166020909101528151602485901c82166080909101528151603485901c82169301929092528051604484901c831660a09091015251605483901c90911660c090910152610780565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f742d76616c69642d726174652d76657273696f6e0000000000000000000060448201526064015b60405180910390fd5b50919050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526004838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526002838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b610876612261565b600061088183610aab565b9050600061088e84610fcb565b905061089982611e12565b60e085015260c08085019190915261ffff83168452601083901c613fff908116604080870191909152601e85901c82166060870152602c85901c909116608080870191909152603a85901c6401ffffffff1660a087015266ffffffffffffff600885901c811660ff8087169190911b6101008901819052604887901c83169487901c82169490941b610120890152608886901c9091169185901c81169190911b61014087015260c884901c9284901c9081169290921b610160860152600090819015610a065764e8d4a5100067ffffffffffffffff605b87901c16876101000151610984919061303f565b61098e9190613085565b915064e8d4a5100067ffffffffffffffff609b87901c168761014001516109b5919061303f565b6109bf9190613085565b90506109cd6127108361303f565b8187604001516127106109e091906130c0565b88516109ec919061303f565b6109f6919061303f565b610a009190613085565b60208701525b64e8d4a510008660c00151876101000151610a21919061303f565b610a2b9190613085565b915085610120015182610a3e91906130d3565b61018087015260e086015161014087015164e8d4a5100091610a5f9161303f565b610a699190613085565b905085610160015181610a7c91906130d3565b6101a0870152610a8b8761103f565b6101c0870152610a9a87610636565b6101e0870152509395945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526005838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b6060818067ffffffffffffffff811115610b3b57610b3b612f7a565b604051908082528060200260200182016040528015610b7457816020015b610b616122e3565b815260200190600190039081610b595790505b50915060005b81811015610bdc57610bac858583818110610b9757610b97612fa9565b90506020020160208101906101dc91906123c1565b838281518110610bbe57610bbe612fa9565b60200260200101819052508080610bd490613007565b915050610b7a565b505092915050565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600060048201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e4906024015b602060405180830381865afa158015610c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c979190612f61565b905090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600a60048201526060906000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401602060405180830381865afa158015610d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d519190612f61565b90508067ffffffffffffffff811115610d6c57610d6c612f7a565b604051908082528060200260200182016040528015610d95578160200160208202803683370190505b5091506000600a604051602001610dae91815260200190565b6040516020818303038152906040528051906020012060001c905060005b82811015610edb5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663b5c736e4610e1a83856130d3565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810191909152602401602060405180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612f61565b848281518110610ea457610ea4612fa9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280610ed381613007565b915050610dcc565b50505090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600160048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401610c56565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526006838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526007838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b60008073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611128576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528416906370a0823190602401602060405180830381865afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111239190612f61565b611161565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b905061117e61116f84610fcb565b61117885610aab565b83612020565b9392505050565b6111dd6040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6111e5612261565b6111ee8361086e565b905060006111fc858561198d565b6001808216811485529091506112279082901c67ffffffffffffffff16600860ff9082901c91161b90565b60208401819052611239908290612089565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c08401526103ff60e282901c1660ff60da83901c161b60e08401528251156113465764e8d4a510008260e0015184602001516112bb919061303f565b6112c59190613085565b602084015260e0820151604084015164e8d4a51000916112e49161303f565b6112ee9190613085565b604084015260e082015160c084015164e8d4a510009161130d9161303f565b6113179190613085565b60c084015260e0808301519084015164e8d4a51000916113369161303f565b6113409190613085565b60e08401525b826020015183604001511161135c576000611370565b8260200151836040015161137091906130c0565b610100840152600073ffffffffffffffffffffffffffffffffffffffff851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461145e576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528616906370a0823190602401602060405180830381865afa158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190612f61565b611497565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b905083610100015181116114ab57806114b2565b8361010001515b610120850152509194909350915050565b6060808080868067ffffffffffffffff8111156114e2576114e2612f7a565b60405190808252806020026020018201604052801561156457816020015b61155160405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816115005790505b5094508067ffffffffffffffff81111561158057611580612f7a565b6040519080825280602002602001820160405280156115b957816020015b6115a6612261565b81526020019060019003908161159e5790505b50935060005b8181101561162a576115dd8b8b8b848181106105ca576105ca612fa9565b8783815181106115ef576115ef612fa9565b6020026020010187848151811061160857611608612fa9565b602002602001018290528290525050808061162290613007565b9150506115bf565b508590508067ffffffffffffffff81111561164757611647612f7a565b6040519080825280602002602001820160405280156116d057816020015b6116bd6040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816116655790505b5092508067ffffffffffffffff8111156116ec576116ec612f7a565b60405190808252806020026020018201604052801561172557816020015b611712612261565b81526020019060019003908161170a5790505b50915060005b818110156117ab5761175e8b89898481811061174957611749612fa9565b905060200201602081019061031f91906123c1565b85838151811061177057611770612fa9565b6020026020010185848151811061178957611789612fa9565b60200260200101829052829052505080806117a390613007565b91505061172b565b505095509550955095915050565b606080828067ffffffffffffffff8111156117d6576117d6612f7a565b60405190808252806020026020018201604052801561185f57816020015b61184c6040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816117f45790505b50925060005b8181101561062c576118838787878481811061174957611749612fa9565b85838151811061189557611895612fa9565b602002602001018584815181106118ae576118ae612fa9565b60200260200101829052829052505080806118c890613007565b915050611865565b6060818067ffffffffffffffff8111156118ec576118ec612f7a565b60405190808252806020026020018201604052801561192557816020015b611912612261565b81526020019060019003908161190a5790505b50915060005b81811015610bdc5761195d85858381811061194857611948612fa9565b905060200201602081019061026e91906123c1565b83828151811061196f5761196f612fa9565b6020026020010181905250808061198590613007565b91505061192b565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600983850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b8152600401611a4291815260200190565b602060405180830381865afa158015611a5f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117e9190612f61565b611ad460405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611adc612261565b611ae58361086e565b90506000611af38585611d77565b600180821681148552909150611b1e9082901c67ffffffffffffffff16600860ff9082901c91161b90565b60208401819052611b30908290612144565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c0840152825115611bfd5764e8d4a510008260c001518460200151611b9b919061303f565b611ba59190613085565b602084015260c0820151604084015164e8d4a5100091611bc49161303f565b611bce9190613085565b604084015260c0808301519084015164e8d4a5100091611bed9161303f565b611bf79190613085565b60c08401525b8260400151836020015111611c13576000611c27565b82604001518360200151611c2791906130c0565b60e0840152600073ffffffffffffffffffffffffffffffffffffffff851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611d14576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528616906370a0823190602401602060405180830381865afa158015611ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0f9190612f61565b611d4d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b90508360e001518111611d605780611d66565b8360e001515b610100850152509194909350915050565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600883850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e490611a24565b67ffffffffffffffff605b82901c811690609b83901c16811580611e34575080155b15611e70576040517fd50d7512000000000000000000000000000000000000000000000000000000008152620111716004820152602401610777565b61ffff8316603a84901c6401ffffffff16428181039160ea87901c617fff16911480611e9a575082155b80611ea55750806001145b15611eb257505050915091565b64496cebb80084840283020484019350617fff60db87901c16925082600103611edd57505050915091565b82600116600103611f325760019290921c91826c7e37be2022c0914b268000000081611f0b57611f0b613056565b049250612710601e87901c613fff166b033b2e3c9fd0803ce8000000850102049250611f5f565b60019290921c916305f5e100601e87901c613fff166127108501026b033b2e3c9fd0803ce8000000020492505b80600116600103611f965760011c61271081016b033b2e3c9fd0803ce8000000820281611f8e57611f8e613056565b049050611fcc565b60011c61271081016b033b2e3c9fd0803ce8000000820281611fba57611fba613056565b046b033b2e3c9fd0803ce80000000390505b760a70c3c40a64e6c51999090b65f67d92400000000000008382026127100261ffff881691900402601087901c613fff16612710030292506801b5a660ea44b8000085840283020485019450505050915091565b600080600061202e85611e12565b91509150600061203e87846121d4565b9050801561207b576120508783612227565b61205a90866130d3565b935080841161206a576000612074565b61207481856130c0565b935061207f565b8493505b5050509392505050565b60d082901c6103ff1660c883901c60ff161b613fff60a284901c1661271083820204808401838110156120be575050506104ac565b608186901c6401ffffffff164203925066ffffffffffffff604987901c1660ff604188901c161b60b087901c62ffffff166120f9858561303f565b6121039190613085565b61210d91906130d3565b93508084111561211b578093505b6103ff60e287901c1660ff60da88901c161b92508284111561213b578293505b50505092915050565b600066ffffffffffffff604984901c1660ff604185901c161b80820361216e5760009150506104ac565b612710613fff60a286901c168402046401ffffffff608186901c16420362ffffff60b087901c1661219f828461303f565b6121a99190613085565b90508083116121b95760006121bd565b8083035b9350508084038381111561213b5795945050505050565b66ffffffffffffff604883901c811660ff604085901c81169190911b91600885901c169084161b64e8d4a5100061220b848361303f565b6122159190613085565b61221f90836130d3565b949350505050565b60c882901c60ff60c084901c81169190911b9066ffffffffffffff608885901c16608085901c9091161b64e8d4a5100061220b848361303f565b6040518061020001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016122de6122e3565b905290565b60405180606001604052806000815260200161233d6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b81526020016122de6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146123bc57600080fd5b919050565b6000602082840312156123d357600080fd5b61117e82612398565b60008083601f8401126123ee57600080fd5b50813567ffffffffffffffff81111561240657600080fd5b6020830191508360208260051b850101111561242157600080fd5b9250929050565b60008060006040848603121561243d57600080fd5b61244684612398565b9250602084013567ffffffffffffffff81111561246257600080fd5b61246e868287016123dc565b9497909650939450505050565b600081518084526020808501945080840160005b8381101561250d576124f98783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b61012096909601959082019060010161248f565b509495945050505050565b600081518084526020808501945080840160005b8381101561250d57612677878351805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e09687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818801516102208b0152818701516102408b0152818601516102608b0152908401516102808a01529685015180519097166102a0890152948601516102c0880152928501516102e087015290840151610300860152830151610320850152820151610340840152015161036090910152565b61038096909601959082019060010161252c565b60408152600061269e604083018561247b565b82810360208401526126b08185612518565b95945050505050565b6101a081016104ac828480518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b815181526020808301518183015260408084015181840152606080850151818501526080808601518186015260a0808701518187015260c0808801518188015260e08089015190880152610100808901519088015261012080890151908801526101408089015190880152610160808901519088015261018080890151908801526101a080890151908801526101c080890151908801526101e08089015180519189019190915280870151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818901516102208b0152818801516102408b0152818701516102608b0152908501516102808a01529086015180519091166102a0890152958601516102c0880152938501516102e087015291840151610300860152830151610320850152820151610340840152015161036082015261038081016104ac565b600080602083850312156128c057600080fd5b823567ffffffffffffffff8111156128d757600080fd5b6128e3858286016123dc565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156129d3576129bf83855180518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b928401926101a0929092019160010161290b565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129d357835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016129fb565b60008060408385031215612a4057600080fd5b612a4983612398565b9150612a5760208401612398565b90509250929050565b6104c08101612ad282858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152505050565b61117e610140830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e09687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818801516102208b0152818701516102408b0152818601516102608b0152908401516102808a01529685015180519097166102a0890152948601516102c0880152928501516102e087015290840151610300860152830151610320850152820151610340840152015161036090910152565b600080600080600060608688031215612c3057600080fd5b612c3986612398565b9450602086013567ffffffffffffffff80821115612c5657600080fd5b612c6289838a016123dc565b90965094506040880135915080821115612c7b57600080fd5b50612c88888289016123dc565b969995985093965092949392505050565b600081518084526020808501945080840160005b8381101561250d57612d238783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152505050565b610140969096019590820190600101612cad565b608081526000612d4a608083018761247b565b8281036020840152612d5c8187612518565b90508281036040840152612d708186612c99565b90508281036060840152612d848185612518565b979650505050505050565b60408152600061269e6040830185612c99565b60208152600061117e6020830184612518565b6104a08101612e1b82858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b61117e610120830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e09687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818801516102208b0152818701516102408b0152818601516102608b0152908401516102808a01529685015180519097166102a0890152948601516102c0880152928501516102e087015290840151610300860152830151610320850152820151610340840152015161036090910152565b600060208284031215612f7357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361303857613038612fd8565b5060010190565b80820281158282048414176104ac576104ac612fd8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826130bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b818103818111156104ac576104ac612fd8565b808201808211156104ac576104ac612fd856fea26469706673582212206cc300bcc299294a3e85e18a074727d1519efefcab17531049299b239da34c8864736f6c63430008150033",
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101825760003560e01c80634e69d560116100d8578063b3fc48bc1161008c578063cdb5964411610066578063cdb5964414610396578063e72ef91b146103a9578063ee9e836d146103ca57600080fd5b8063b3fc48bc14610332578063b505b75014610355578063cd4a7e141461037657600080fd5b80636e938406116100bd5780636e938406146102eb57806385b67095146102fe578063967915d61461031157600080fd5b80634e69d560146102d057806360fed05f146102d857600080fd5b80632861c7d11161013a5780632b66fc05116101145780632b66fc051461029357806334a2e659146102b35780634a3d6bda146102bb57600080fd5b80632861c7d11461021457806329e04fbf146102605780632b0018331461028057600080fd5b80631dacf0371161016b5780631dacf037146101ce5780631f735227146101ee5780632520e7ff1461020157600080fd5b80630c68ba211461018757806314c0ac36146101ad575b600080fd5b61019a6101953660046123c1565b6103dd565b6040519081526020015b60405180910390f35b6101c06101bb366004612428565b6104b2565b6040516101a492919061268b565b6101e16101dc3660046123c1565b610636565b6040516101a491906126b9565b61019a6101fc3660046123c1565b610786565b61019a61020f3660046123c1565b6107fa565b61023b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a4565b61027361026e3660046123c1565b61086e565b6040516101a49190612769565b61019a61028e3660046123c1565b610aab565b6102a66102a13660046128ad565b610b1f565b6040516101a491906128ef565b61023b610be4565b6102c3610c9c565b6040516101a491906129df565b61019a610ee1565b61019a6102e63660046123c1565b610f57565b61019a6102f93660046123c1565b610fcb565b61019a61030c3660046123c1565b61103f565b61032461031f366004612a2d565b611185565b6040516101a4929190612a60565b610345610340366004612c18565b6114c3565b6040516101a49493929190612d37565b610368610363366004612428565b6117b9565b6040516101a4929190612d8f565b6103896103843660046128ad565b6118d0565b6040516101a49190612da2565b61019a6103a4366004612a2d565b61198d565b6103bc6103b7366004612a2d565b611a83565b6040516101a4929190612db5565b61019a6103d8366004612a2d565b611d77565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526003838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b815260040161046b91815260200190565b602060405180830381865afa158015610488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ac9190612f61565b92915050565b606080828067ffffffffffffffff8111156104cf576104cf612f7a565b60405190808252806020026020018201604052801561055157816020015b61053e60405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816104ed5790505b5092508067ffffffffffffffff81111561056d5761056d612f7a565b6040519080825280602002602001820160405280156105a657816020015b610593612261565b81526020019060019003908161058b5790505b50915060005b8181101561062c576105df878787848181106105ca576105ca612fa9565b90506020020160208101906103b791906123c1565b8583815181106105f1576105f1612fa9565b6020026020010185848151811061060a5761060a612fa9565b602002602001018290528290525050808061062490613007565b9150506105ac565b5050935093915050565b61063e6122e3565b600061064983610f57565b600f81168084529091506001036106a6576020828101805161ffff600485901c81166040909201919091528151601485901c82169301929092528051602484901c831660609091015251603483901c909116608090910152610780565b8151600203610719576040828101805161ffff600485901c81166060909201919091528151601485901c82166020909101528151602485901c82166080909101528151603485901c82169301929092528051604484901c831660a09091015251605483901c90911660c090910152610780565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f742d76616c69642d726174652d76657273696f6e0000000000000000000060448201526064015b60405180910390fd5b50919050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526004838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526002838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b610876612261565b600061088183610aab565b9050600061088e84610fcb565b905061089982611e12565b60e085015260c08085019190915261ffff83168452601083901c613fff908116604080870191909152601e85901c82166060870152602c85901c909116608080870191909152603a85901c6401ffffffff1660a087015266ffffffffffffff600885901c811660ff8087169190911b6101008901819052604887901c83169487901c82169490941b610120890152608886901c9091169185901c81169190911b61014087015260c884901c9284901c9081169290921b610160860152600090819015610a065764e8d4a5100067ffffffffffffffff605b87901c16876101000151610984919061303f565b61098e9190613085565b915064e8d4a5100067ffffffffffffffff609b87901c168761014001516109b5919061303f565b6109bf9190613085565b90506109cd6127108361303f565b8187604001516127106109e091906130c0565b88516109ec919061303f565b6109f6919061303f565b610a009190613085565b60208701525b64e8d4a510008660c00151876101000151610a21919061303f565b610a2b9190613085565b915085610120015182610a3e91906130d3565b61018087015260e086015161014087015164e8d4a5100091610a5f9161303f565b610a699190613085565b905085610160015181610a7c91906130d3565b6101a0870152610a8b8761103f565b6101c0870152610a9a87610636565b6101e0870152509395945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526005838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b6060818067ffffffffffffffff811115610b3b57610b3b612f7a565b604051908082528060200260200182016040528015610b7457816020015b610b616122e3565b815260200190600190039081610b595790505b50915060005b81811015610bdc57610bac858583818110610b9757610b97612fa9565b90506020020160208101906101dc91906123c1565b838281518110610bbe57610bbe612fa9565b60200260200101819052508080610bd490613007565b915050610b7a565b505092915050565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600060048201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e4906024015b602060405180830381865afa158015610c73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c979190612f61565b905090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600a60048201526060906000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401602060405180830381865afa158015610d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d519190612f61565b90508067ffffffffffffffff811115610d6c57610d6c612f7a565b604051908082528060200260200182016040528015610d95578160200160208202803683370190505b5091506000600a604051602001610dae91815260200190565b6040516020818303038152906040528051906020012060001c905060005b82811015610edb5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663b5c736e4610e1a83856130d3565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810191909152602401602060405180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612f61565b848281518110610ea457610ea4612fa9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280610ed381613007565b915050610dcc565b50505090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600160048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401610c56565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526006838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526007838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061044d565b60008073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611128576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528416906370a0823190602401602060405180830381865afa1580156110ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111239190612f61565b611161565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b905061117e61116f84610fcb565b61117885610aab565b83612020565b9392505050565b6111dd6040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6111e5612261565b6111ee8361086e565b905060006111fc858561198d565b6001808216811485529091506112279082901c67ffffffffffffffff16600860ff9082901c91161b90565b60208401819052611239908290612089565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c08401526103ff60e282901c1660ff60da83901c161b60e08401528251156113465764e8d4a510008260e0015184602001516112bb919061303f565b6112c59190613085565b602084015260e0820151604084015164e8d4a51000916112e49161303f565b6112ee9190613085565b604084015260e082015160c084015164e8d4a510009161130d9161303f565b6113179190613085565b60c084015260e0808301519084015164e8d4a51000916113369161303f565b6113409190613085565b60e08401525b826020015183604001511161135c576000611370565b8260200151836040015161137091906130c0565b610100840152600073ffffffffffffffffffffffffffffffffffffffff851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461145e576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528616906370a0823190602401602060405180830381865afa158015611435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114599190612f61565b611497565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b905083610100015181116114ab57806114b2565b8361010001515b610120850152509194909350915050565b6060808080868067ffffffffffffffff8111156114e2576114e2612f7a565b60405190808252806020026020018201604052801561156457816020015b61155160405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816115005790505b5094508067ffffffffffffffff81111561158057611580612f7a565b6040519080825280602002602001820160405280156115b957816020015b6115a6612261565b81526020019060019003908161159e5790505b50935060005b8181101561162a576115dd8b8b8b848181106105ca576105ca612fa9565b8783815181106115ef576115ef612fa9565b6020026020010187848151811061160857611608612fa9565b602002602001018290528290525050808061162290613007565b9150506115bf565b508590508067ffffffffffffffff81111561164757611647612f7a565b6040519080825280602002602001820160405280156116d057816020015b6116bd6040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816116655790505b5092508067ffffffffffffffff8111156116ec576116ec612f7a565b60405190808252806020026020018201604052801561172557816020015b611712612261565b81526020019060019003908161170a5790505b50915060005b818110156117ab5761175e8b89898481811061174957611749612fa9565b905060200201602081019061031f91906123c1565b85838151811061177057611770612fa9565b6020026020010185848151811061178957611789612fa9565b60200260200101829052829052505080806117a390613007565b91505061172b565b505095509550955095915050565b606080828067ffffffffffffffff8111156117d6576117d6612f7a565b60405190808252806020026020018201604052801561185f57816020015b61184c6040518061014001604052806000151581526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816117f45790505b50925060005b8181101561062c576118838787878481811061174957611749612fa9565b85838151811061189557611895612fa9565b602002602001018584815181106118ae576118ae612fa9565b60200260200101829052829052505080806118c890613007565b915050611865565b6060818067ffffffffffffffff8111156118ec576118ec612f7a565b60405190808252806020026020018201604052801561192557816020015b611912612261565b81526020019060019003908161190a5790505b50915060005b81811015610bdc5761195d85858381811061194857611948612fa9565b905060200201602081019061026e91906123c1565b83828151811061196f5761196f612fa9565b6020026020010181905250808061198590613007565b91505061192b565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600983850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b8152600401611a4291815260200190565b602060405180830381865afa158015611a5f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117e9190612f61565b611ad460405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611adc612261565b611ae58361086e565b90506000611af38585611d77565b600180821681148552909150611b1e9082901c67ffffffffffffffff16600860ff9082901c91161b90565b60208401819052611b30908290612144565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c0840152825115611bfd5764e8d4a510008260c001518460200151611b9b919061303f565b611ba59190613085565b602084015260c0820151604084015164e8d4a5100091611bc49161303f565b611bce9190613085565b604084015260c0808301519084015164e8d4a5100091611bed9161303f565b611bf79190613085565b60c08401525b8260400151836020015111611c13576000611c27565b82604001518360200151611c2791906130c0565b60e0840152600073ffffffffffffffffffffffffffffffffffffffff851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611d14576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528616906370a0823190602401602060405180830381865afa158015611ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0f9190612f61565b611d4d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b90508360e001518111611d605780611d66565b8360e001515b610100850152509194909350915050565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600883850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e490611a24565b67ffffffffffffffff605b82901c811690609b83901c16811580611e34575080155b15611e70576040517fd50d7512000000000000000000000000000000000000000000000000000000008152620111716004820152602401610777565b61ffff8316603a84901c6401ffffffff16428181039160ea87901c617fff16911480611e9a575082155b80611ea55750806001145b15611eb257505050915091565b64496cebb80084840283020484019350617fff60db87901c16925082600103611edd57505050915091565b82600116600103611f325760019290921c91826c7e37be2022c0914b268000000081611f0b57611f0b613056565b049250612710601e87901c613fff166b033b2e3c9fd0803ce8000000850102049250611f5f565b60019290921c916305f5e100601e87901c613fff166127108501026b033b2e3c9fd0803ce8000000020492505b80600116600103611f965760011c61271081016b033b2e3c9fd0803ce8000000820281611f8e57611f8e613056565b049050611fcc565b60011c61271081016b033b2e3c9fd0803ce8000000820281611fba57611fba613056565b046b033b2e3c9fd0803ce80000000390505b760a70c3c40a64e6c51999090b65f67d92400000000000008382026127100261ffff881691900402601087901c613fff16612710030292506801b5a660ea44b8000085840283020485019450505050915091565b600080600061202e85611e12565b91509150600061203e87846121d4565b9050801561207b576120508783612227565b61205a90866130d3565b935080841161206a576000612074565b61207481856130c0565b935061207f565b8493505b5050509392505050565b60d082901c6103ff1660c883901c60ff161b613fff60a284901c1661271083820204808401838110156120be575050506104ac565b608186901c6401ffffffff164203925066ffffffffffffff604987901c1660ff604188901c161b60b087901c62ffffff166120f9858561303f565b6121039190613085565b61210d91906130d3565b93508084111561211b578093505b6103ff60e287901c1660ff60da88901c161b92508284111561213b578293505b50505092915050565b600066ffffffffffffff604984901c1660ff604185901c161b80820361216e5760009150506104ac565b612710613fff60a286901c168402046401ffffffff608186901c16420362ffffff60b087901c1661219f828461303f565b6121a99190613085565b90508083116121b95760006121bd565b8083035b9350508084038381111561213b5795945050505050565b66ffffffffffffff604883901c811660ff604085901c81169190911b91600885901c169084161b64e8d4a5100061220b848361303f565b6122159190613085565b61221f90836130d3565b949350505050565b60c882901c60ff60c084901c81169190911b9066ffffffffffffff608885901c16608085901c9091161b64e8d4a5100061220b848361303f565b6040518061020001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016122de6122e3565b905290565b60405180606001604052806000815260200161233d6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b81526020016122de6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff811681146123bc57600080fd5b919050565b6000602082840312156123d357600080fd5b61117e82612398565b60008083601f8401126123ee57600080fd5b50813567ffffffffffffffff81111561240657600080fd5b6020830191508360208260051b850101111561242157600080fd5b9250929050565b60008060006040848603121561243d57600080fd5b61244684612398565b9250602084013567ffffffffffffffff81111561246257600080fd5b61246e868287016123dc565b9497909650939450505050565b600081518084526020808501945080840160005b8381101561250d576124f98783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b61012096909601959082019060010161248f565b509495945050505050565b600081518084526020808501945080840160005b8381101561250d57612677878351805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e09687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818801516102208b0152818701516102408b0152818601516102608b0152908401516102808a01529685015180519097166102a0890152948601516102c0880152928501516102e087015290840151610300860152830151610320850152820151610340840152015161036090910152565b61038096909601959082019060010161252c565b60408152600061269e604083018561247b565b82810360208401526126b08185612518565b95945050505050565b6101a081016104ac828480518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b815181526020808301518183015260408084015181840152606080850151818501526080808601518186015260a0808701518187015260c0808801518188015260e08089015190880152610100808901519088015261012080890151908801526101408089015190880152610160808901519088015261018080890151908801526101a080890151908801526101c080890151908801526101e08089015180519189019190915280870151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818901516102208b0152818801516102408b0152818701516102608b0152908501516102808a01529086015180519091166102a0890152958601516102c0880152938501516102e087015291840151610300860152830151610320850152820151610340840152015161036082015261038081016104ac565b600080602083850312156128c057600080fd5b823567ffffffffffffffff8111156128d757600080fd5b6128e3858286016123dc565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156129d3576129bf83855180518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b928401926101a0929092019160010161290b565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129d357835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016129fb565b60008060408385031215612a4057600080fd5b612a4983612398565b9150612a5760208401612398565b90509250929050565b6104c08101612ad282858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152505050565b61117e610140830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e09687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818801516102208b0152818701516102408b0152818601516102608b0152908401516102808a01529685015180519097166102a0890152948601516102c0880152928501516102e087015290840151610300860152830151610320850152820151610340840152015161036090910152565b600080600080600060608688031215612c3057600080fd5b612c3986612398565b9450602086013567ffffffffffffffff80821115612c5657600080fd5b612c6289838a016123dc565b90965094506040880135915080821115612c7b57600080fd5b50612c88888289016123dc565b969995985093965092949392505050565b600081518084526020808501945080840160005b8381101561250d57612d238783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152505050565b610140969096019590820190600101612cad565b608081526000612d4a608083018761247b565b8281036020840152612d5c8187612518565b90508281036040840152612d708186612c99565b90508281036060840152612d848185612518565b979650505050505050565b60408152600061269e6040830185612c99565b60208152600061117e6020830184612518565b6104a08101612e1b82858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b61117e610120830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e09687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102008b0152818801516102208b0152818701516102408b0152818601516102608b0152908401516102808a01529685015180519097166102a0890152948601516102c0880152928501516102e087015290840151610300860152830151610320850152820151610340840152015161036090910152565b600060208284031215612f7357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361303857613038612fd8565b5060010190565b80820281158282048414176104ac576104ac612fd8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826130bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b818103818111156104ac576104ac612fd8565b808201808211156104ac576104ac612fd856fea26469706673582212206cc300bcc299294a3e85e18a074727d1519efefcab17531049299b239da34c8864736f6c63430008150033",
"devdoc": {
"kind": "dev",
"methods": {},
"stateVariables": {
"_NATIVE_TOKEN_ADDRESS": {
"details": "address that is mapped to the chain native token"
}
},
"version": 1
},
"userdoc": {
"errors": {
"FluidLiquidityResolver__AddressZero()": [
{
"notice": "thrown if an input param address is zero"
}
]
},
"kind": "user",
"methods": {
"LIQUIDITY()": {
"notice": "address of the liquidity contract"
},
"getExchangePricesAndConfig(address)": {
"notice": "gets exchangePricesAndConfig packed uint256 storage slot for `token_`."
},
"getOverallTokenData(address)": {
"notice": "returns general data for `token_` such as rates, exchange prices, utilization, fee, total amounts etc."
},
"getOverallTokensData(address[])": {
"notice": "returns general data for multiple `tokens_` such as rates, exchange prices, utilization, fee, total amounts etc."
},
"getRateConfig(address)": {
"notice": "gets rateConfig packed uint256 storage slot for `token_`."
},
"getRevenue(address)": {
"notice": "gets the `revenueAmount_` for a `token_`."
},
"getRevenueCollector()": {
"notice": "address of contract that gets sent the revenue. Configurable by governance"
},
"getStatus()": {
"notice": "Liquidity contract paused status: status = 1 -> normal. status = 2 -> paused."
},
"getTokenRateData(address)": {
"notice": "get the Rate config data `rateData_` for a `token_` compiled from the packed uint256 rateConfig storage slot"
},
"getTokensRateData(address[])": {
"notice": "get the Rate config datas `rateDatas_` for multiple `tokens_` compiled from the packed uint256 rateConfig storage slot"
},
"getTotalAmounts(address)": {
"notice": "gets totalAmounts packed uint256 storage slot for `token_`."
},
"getUserBorrow(address,address)": {
"notice": "gets userBorrow data packed uint256 storage slot for `user_` and `token_`."
},
"getUserBorrowData(address,address)": {
"notice": "returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for `token_`"
},
"getUserClass(address)": {
"notice": "gets user class for `user_`. Class defines which protocols can be paused by guardians. Currently there are 2 classes: 0 can be paused by guardians. 1 cannot be paused by guardians. New protocols are added as class 0 and will be upgraded to 1 over time."
},
"getUserMultipleBorrowData(address,address[])": {
"notice": "returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `tokens_`"
},
"getUserMultipleBorrowSupplyData(address,address[],address[])": {
"notice": "returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `supplyTokens_` and returns `user_` borrow data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `borrowTokens_`"
},
"getUserMultipleSupplyData(address,address[])": {
"notice": "returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for multiple `tokens_`"
},
"getUserSupply(address,address)": {
"notice": "gets userSupply data packed uint256 storage slot for `user_` and `token_`."
},
"getUserSupplyData(address,address)": {
"notice": "returns `user_` supply data and general data (such as rates, exchange prices, utilization, fee, total amounts etc.) for `token_`"
},
"isAuth(address)": {
"notice": "checks if `auth_` is an allowed auth on Liquidity. Auths can set most config values. E.g. contracts that automate certain flows like e.g. adding a new fToken. Governance can add/remove auths. Governance is auth by default."
},
"isGuardian(address)": {
"notice": "checks if `guardian_` is an allowed Guardian on Liquidity. Guardians can pause lower class users. Governance can add/remove guardians. Governance is guardian by default."
},
"listedTokens()": {
"notice": "returns all `listedTokens_` at the Liquidity contract. Once configured, a token can never be removed."
}
},
"notice": "Fluid Liquidity resolver Implements various view-only methods to give easy access to Liquidity data.",
"version": 1
},
"storageLayout": {
"storage": [],
"types": null
}
}