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

2643 lines
287 KiB
JSON

{
"address": "0x46859d33E662d4bF18eEED88f74C36256E606e44",
"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": [],
"name": "getAllOverallTokensData",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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": "getConfigs2",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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": "uint256",
"name": "borrowLimitUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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": "uint256",
"name": "borrowLimitUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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": "uint256",
"name": "borrowLimitUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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"
},
{
"internalType": "uint256",
"name": "maxUtilization",
"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": "0xcc4fa5247cb824e11c07596ddbee6ef472e374910384cccada7f7f83049b9902",
"receipt": {
"to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
"from": "0x0Ed35B1609Ec45c7079E80d11149a52717e4859A",
"contractAddress": null,
"transactionIndex": 8,
"gasUsed": "3867892",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"blockHash": "0xc8f72925c048cd858fc684a371544ac4b4ac77d0bede86764131e6eb12ea2c51",
"transactionHash": "0xcc4fa5247cb824e11c07596ddbee6ef472e374910384cccada7f7f83049b9902",
"logs": [],
"blockNumber": 220375236,
"cumulativeGasUsed": "5782775",
"status": 1,
"byzantium": true
},
"args": [
"0x52Aa899454998Be5b000Ad077a46Bbe360F4e497"
],
"numDeployments": 1,
"solcInputHash": "1989963ad64c4704dbe1170530c79d20",
"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\":[],\"name\":\"getAllOverallTokensData\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\":\"getConfigs2\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\":\"uint256\",\"name\":\"borrowLimitUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\":\"uint256\",\"name\":\"borrowLimitUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\":\"uint256\",\"name\":\"borrowLimitUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\"},{\"internalType\":\"uint256\",\"name\":\"maxUtilization\",\"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\"},\"getAllOverallTokensData()\":{\"notice\":\"returns general data for all `listedTokens()` such as rates, exchange prices, utilization, fee, total amounts etc.\"},\"getConfigs2(address)\":{\"notice\":\"gets configs2 packed uint256 storage slot for `token_`.\"},\"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 /// @notice thrown when the calculated borrow rate turns negative. This should never happen.\\n uint256 internal constant LiquidityCalcs__BorrowRateNegative = 70003;\\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\":\"0xaf7732f30d00dd38082d37aa37887be485fc94b0c76ff302aff615d03381674f\",\"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 update 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 also be negative for declining rates)\\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 int256 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)\\n // y is in 1e2 so can not overflow when multiplied with TWELVE_DECIMALS\\n slope_ = (int256(y2_ - y1_) * int256(TWELVE_DECIMALS)) / int256((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) - (slope_ * int256(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 slope_ = (slope_ * int256(utilization_)) + constant_; // reusing `slope_` as variable for gas savings\\n if (slope_ < 0) {\\n revert FluidLiquidityCalcsError(ErrorTypes.LiquidityCalcs__BorrowRateNegative);\\n }\\n rate_ = uint256(slope_) / 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 also be negative for declining rates)\\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 int256 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)\\n // y is in 1e2 so can not overflow when multiplied with TWELVE_DECIMALS\\n slope_ = (int256(y2_ - y1_) * int256(TWELVE_DECIMALS)) / int256((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) - (slope_ * int256(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 slope_ = (slope_ * int256(utilization_)) + constant_; // reusing `slope_` as variable for gas savings\\n if (slope_ < 0) {\\n revert FluidLiquidityCalcsError(ErrorTypes.LiquidityCalcs__BorrowRateNegative);\\n }\\n rate_ = uint256(slope_) / 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\":\"0xa65e2f84b2c33769ceb6b28fbd3221be29da2f8ac96e4d8b8cea91948d81a707\",\"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 /// @dev storage slot for listed tokens array at Liquidity\\n uint256 internal constant LIQUIDITY_CONFIGS2_MAPPING_SLOT = 11;\\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 uint256 internal constant BITS_EXCHANGE_PRICES_USES_CONFIGS2 = 249;\\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 // Configs2\\n uint256 internal constant BITS_CONFIGS2_MAX_UTILIZATION = 0;\\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\":\"0x0ae3e1d231bb6c14b54fc1f5ffa306edc0ac827a6a92279c77c0c09627fe08ae\",\"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 /// @param maxUtilization maximum allowed utilization. in 1e2: 100% = 10_000; 1% = 100\\n /// set to 100% to disable and have default limit of 100% (avoiding SLOAD).\\n uint256 maxUtilization;\\n }\\n\\n /// @notice struct to set user supply & withdrawal config\\n struct UserSupplyConfig {\\n ///\\n /// @param user address\\n address user;\\n ///\\n /// @param token address\\n address token;\\n ///\\n /// @param mode: 0 = without interest. 1 = with interest\\n uint8 mode;\\n ///\\n /// @param expandPercent withdrawal limit expand percent. in 1e2: 100% = 10_000; 1% = 100\\n /// Also used to calculate rate at which withdrawal limit should decrease (instant).\\n uint256 expandPercent;\\n ///\\n /// @param expandDuration withdrawal limit expand duration in seconds.\\n /// used to calculate rate together with expandPercent\\n uint256 expandDuration;\\n ///\\n /// @param baseWithdrawalLimit base limit, below this, user can withdraw the entire amount.\\n /// amount in raw (to be multiplied with exchange price) or normal depends on configured mode in user config for the token:\\n /// with interest -> raw, without interest -> normal\\n uint256 baseWithdrawalLimit;\\n }\\n\\n /// @notice struct to set user borrow & payback config\\n struct UserBorrowConfig {\\n ///\\n /// @param user address\\n address user;\\n ///\\n /// @param token address\\n address token;\\n ///\\n /// @param mode: 0 = without interest. 1 = with interest\\n uint8 mode;\\n ///\\n /// @param expandPercent debt limit expand percent. in 1e2: 100% = 10_000; 1% = 100\\n /// Also used to calculate rate at which debt limit should decrease (instant).\\n uint256 expandPercent;\\n ///\\n /// @param expandDuration debt limit expand duration in seconds.\\n /// used to calculate rate together with expandPercent\\n uint256 expandDuration;\\n ///\\n /// @param baseDebtCeiling base borrow limit. until here, borrow limit remains as baseDebtCeiling\\n /// (user can borrow until this point at once without stepped expansion). Above this, automated limit comes in place.\\n /// amount in raw (to be multiplied with exchange price) or normal depends on configured mode in user config for the token:\\n /// with interest -> raw, without interest -> normal\\n uint256 baseDebtCeiling;\\n ///\\n /// @param maxDebtCeiling max borrow ceiling, maximum amount the user can borrow.\\n /// amount in raw (to be multiplied with exchange price) or normal depends on configured mode in user config for the token:\\n /// with interest -> raw, without interest -> normal\\n uint256 maxDebtCeiling;\\n }\\n}\\n\",\"keccak256\":\"0x10353c70015f27b880125cefab806dbed24a4458f187da66964f3ef60488f757\",\"license\":\"BUSL-1.1\"},\"contracts/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 configs2 packed uint256 storage slot for `token_`.\\n function getConfigs2(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 general data for all `listedTokens()` such as rates, exchange prices, utilization, fee, total amounts etc.\\n function getAllOverallTokensData()\\n external\\n view\\n 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\":\"0x241d94b63793c9fb2111bb4ec04035e1fa14ee7e0551683ea05460baa6000189\",\"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 uint256 exchangePricesAndConfig_ = getExchangePricesAndConfig(token_);\\n if (exchangePricesAndConfig_ == 0) {\\n return 0;\\n }\\n\\n return LiquidityCalcs.calcRevenue(getTotalAmounts(token_), exchangePricesAndConfig_, liquidityTokenBalance_);\\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 getConfigs2(address token_) public view returns (uint256) {\\n return\\n LIQUIDITY.readFromStorage(\\n LiquiditySlotsLink.calculateMappingStorageSlot(\\n LiquiditySlotsLink.LIQUIDITY_CONFIGS2_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 if (rateData_.version > 0) {\\n // when version is 0 -> token not configured yet. do not revert, just return 0 for all values\\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 overallTokenData_.rateData = getTokenRateData(token_);\\n\\n uint256 exchangePriceAndConfig_ = getExchangePricesAndConfig(token_);\\n if (exchangePriceAndConfig_ > 0) {\\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 overallTokenData_.maxUtilization = FOUR_DECIMALS;\\n if ((exchangePriceAndConfig_ >> LiquiditySlotsLink.BITS_EXCHANGE_PRICES_USES_CONFIGS2) & 1 == 1) {\\n overallTokenData_.maxUtilization = getConfigs2(token_) & X14;\\n }\\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 = supplyWithInterest_ == 0\\n ? 0\\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 }\\n }\\n\\n /// @inheritdoc IFluidLiquidityResolver\\n function getOverallTokensData(\\n address[] memory 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 getAllOverallTokensData() public view returns (Structs.OverallTokenData[] memory overallTokensData_) {\\n return getOverallTokensData(listedTokens());\\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 if (userSupply_ > 0) {\\n // if userSupply_ == 0 -> user not configured yet for token at Liquidity\\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\\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 if (userBorrow_ > 0) {\\n // if userBorrow_ == 0 -> user not configured yet for token at Liquidity\\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(\\n userBorrow_,\\n userBorrowData_.borrow\\n );\\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_.borrowLimitUtilization =\\n (overallTokenData_.maxUtilization * overallTokenData_.totalSupply) /\\n 1e4;\\n\\n // uncollected revenue is counting towards available balanceOf.\\n // because of this \\\"borrowable\\\" would be showing an amount that can go above 100% utilization, causing a revert.\\n // need to take into consideration the borrowable amount until the max utilization limit, which depends on the total\\n // borrow amount (not user specific)\\n uint borrowableUntilUtilizationLimit_ = userBorrowData_.borrowLimitUtilization >\\n overallTokenData_.totalBorrow\\n ? userBorrowData_.borrowLimitUtilization - overallTokenData_.totalBorrow\\n : 0;\\n\\n uint borrowableUntilBorrowLimit_ = userBorrowData_.borrowLimit > userBorrowData_.borrow\\n ? userBorrowData_.borrowLimit - userBorrowData_.borrow\\n : 0;\\n\\n userBorrowData_.borrowableUntilLimit = borrowableUntilBorrowLimit_ > borrowableUntilUtilizationLimit_\\n ? borrowableUntilUtilizationLimit_\\n : borrowableUntilBorrowLimit_;\\n\\n // if available balance at Liquidity is less than the borrowableUntilLimit amount, then the balance is\\n // the limiting borrowable amount.\\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\\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 overallTokensData_ = new Structs.OverallTokenData[](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\":\"0xb3614178b2a078166724e352bfb17cfb8f6575fc6ba5d41805eecc4de8450c07\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/liquidity/structs.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\npragma solidity 0.8.21;\\n\\nimport { Structs as AdminModuleStructs } from \\\"../../../liquidity/adminModule/structs.sol\\\";\\n\\nabstract contract Structs {\\n struct RateData {\\n uint256 version;\\n AdminModuleStructs.RateDataV1Params rateDataV1;\\n AdminModuleStructs.RateDataV2Params rateDataV2;\\n }\\n\\n struct OverallTokenData {\\n uint256 borrowRate;\\n uint256 supplyRate;\\n uint256 fee; // revenue fee\\n uint256 lastStoredUtilization;\\n uint256 storageUpdateThreshold;\\n uint256 lastUpdateTimestamp;\\n uint256 supplyExchangePrice;\\n uint256 borrowExchangePrice;\\n uint256 supplyRawInterest;\\n uint256 supplyInterestFree;\\n uint256 borrowRawInterest;\\n uint256 borrowInterestFree;\\n uint256 totalSupply;\\n uint256 totalBorrow;\\n uint256 revenue;\\n uint256 maxUtilization; // maximum allowed utilization\\n RateData rateData;\\n }\\n\\n // amounts are always in normal (for withInterest already multiplied with exchange price)\\n struct UserSupplyData {\\n bool modeWithInterest; // true if mode = with interest, false = without interest\\n uint256 supply; // user supply amount\\n // the withdrawal limit (e.g. if 10% is the limit, and 100M is supplied, it would be 90M)\\n uint256 withdrawalLimit;\\n uint256 lastUpdateTimestamp;\\n uint256 expandPercent; // withdrawal limit expand percent in 1e2\\n uint256 expandDuration; // withdrawal limit expand duration in seconds\\n uint256 baseWithdrawalLimit;\\n // the current actual max withdrawable amount (e.g. if 10% is the limit, and 100M is supplied, it would be 10M)\\n uint256 withdrawableUntilLimit;\\n uint256 withdrawable; // actual currently withdrawable amount (supply - withdrawal Limit) & considering balance\\n }\\n\\n // amounts are always in normal (for withInterest already multiplied with exchange price)\\n struct UserBorrowData {\\n bool modeWithInterest; // true if mode = with interest, false = without interest\\n uint256 borrow; // user borrow amount\\n uint256 borrowLimit;\\n uint256 lastUpdateTimestamp;\\n uint256 expandPercent;\\n uint256 expandDuration;\\n uint256 baseBorrowLimit;\\n uint256 maxBorrowLimit;\\n uint256 borrowableUntilLimit; // borrowable amount until any borrow limit (incl. max utilization limit)\\n uint256 borrowable; // actual currently borrowable amount (borrow limit - already borrowed) & considering balance, max utilization\\n uint256 borrowLimitUtilization; // borrow limit for `maxUtilization`\\n }\\n}\\n\",\"keccak256\":\"0xf8a59b6c7963d0bd43be07db0c594e278f97e6dfa498dee8436e3707dd9f574e\",\"license\":\"BUSL-1.1\"},\"contracts/periphery/resolvers/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": "0x60a06040523480156200001157600080fd5b506040516200355c3803806200355c833981016040819052620000349162000068565b6001600160a01b03811660808190526200006157604051630dd6e9eb60e41b815260040160405180910390fd5b506200009a565b6000602082840312156200007b57600080fd5b81516001600160a01b03811681146200009357600080fd5b9392505050565b6080516134216200013b6000396000818161022f01528181610456015281816108060152818161087a01528181610b5701528181610c7a01528181610d3e01528181610e5801528181610f800152818161100c01528181611080015281816110f4015281816111910152818161120b01528181611556015281816115d001528181611bd101528181611e7d01528181611ef70152611fc501526134216000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c80634e69d560116100e3578063b3fc48bc1161008c578063cdb5964411610066578063cdb59644146103c7578063e72ef91b146103da578063ee9e836d146103fb57600080fd5b8063b3fc48bc14610370578063b505b75014610393578063cd4a7e14146103b457600080fd5b80636e938406116100bd5780636e9384061461032957806385b670951461033c578063967915d61461034f57600080fd5b80634e69d560146102fb57806360fed05f14610303578063672694891461031657600080fd5b806329e04fbf1161014557806334a2e6591161011f57806334a2e659146102c957806336ebf76c146102d15780634a3d6bda146102e657600080fd5b806329e04fbf146102765780632b001833146102965780632b66fc05146102a957600080fd5b80631f735227116101765780631f735227146102045780632520e7ff146102175780632861c7d11461022a57600080fd5b80630c68ba211461019d57806314c0ac36146101c35780631dacf037146101e4575b600080fd5b6101b06101ab36600461259f565b61040e565b6040519081526020015b60405180910390f35b6101d66101d1366004612606565b6104e3565b6040516101ba929190612874565b6101f76101f236600461259f565b610667565b6040516101ba91906128a2565b6101b061021236600461259f565b6107be565b6101b061022536600461259f565b610832565b6102517f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b61028961028436600461259f565b6108a6565b6040516101ba9190612952565b6101b06102a436600461259f565b610b0f565b6102bc6102b7366004612aa1565b610b83565b6040516101ba9190612ae3565b610251610c48565b6102d9610d00565b6040516101ba9190612bd3565b6102ee610d09565b6040516101ba9190612be6565b6101b0610f4e565b6101b061031136600461259f565b610fc4565b6101b061032436600461259f565b611038565b6101b061033736600461259f565b6110ac565b6101b061034a36600461259f565b611120565b61036261035d366004612c34565b61127e565b6040516101ba929190612c67565b61038361037e366004612e36565b611634565b6040516101ba9493929190612f61565b6103a66103a1366004612606565b611931565b6040516101ba929190612fb9565b6102d96103c2366004612ffb565b611aa4565b6101b06103d5366004612c34565b611b62565b6103ed6103e8366004612c34565b611c5f565b6040516101ba9291906130de565b6101b0610409366004612c34565b611f56565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526003838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b815260040161049c91815260200190565b602060405180830381865afa1580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190613295565b92915050565b606080828067ffffffffffffffff81111561050057610500612fcc565b60405190808252806020026020018201604052801561058257816020015b61056f60405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b81526020019060019003908161051e5790505b5092508067ffffffffffffffff81111561059e5761059e612fcc565b6040519080825280602002602001820160405280156105d757816020015b6105c4612438565b8152602001906001900390816105bc5790505b50915060005b8181101561065d57610610878787848181106105fb576105fb6132ae565b90506020020160208101906103e8919061259f565b858381518110610622576106226132ae565b6020026020010185848151811061063b5761063b6132ae565b60200260200101829052829052505080806106559061330c565b9150506105dd565b5050935093915050565b61066f6124c1565b600061067a83610fc4565b600f81168084529091506001036106d7576020828101805161ffff600485901c81166040909201919091528151601485901c82169301929092528051602484901c831660609091015251603483901c9091166080909101526107b8565b815160020361074a576040828101805161ffff600485901c81166060909201919091528151601485901c82166020909101528151602485901c82166080909101528151603485901c82169301929092528051604484901c831660a09091015251605483901c90911660c0909101526107b8565b8151156107b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f742d76616c69642d726174652d76657273696f6e0000000000000000000060448201526064015b60405180910390fd5b50919050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526004838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526002838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6108ae612438565b6108b782610667565b61020082015260006108c883610b0f565b905080156107b85760006108db846110ac565b90506108e682611ff1565b60e085015260c084015261ffff82168352601082901c613fff9081166040850152601e83901c81166060850152602c83901c166080840152603a82901c6401ffffffff1660a08401526127106101e0840152600160f983901c8116900361095b57613fff61095385611038565b166101e08401525b66ffffffffffffff600882901c811660ff8084169190911b6101008601819052604884901c8316604085901c83161b610120870152608884901c909216608084901c82161b61014086015260c883901c60c084901c9182161b61016086015290600090819015610a7a5764e8d4a5100067ffffffffffffffff605b87901c168761010001516109ea9190613344565b6109f4919061338a565b915064e8d4a5100067ffffffffffffffff609b87901c16876101400151610a1b9190613344565b610a25919061338a565b90508115610a7157610a3961271083613344565b818760400151612710610a4c91906133c5565b8851610a589190613344565b610a629190613344565b610a6c919061338a565b610a74565b60005b60208701525b64e8d4a510008660c00151876101000151610a959190613344565b610a9f919061338a565b915085610120015182610ab291906133d8565b61018087015260e086015161014087015164e8d4a5100091610ad391613344565b610add919061338a565b905085610160015181610af091906133d8565b6101a0870152610aff87611120565b6101c08701525050505050919050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526005838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6060818067ffffffffffffffff811115610b9f57610b9f612fcc565b604051908082528060200260200182016040528015610bd857816020015b610bc56124c1565b815260200190600190039081610bbd5790505b50915060005b81811015610c4057610c10858583818110610bfb57610bfb6132ae565b90506020020160208101906101f2919061259f565b838281518110610c2257610c226132ae565b60200260200101819052508080610c389061330c565b915050610bde565b505092915050565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600060048201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e4906024015b602060405180830381865afa158015610cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfb9190613295565b905090565b6060610cfb6103c25b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600a60048201526060906000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401602060405180830381865afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe9190613295565b90508067ffffffffffffffff811115610dd957610dd9612fcc565b604051908082528060200260200182016040528015610e02578160200160208202803683370190505b5091506000600a604051602001610e1b91815260200190565b6040516020818303038152906040528051906020012060001c905060005b82811015610f485773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663b5c736e4610e8783856133d8565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810191909152602401602060405180830381865afa158015610edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eff9190613295565b848281518110610f1157610f116132ae565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280610f408161330c565b915050610e39565b50505090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600160048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401610cba565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526006838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6040805173ffffffffffffffffffffffffffffffffffffffff838116602080840191909152600b838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526007838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b60008073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611209576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528416906370a0823190602401602060405180830381865afa1580156111e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190613295565b611242565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b9050600061124f84610b0f565b905080600003611263575060009392505050565b61127661126f856110ac565b82846121ff565b949350505050565b6112dd604051806101600160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6112e5612438565b6112ee836108a6565b905060006112fc8585611b62565b9050801561162c5760018082168114845261132c9082901c67ffffffffffffffff16600860ff9082901c91161b90565b6020840181905261133e908290612268565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c08401526103ff60e282901c1660ff60da83901c161b60e084015282511561144b5764e8d4a510008260e0015184602001516113c09190613344565b6113ca919061338a565b602084015260e0820151604084015164e8d4a51000916113e991613344565b6113f3919061338a565b604084015260e082015160c084015164e8d4a510009161141291613344565b61141c919061338a565b60c084015260e0808301519084015164e8d4a510009161143b91613344565b611445919061338a565b60e08401525b612710826101800151836101e001516114649190613344565b61146e919061338a565b61014084018190526101a08301516000911161148b5760006114a1565b826101a001518461014001516114a191906133c5565b9050600084602001518560400151116114bb5760006114cf565b846020015185604001516114cf91906133c5565b90508181116114de57806114e0565b815b610100860152600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146115ce576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528816906370a0823190602401602060405180830381865afa1580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c99190613295565b611607565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b9050856101000151811161161b5780611622565b8561010001515b6101208701525050505b509250929050565b6060808080868067ffffffffffffffff81111561165357611653612fcc565b6040519080825280602002602001820160405280156116d557816020015b6116c260405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816116715790505b5094508067ffffffffffffffff8111156116f1576116f1612fcc565b60405190808252806020026020018201604052801561172a57816020015b611717612438565b81526020019060019003908161170f5790505b50935060005b8181101561179b5761174e8b8b8b848181106105fb576105fb6132ae565b878381518110611760576117606132ae565b60200260200101878481518110611779576117796132ae565b60200260200101829052829052505080806117939061330c565b915050611730565b508590508067ffffffffffffffff8111156117b8576117b8612fcc565b60405190808252806020026020018201604052801561184857816020015b611835604051806101600160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816117d65790505b5092508067ffffffffffffffff81111561186457611864612fcc565b60405190808252806020026020018201604052801561189d57816020015b61188a612438565b8152602001906001900390816118825790505b50915060005b81811015611923576118d68b8989848181106118c1576118c16132ae565b905060200201602081019061035d919061259f565b8583815181106118e8576118e86132ae565b60200260200101858481518110611901576119016132ae565b602002602001018290528290525050808061191b9061330c565b9150506118a3565b505095509550955095915050565b606080828067ffffffffffffffff81111561194e5761194e612fcc565b6040519080825280602002602001820160405280156119de57816020015b6119cb604051806101600160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b81526020019060019003908161196c5790505b5092508067ffffffffffffffff8111156119fa576119fa612fcc565b604051908082528060200260200182016040528015611a3357816020015b611a20612438565b815260200190600190039081611a185790505b50915060005b8181101561065d57611a57878787848181106118c1576118c16132ae565b858381518110611a6957611a696132ae565b60200260200101858481518110611a8257611a826132ae565b6020026020010182905282905250508080611a9c9061330c565b915050611a39565b80516060908067ffffffffffffffff811115611ac257611ac2612fcc565b604051908082528060200260200182016040528015611afb57816020015b611ae8612438565b815260200190600190039081611ae05790505b50915060005b81811015611b5b57611b2b848281518110611b1e57611b1e6132ae565b60200260200101516108a6565b838281518110611b3d57611b3d6132ae565b60200260200101819052508080611b539061330c565b915050611b01565b5050919050565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600983850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b8152600401611c1791815260200190565b602060405180830381865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c589190613295565b9392505050565b611cb060405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611cb8612438565b611cc1836108a6565b90506000611ccf8585611f56565b9050801561162c57600180821681148452611cff9082901c67ffffffffffffffff16600860ff9082901c91161b90565b60208401819052611d11908290612323565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c0840152825115611dde5764e8d4a510008260c001518460200151611d7c9190613344565b611d86919061338a565b602084015260c0820151604084015164e8d4a5100091611da591613344565b611daf919061338a565b604084015260c0808301519084015164e8d4a5100091611dce91613344565b611dd8919061338a565b60c08401525b8260400151836020015111611df4576000611e08565b82604001518360200151611e0891906133c5565b60e0840152600073ffffffffffffffffffffffffffffffffffffffff851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611ef5576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528616906370a0823190602401602060405180830381865afa158015611ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef09190613295565b611f2e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b90508360e001518111611f415780611f47565b8360e001515b61010085015250509250929050565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600883850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e490611bf9565b67ffffffffffffffff605b82901c811690609b83901c16811580612013575080155b1561204f576040517fd50d75120000000000000000000000000000000000000000000000000000000081526201117160048201526024016107af565b61ffff8316603a84901c6401ffffffff16428181039160ea87901c617fff16911480612079575082155b806120845750806001145b1561209157505050915091565b64496cebb80084840283020484019350617fff60db87901c169250826001036120bc57505050915091565b826001166001036121115760019290921c91826c7e37be2022c0914b2680000000816120ea576120ea61335b565b049250612710601e87901c613fff166b033b2e3c9fd0803ce800000085010204925061213e565b60019290921c916305f5e100601e87901c613fff166127108501026b033b2e3c9fd0803ce8000000020492505b806001166001036121755760011c61271081016b033b2e3c9fd0803ce800000082028161216d5761216d61335b565b0490506121ab565b60011c61271081016b033b2e3c9fd0803ce80000008202816121995761219961335b565b046b033b2e3c9fd0803ce80000000390505b760a70c3c40a64e6c51999090b65f67d92400000000000008382026127100261ffff881691900402601087901c613fff16612710030292506801b5a660ea44b8000085840283020485019450505050915091565b600080600061220d85611ff1565b91509150600061221d87846123b3565b9050801561225a5761222f87836123fe565b61223990866133d8565b9350808411612249576000612253565b61225381856133c5565b935061225e565b8493505b5050509392505050565b60d082901c6103ff1660c883901c60ff161b613fff60a284901c16612710838202048084018381101561229d575050506104dd565b608186901c6401ffffffff164203925066ffffffffffffff604987901c1660ff604188901c161b60b087901c62ffffff166122d88585613344565b6122e2919061338a565b6122ec91906133d8565b9350808411156122fa578093505b6103ff60e287901c1660ff60da88901c161b92508284111561231a578293505b50505092915050565b600066ffffffffffffff604984901c1660ff604185901c161b80820361234d5760009150506104dd565b612710613fff60a286901c168402046401ffffffff608186901c16420362ffffff60b087901c1661237e8284613344565b612388919061338a565b905080831161239857600061239c565b8083035b9350508084038381111561231a5795945050505050565b66ffffffffffffff604883901c811660ff604085901c81169190911b91600885901c169084161b64e8d4a510006123ea8483613344565b6123f4919061338a565b61127690836133d8565b60c882901c60ff60c084901c81169190911b9066ffffffffffffff608885901c16608085901c9091161b64e8d4a510006123ea8483613344565b604051806102200160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016124bc6124c1565b905290565b60405180606001604052806000815260200161251b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b81526020016124bc6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461259a57600080fd5b919050565b6000602082840312156125b157600080fd5b611c5882612576565b60008083601f8401126125cc57600080fd5b50813567ffffffffffffffff8111156125e457600080fd5b6020830191508360208260051b85010111156125ff57600080fd5b9250929050565b60008060006040848603121561261b57600080fd5b61262484612576565b9250602084013567ffffffffffffffff81111561264057600080fd5b61264c868287016125ba565b9497909650939450505050565b600081518084526020808501945080840160005b838110156126eb576126d78783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b61012096909601959082019060010161266d565b509495945050505050565b600081518084526020808501945080840160005b838110156126eb57612860878351805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e080880151908901526102009687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818801516102408b0152818701516102608b0152818601516102808b0152908401516102a08a01529685015180519097166102c0890152948601516102e08801529285015161030087015290840151610320860152830151610340850152820151610360840152015161038090910152565b6103a096909601959082019060010161270a565b6040815260006128876040830185612659565b828103602084015261289981856126f6565b95945050505050565b6101a081016104dd828480518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b815181526020808301518183015260408084015181840152606080850151818501526080808601518186015260a0808701518187015260c0808801518188015260e08089015190880152610100808901519088015261012080890151908801526101408089015190880152610160808901519088015261018080890151908801526101a080890151908801526101c080890151908801526101e080890151908801526102008089015180519189019190915280870151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818901516102408b0152818801516102608b0152818701516102808b0152908501516102a08a01529086015180519091166102c0890152958601516102e0880152938501516103008701529184015161032086015283015161034085015282015161036084015201516103808201526103a081016104dd565b60008060208385031215612ab457600080fd5b823567ffffffffffffffff811115612acb57600080fd5b612ad7858286016125ba565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015612bc757612bb383855180518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b928401926101a09290920191600101612aff565b50909695505050505050565b602081526000611c5860208301846126f6565b6020808252825182820181905260009190848201906040850190845b81811015612bc757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c02565b60008060408385031215612c4757600080fd5b612c5083612576565b9150612c5e60208401612576565b90509250929050565b6105008101612ce582858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152505050565b611c58610160830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e080880151908901526102009687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818801516102408b0152818701516102608b0152818601516102808b0152908401516102a08a01529685015180519097166102c0890152948601516102e08801529285015161030087015290840151610320860152830151610340850152820151610360840152015161038090910152565b600080600080600060608688031215612e4e57600080fd5b612e5786612576565b9450602086013567ffffffffffffffff80821115612e7457600080fd5b612e8089838a016125ba565b90965094506040880135915080821115612e9957600080fd5b50612ea6888289016125ba565b969995985093965092949392505050565b600081518084526020808501945080840160005b838110156126eb57612f4d8783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152505050565b610160969096019590820190600101612ecb565b608081526000612f746080830187612659565b8281036020840152612f8681876126f6565b90508281036040840152612f9a8186612eb7565b90508281036060840152612fae81856126f6565b979650505050505050565b6040815260006128876040830185612eb7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602080838503121561300e57600080fd5b823567ffffffffffffffff8082111561302657600080fd5b818501915085601f83011261303a57600080fd5b81358181111561304c5761304c612fcc565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561308f5761308f612fcc565b6040529182528482019250838101850191888311156130ad57600080fd5b938501935b828510156130d2576130c385612576565b845293850193928501926130b2565b98975050505050505050565b6104c0810161314482858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b611c58610120830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e080880151908901526102009687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818801516102408b0152818701516102608b0152818601516102808b0152908401516102a08a01529685015180519097166102c0890152948601516102e08801529285015161030087015290840151610320860152830151610340850152820151610360840152015161038090910152565b6000602082840312156132a757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361333d5761333d6132dd565b5060010190565b80820281158282048414176104dd576104dd6132dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826133c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b818103818111156104dd576104dd6132dd565b808201808211156104dd576104dd6132dd56fea26469706673582212206a1b3cbd5b38b416dabf29ce192ec09d47a7d43cd7af491938e041d6ca0cdbe064736f6c63430008150033",
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101985760003560e01c80634e69d560116100e3578063b3fc48bc1161008c578063cdb5964411610066578063cdb59644146103c7578063e72ef91b146103da578063ee9e836d146103fb57600080fd5b8063b3fc48bc14610370578063b505b75014610393578063cd4a7e14146103b457600080fd5b80636e938406116100bd5780636e9384061461032957806385b670951461033c578063967915d61461034f57600080fd5b80634e69d560146102fb57806360fed05f14610303578063672694891461031657600080fd5b806329e04fbf1161014557806334a2e6591161011f57806334a2e659146102c957806336ebf76c146102d15780634a3d6bda146102e657600080fd5b806329e04fbf146102765780632b001833146102965780632b66fc05146102a957600080fd5b80631f735227116101765780631f735227146102045780632520e7ff146102175780632861c7d11461022a57600080fd5b80630c68ba211461019d57806314c0ac36146101c35780631dacf037146101e4575b600080fd5b6101b06101ab36600461259f565b61040e565b6040519081526020015b60405180910390f35b6101d66101d1366004612606565b6104e3565b6040516101ba929190612874565b6101f76101f236600461259f565b610667565b6040516101ba91906128a2565b6101b061021236600461259f565b6107be565b6101b061022536600461259f565b610832565b6102517f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ba565b61028961028436600461259f565b6108a6565b6040516101ba9190612952565b6101b06102a436600461259f565b610b0f565b6102bc6102b7366004612aa1565b610b83565b6040516101ba9190612ae3565b610251610c48565b6102d9610d00565b6040516101ba9190612bd3565b6102ee610d09565b6040516101ba9190612be6565b6101b0610f4e565b6101b061031136600461259f565b610fc4565b6101b061032436600461259f565b611038565b6101b061033736600461259f565b6110ac565b6101b061034a36600461259f565b611120565b61036261035d366004612c34565b61127e565b6040516101ba929190612c67565b61038361037e366004612e36565b611634565b6040516101ba9493929190612f61565b6103a66103a1366004612606565b611931565b6040516101ba929190612fb9565b6102d96103c2366004612ffb565b611aa4565b6101b06103d5366004612c34565b611b62565b6103ed6103e8366004612c34565b611c5f565b6040516101ba9291906130de565b6101b0610409366004612c34565b611f56565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526003838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b815260040161049c91815260200190565b602060405180830381865afa1580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190613295565b92915050565b606080828067ffffffffffffffff81111561050057610500612fcc565b60405190808252806020026020018201604052801561058257816020015b61056f60405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b81526020019060019003908161051e5790505b5092508067ffffffffffffffff81111561059e5761059e612fcc565b6040519080825280602002602001820160405280156105d757816020015b6105c4612438565b8152602001906001900390816105bc5790505b50915060005b8181101561065d57610610878787848181106105fb576105fb6132ae565b90506020020160208101906103e8919061259f565b858381518110610622576106226132ae565b6020026020010185848151811061063b5761063b6132ae565b60200260200101829052829052505080806106559061330c565b9150506105dd565b5050935093915050565b61066f6124c1565b600061067a83610fc4565b600f81168084529091506001036106d7576020828101805161ffff600485901c81166040909201919091528151601485901c82169301929092528051602484901c831660609091015251603483901c9091166080909101526107b8565b815160020361074a576040828101805161ffff600485901c81166060909201919091528151601485901c82166020909101528151602485901c82166080909101528151603485901c82169301929092528051604484901c831660a09091015251605483901c90911660c0909101526107b8565b8151156107b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f742d76616c69642d726174652d76657273696f6e0000000000000000000060448201526064015b60405180910390fd5b50919050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526004838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526002838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6108ae612438565b6108b782610667565b61020082015260006108c883610b0f565b905080156107b85760006108db846110ac565b90506108e682611ff1565b60e085015260c084015261ffff82168352601082901c613fff9081166040850152601e83901c81166060850152602c83901c166080840152603a82901c6401ffffffff1660a08401526127106101e0840152600160f983901c8116900361095b57613fff61095385611038565b166101e08401525b66ffffffffffffff600882901c811660ff8084169190911b6101008601819052604884901c8316604085901c83161b610120870152608884901c909216608084901c82161b61014086015260c883901c60c084901c9182161b61016086015290600090819015610a7a5764e8d4a5100067ffffffffffffffff605b87901c168761010001516109ea9190613344565b6109f4919061338a565b915064e8d4a5100067ffffffffffffffff609b87901c16876101400151610a1b9190613344565b610a25919061338a565b90508115610a7157610a3961271083613344565b818760400151612710610a4c91906133c5565b8851610a589190613344565b610a629190613344565b610a6c919061338a565b610a74565b60005b60208701525b64e8d4a510008660c00151876101000151610a959190613344565b610a9f919061338a565b915085610120015182610ab291906133d8565b61018087015260e086015161014087015164e8d4a5100091610ad391613344565b610add919061338a565b905085610160015181610af091906133d8565b6101a0870152610aff87611120565b6101c08701525050505050919050565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526005838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6060818067ffffffffffffffff811115610b9f57610b9f612fcc565b604051908082528060200260200182016040528015610bd857816020015b610bc56124c1565b815260200190600190039081610bbd5790505b50915060005b81811015610c4057610c10858583818110610bfb57610bfb6132ae565b90506020020160208101906101f2919061259f565b838281518110610c2257610c226132ae565b60200260200101819052508080610c389061330c565b915050610bde565b505092915050565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600060048201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e4906024015b602060405180830381865afa158015610cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfb9190613295565b905090565b6060610cfb6103c25b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600a60048201526060906000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401602060405180830381865afa158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbe9190613295565b90508067ffffffffffffffff811115610dd957610dd9612fcc565b604051908082528060200260200182016040528015610e02578160200160208202803683370190505b5091506000600a604051602001610e1b91815260200190565b6040516020818303038152906040528051906020012060001c905060005b82811015610f485773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663b5c736e4610e8783856133d8565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810191909152602401602060405180830381865afa158015610edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eff9190613295565b848281518110610f1157610f116132ae565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015280610f408161330c565b915050610e39565b50505090565b6040517fb5c736e4000000000000000000000000000000000000000000000000000000008152600160048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b5c736e490602401610cba565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526006838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6040805173ffffffffffffffffffffffffffffffffffffffff838116602080840191909152600b838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b6040805173ffffffffffffffffffffffffffffffffffffffff8381166020808401919091526007838501528351808403850181526060909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e49061047e565b60008073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611209576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528416906370a0823190602401602060405180830381865afa1580156111e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112049190613295565b611242565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b9050600061124f84610b0f565b905080600003611263575060009392505050565b61127661126f856110ac565b82846121ff565b949350505050565b6112dd604051806101600160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6112e5612438565b6112ee836108a6565b905060006112fc8585611b62565b9050801561162c5760018082168114845261132c9082901c67ffffffffffffffff16600860ff9082901c91161b90565b6020840181905261133e908290612268565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c08401526103ff60e282901c1660ff60da83901c161b60e084015282511561144b5764e8d4a510008260e0015184602001516113c09190613344565b6113ca919061338a565b602084015260e0820151604084015164e8d4a51000916113e991613344565b6113f3919061338a565b604084015260e082015160c084015164e8d4a510009161141291613344565b61141c919061338a565b60c084015260e0808301519084015164e8d4a510009161143b91613344565b611445919061338a565b60e08401525b612710826101800151836101e001516114649190613344565b61146e919061338a565b61014084018190526101a08301516000911161148b5760006114a1565b826101a001518461014001516114a191906133c5565b9050600084602001518560400151116114bb5760006114cf565b846020015185604001516114cf91906133c5565b90508181116114de57806114e0565b815b610100860152600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146115ce576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528816906370a0823190602401602060405180830381865afa1580156115a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c99190613295565b611607565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b9050856101000151811161161b5780611622565b8561010001515b6101208701525050505b509250929050565b6060808080868067ffffffffffffffff81111561165357611653612fcc565b6040519080825280602002602001820160405280156116d557816020015b6116c260405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816116715790505b5094508067ffffffffffffffff8111156116f1576116f1612fcc565b60405190808252806020026020018201604052801561172a57816020015b611717612438565b81526020019060019003908161170f5790505b50935060005b8181101561179b5761174e8b8b8b848181106105fb576105fb6132ae565b878381518110611760576117606132ae565b60200260200101878481518110611779576117796132ae565b60200260200101829052829052505080806117939061330c565b915050611730565b508590508067ffffffffffffffff8111156117b8576117b8612fcc565b60405190808252806020026020018201604052801561184857816020015b611835604051806101600160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816117d65790505b5092508067ffffffffffffffff81111561186457611864612fcc565b60405190808252806020026020018201604052801561189d57816020015b61188a612438565b8152602001906001900390816118825790505b50915060005b81811015611923576118d68b8989848181106118c1576118c16132ae565b905060200201602081019061035d919061259f565b8583815181106118e8576118e86132ae565b60200260200101858481518110611901576119016132ae565b602002602001018290528290525050808061191b9061330c565b9150506118a3565b505095509550955095915050565b606080828067ffffffffffffffff81111561194e5761194e612fcc565b6040519080825280602002602001820160405280156119de57816020015b6119cb604051806101600160405280600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b81526020019060019003908161196c5790505b5092508067ffffffffffffffff8111156119fa576119fa612fcc565b604051908082528060200260200182016040528015611a3357816020015b611a20612438565b815260200190600190039081611a185790505b50915060005b8181101561065d57611a57878787848181106118c1576118c16132ae565b858381518110611a6957611a696132ae565b60200260200101858481518110611a8257611a826132ae565b6020026020010182905282905250508080611a9c9061330c565b915050611a39565b80516060908067ffffffffffffffff811115611ac257611ac2612fcc565b604051908082528060200260200182016040528015611afb57816020015b611ae8612438565b815260200190600190039081611ae05790505b50915060005b81811015611b5b57611b2b848281518110611b1e57611b1e6132ae565b60200260200101516108a6565b838281518110611b3d57611b3d6132ae565b60200260200101819052508080611b539061330c565b915050611b01565b5050919050565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600983850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e4905b6040518263ffffffff1660e01b8152600401611c1791815260200190565b602060405180830381865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c589190613295565b9392505050565b611cb060405180610120016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611cb8612438565b611cc1836108a6565b90506000611ccf8585611f56565b9050801561162c57600180821681148452611cff9082901c67ffffffffffffffff16600860ff9082901c91161b90565b60208401819052611d11908290612323565b60408401526401ffffffff608182901c166060840152613fff60a282901c16608084015262ffffff60b082901c1660a08401526103ff60d082901c1660ff60c883901c161b60c0840152825115611dde5764e8d4a510008260c001518460200151611d7c9190613344565b611d86919061338a565b602084015260c0820151604084015164e8d4a5100091611da591613344565b611daf919061338a565b604084015260c0808301519084015164e8d4a5100091611dce91613344565b611dd8919061338a565b60c08401525b8260400151836020015111611df4576000611e08565b82604001518360200151611e0891906133c5565b60e0840152600073ffffffffffffffffffffffffffffffffffffffff851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611ef5576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301528616906370a0823190602401602060405180830381865afa158015611ecc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef09190613295565b611f2e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16315b90508360e001518111611f415780611f47565b8360e001515b61010085015250509250929050565b6040805173ffffffffffffffffffffffffffffffffffffffff848116602080840191909152600883850152835180840385018152606084018552805190820120858316608085015260a0808501919091528451808503909101815260c0909301909352815191909201206000917f0000000000000000000000000000000000000000000000000000000000000000169063b5c736e490611bf9565b67ffffffffffffffff605b82901c811690609b83901c16811580612013575080155b1561204f576040517fd50d75120000000000000000000000000000000000000000000000000000000081526201117160048201526024016107af565b61ffff8316603a84901c6401ffffffff16428181039160ea87901c617fff16911480612079575082155b806120845750806001145b1561209157505050915091565b64496cebb80084840283020484019350617fff60db87901c169250826001036120bc57505050915091565b826001166001036121115760019290921c91826c7e37be2022c0914b2680000000816120ea576120ea61335b565b049250612710601e87901c613fff166b033b2e3c9fd0803ce800000085010204925061213e565b60019290921c916305f5e100601e87901c613fff166127108501026b033b2e3c9fd0803ce8000000020492505b806001166001036121755760011c61271081016b033b2e3c9fd0803ce800000082028161216d5761216d61335b565b0490506121ab565b60011c61271081016b033b2e3c9fd0803ce80000008202816121995761219961335b565b046b033b2e3c9fd0803ce80000000390505b760a70c3c40a64e6c51999090b65f67d92400000000000008382026127100261ffff881691900402601087901c613fff16612710030292506801b5a660ea44b8000085840283020485019450505050915091565b600080600061220d85611ff1565b91509150600061221d87846123b3565b9050801561225a5761222f87836123fe565b61223990866133d8565b9350808411612249576000612253565b61225381856133c5565b935061225e565b8493505b5050509392505050565b60d082901c6103ff1660c883901c60ff161b613fff60a284901c16612710838202048084018381101561229d575050506104dd565b608186901c6401ffffffff164203925066ffffffffffffff604987901c1660ff604188901c161b60b087901c62ffffff166122d88585613344565b6122e2919061338a565b6122ec91906133d8565b9350808411156122fa578093505b6103ff60e287901c1660ff60da88901c161b92508284111561231a578293505b50505092915050565b600066ffffffffffffff604984901c1660ff604185901c161b80820361234d5760009150506104dd565b612710613fff60a286901c168402046401ffffffff608186901c16420362ffffff60b087901c1661237e8284613344565b612388919061338a565b905080831161239857600061239c565b8083035b9350508084038381111561231a5795945050505050565b66ffffffffffffff604883901c811660ff604085901c81169190911b91600885901c169084161b64e8d4a510006123ea8483613344565b6123f4919061338a565b61127690836133d8565b60c882901c60ff60c084901c81169190911b9066ffffffffffffff608885901c16608085901c9091161b64e8d4a510006123ea8483613344565b604051806102200160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016124bc6124c1565b905290565b60405180606001604052806000815260200161251b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b81526020016124bc6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461259a57600080fd5b919050565b6000602082840312156125b157600080fd5b611c5882612576565b60008083601f8401126125cc57600080fd5b50813567ffffffffffffffff8111156125e457600080fd5b6020830191508360208260051b85010111156125ff57600080fd5b9250929050565b60008060006040848603121561261b57600080fd5b61262484612576565b9250602084013567ffffffffffffffff81111561264057600080fd5b61264c868287016125ba565b9497909650939450505050565b600081518084526020808501945080840160005b838110156126eb576126d78783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b61012096909601959082019060010161266d565b509495945050505050565b600081518084526020808501945080840160005b838110156126eb57612860878351805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e080880151908901526102009687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818801516102408b0152818701516102608b0152818601516102808b0152908401516102a08a01529685015180519097166102c0890152948601516102e08801529285015161030087015290840151610320860152830151610340850152820151610360840152015161038090910152565b6103a096909601959082019060010161270a565b6040815260006128876040830185612659565b828103602084015261289981856126f6565b95945050505050565b6101a081016104dd828480518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b815181526020808301518183015260408084015181840152606080850151818501526080808601518186015260a0808701518187015260c0808801518188015260e08089015190880152610100808901519088015261012080890151908801526101408089015190880152610160808901519088015261018080890151908801526101a080890151908801526101c080890151908801526101e080890151908801526102008089015180519189019190915280870151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818901516102408b0152818801516102608b0152818701516102808b0152908501516102a08a01529086015180519091166102c0890152958601516102e0880152938501516103008701529184015161032086015283015161034085015282015161036084015201516103808201526103a081016104dd565b60008060208385031215612ab457600080fd5b823567ffffffffffffffff811115612acb57600080fd5b612ad7858286016125ba565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015612bc757612bb383855180518252602081015173ffffffffffffffffffffffffffffffffffffffff808251166020850152602082015160408501526040820151606085015260608201516080850152608082015160a0850152604083015191508082511660c085015250602081015160e084015260408101516101008401526060810151610120840152608081015161014084015260a081015161016084015260c0810151610180840152505050565b928401926101a09290920191600101612aff565b50909695505050505050565b602081526000611c5860208301846126f6565b6020808252825182820181905260009190848201906040850190845b81811015612bc757835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612c02565b60008060408385031215612c4757600080fd5b612c5083612576565b9150612c5e60208401612576565b90509250929050565b6105008101612ce582858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152505050565b611c58610160830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e080880151908901526102009687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818801516102408b0152818701516102608b0152818601516102808b0152908401516102a08a01529685015180519097166102c0890152948601516102e08801529285015161030087015290840151610320860152830151610340850152820151610360840152015161038090910152565b600080600080600060608688031215612e4e57600080fd5b612e5786612576565b9450602086013567ffffffffffffffff80821115612e7457600080fd5b612e8089838a016125ba565b90965094506040880135915080821115612e9957600080fd5b50612ea6888289016125ba565b969995985093965092949392505050565b600081518084526020808501945080840160005b838110156126eb57612f4d8783518051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152505050565b610160969096019590820190600101612ecb565b608081526000612f746080830187612659565b8281036020840152612f8681876126f6565b90508281036040840152612f9a8186612eb7565b90508281036060840152612fae81856126f6565b979650505050505050565b6040815260006128876040830185612eb7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602080838503121561300e57600080fd5b823567ffffffffffffffff8082111561302657600080fd5b818501915085601f83011261303a57600080fd5b81358181111561304c5761304c612fcc565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561308f5761308f612fcc565b6040529182528482019250838101850191888311156130ad57600080fd5b938501935b828510156130d2576130c385612576565b845293850193928501926130b2565b98975050505050505050565b6104c0810161314482858051151582526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b611c58610120830184805182526020808201518184015260408083015181850152606080840151818601526080808501518187015260a0808601518188015260c0808701518189015260e08088015190890152610100808801519089015261012080880151908901526101408088015190890152610160808801519089015261018080880151908901526101a080880151908901526101c080880151908901526101e080880151908901526102009687015180519789019790975286860151805173ffffffffffffffffffffffffffffffffffffffff9081166102208b0152818801516102408b0152818701516102608b0152818601516102808b0152908401516102a08a01529685015180519097166102c0890152948601516102e08801529285015161030087015290840151610320860152830151610340850152820151610360840152015161038090910152565b6000602082840312156132a757600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361333d5761333d6132dd565b5060010190565b80820281158282048414176104dd576104dd6132dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826133c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b818103818111156104dd576104dd6132dd565b808201808211156104dd576104dd6132dd56fea26469706673582212206a1b3cbd5b38b416dabf29ce192ec09d47a7d43cd7af491938e041d6ca0cdbe064736f6c63430008150033",
"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"
},
"getAllOverallTokensData()": {
"notice": "returns general data for all `listedTokens()` such as rates, exchange prices, utilization, fee, total amounts etc."
},
"getConfigs2(address)": {
"notice": "gets configs2 packed uint256 storage slot for `token_`."
},
"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
}
}