diff --git a/contracts/capybara-finance/.openzeppelin/unknown-2008.json b/contracts/capybara-finance/.openzeppelin/unknown-2008.json index e0f5ea3e..c985438e 100644 --- a/contracts/capybara-finance/.openzeppelin/unknown-2008.json +++ b/contracts/capybara-finance/.openzeppelin/unknown-2008.json @@ -26663,6 +26663,1032 @@ ] } } + }, + "4ca4a5a8d2291738ad53994aed8bd65b2761b1d14f5a3a3d4e57c2709e60442c": { + "address": "0xCFa703Fde7578432E5B92499543992d3a7BFf54F", + "txHash": "0xa9b76b0afdc5e2e4921257e7e28252151055a41b22033a1db96281029b971922", + "layout": { + "solcVersion": "0.8.30", + "storage": [ + { + "label": "_loanIdCounter", + "offset": 0, + "slot": "0", + "type": "t_uint256", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:14" + }, + { + "label": "_programIdCounter", + "offset": 0, + "slot": "1", + "type": "t_uint32", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:17" + }, + { + "label": "_loans", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(State)17979_storage)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:20" + }, + { + "label": "_creditLineLenders", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:27" + }, + { + "label": "_liquidityPoolLenders", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:34" + }, + { + "label": "_programLenders", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint32,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:43" + }, + { + "label": "_programCreditLines", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_uint32,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:46" + }, + { + "label": "_programLiquidityPools", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint32,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:49" + }, + { + "label": "_hasAlias", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:57" + }, + { + "label": "__gap", + "offset": 0, + "slot": "9", + "type": "t_array(t_uint256)41_storage", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:63" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)387_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)938_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)550_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)377_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)41_storage": { + "label": "uint256[41]", + "numberOfBytes": "1312" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(State)17979_storage)": { + "label": "mapping(uint256 => struct Loan.State)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_address)": { + "label": "mapping(uint32 => address)", + "numberOfBytes": "32" + }, + "t_struct(State)17979_storage": { + "label": "struct Loan.State", + "members": [ + { + "label": "programId", + "type": "t_uint32", + "offset": 0, + "slot": "0" + }, + { + "label": "borrowedAmount", + "type": "t_uint64", + "offset": 4, + "slot": "0" + }, + { + "label": "addonAmount", + "type": "t_uint64", + "offset": 12, + "slot": "0" + }, + { + "label": "startTimestamp", + "type": "t_uint32", + "offset": 20, + "slot": "0" + }, + { + "label": "durationInPeriods", + "type": "t_uint32", + "offset": 24, + "slot": "0" + }, + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "borrower", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "interestRatePrimary", + "type": "t_uint32", + "offset": 20, + "slot": "2" + }, + { + "label": "interestRateSecondary", + "type": "t_uint32", + "offset": 24, + "slot": "2" + }, + { + "label": "repaidAmount", + "type": "t_uint64", + "offset": 0, + "slot": "3" + }, + { + "label": "trackedBalance", + "type": "t_uint64", + "offset": 8, + "slot": "3" + }, + { + "label": "trackedTimestamp", + "type": "t_uint32", + "offset": 16, + "slot": "3" + }, + { + "label": "freezeTimestamp", + "type": "t_uint32", + "offset": 20, + "slot": "3" + }, + { + "label": "firstInstallmentId", + "type": "t_uint40", + "offset": 24, + "slot": "3" + }, + { + "label": "installmentCount", + "type": "t_uint8", + "offset": 29, + "slot": "3" + }, + { + "label": "lateFeeAmount", + "type": "t_uint64", + "offset": 0, + "slot": "4" + }, + { + "label": "discountAmount", + "type": "t_uint64", + "offset": 8, + "slot": "4" + }, + { + "label": "penaltyInterestRate", + "type": "t_uint32", + "offset": 16, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\utils\\PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "295c6dfc8681685a76cfb528870e23ecd539248f4c13a6f5090a23423e472c71": { + "address": "0x15C6f59BF53f8A973d4118a208aa5375150554e4", + "txHash": "0xde43c8f4459ca65f93961efff58c46dc4cd030aea511020654705f8025be5d44", + "layout": { + "solcVersion": "0.8.30", + "storage": [ + { + "label": "_token", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:14" + }, + { + "label": "_market", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:17" + }, + { + "label": "_config", + "offset": 0, + "slot": "2", + "type": "t_struct(CreditLineConfig)16407_storage", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:20" + }, + { + "label": "_borrowerConfigs", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(BorrowerConfig)16435_storage)", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:23" + }, + { + "label": "_borrowerStates", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(BorrowerState)16468_storage)", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:26" + }, + { + "label": "__gap", + "offset": 0, + "slot": "6", + "type": "t_array(t_uint256)45_storage", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:32" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)387_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)938_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)550_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)377_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_enum(BorrowingPolicy)16375": { + "label": "enum ICreditLineTypes.BorrowingPolicy", + "members": [ + "SingleActiveLoan", + "MultipleActiveLoans", + "TotalActiveAmountLimit" + ], + "numberOfBytes": "1" + }, + "t_enum(LateFeePolicy)16379": { + "label": "enum ICreditLineTypes.LateFeePolicy", + "members": [ + "Common", + "Individual" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_struct(BorrowerConfig)16435_storage)": { + "label": "mapping(address => struct ICreditLineTypes.BorrowerConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(BorrowerState)16468_storage)": { + "label": "mapping(address => struct ICreditLineTypes.BorrowerState)", + "numberOfBytes": "32" + }, + "t_struct(BorrowerConfig)16435_storage": { + "label": "struct ICreditLineTypes.BorrowerConfig", + "members": [ + { + "label": "expiration", + "type": "t_uint32", + "offset": 0, + "slot": "0" + }, + { + "label": "minDurationInPeriods", + "type": "t_uint32", + "offset": 4, + "slot": "0" + }, + { + "label": "maxDurationInPeriods", + "type": "t_uint32", + "offset": 8, + "slot": "0" + }, + { + "label": "minBorrowedAmount", + "type": "t_uint64", + "offset": 12, + "slot": "0" + }, + { + "label": "maxBorrowedAmount", + "type": "t_uint64", + "offset": 20, + "slot": "0" + }, + { + "label": "borrowingPolicy", + "type": "t_enum(BorrowingPolicy)16375", + "offset": 28, + "slot": "0" + }, + { + "label": "interestRatePrimary", + "type": "t_uint32", + "offset": 0, + "slot": "1" + }, + { + "label": "interestRateSecondary", + "type": "t_uint32", + "offset": 4, + "slot": "1" + }, + { + "label": "addonFixedRate", + "type": "t_uint32", + "offset": 8, + "slot": "1" + }, + { + "label": "addonPeriodRate", + "type": "t_uint32", + "offset": 12, + "slot": "1" + }, + { + "label": "lateFeePolicy", + "type": "t_enum(LateFeePolicy)16379", + "offset": 16, + "slot": "1" + }, + { + "label": "lateFeeRate", + "type": "t_uint32", + "offset": 17, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(BorrowerState)16468_storage": { + "label": "struct ICreditLineTypes.BorrowerState", + "members": [ + { + "label": "activeLoanCount", + "type": "t_uint16", + "offset": 0, + "slot": "0" + }, + { + "label": "closedLoanCount", + "type": "t_uint16", + "offset": 2, + "slot": "0" + }, + { + "label": "totalActiveLoanAmount", + "type": "t_uint64", + "offset": 4, + "slot": "0" + }, + { + "label": "totalClosedLoanAmount", + "type": "t_uint64", + "offset": 12, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(CreditLineConfig)16407_storage": { + "label": "struct ICreditLineTypes.CreditLineConfig", + "members": [ + { + "label": "minBorrowedAmount", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "maxBorrowedAmount", + "type": "t_uint64", + "offset": 8, + "slot": "0" + }, + { + "label": "minInterestRatePrimary", + "type": "t_uint32", + "offset": 16, + "slot": "0" + }, + { + "label": "maxInterestRatePrimary", + "type": "t_uint32", + "offset": 20, + "slot": "0" + }, + { + "label": "minInterestRateSecondary", + "type": "t_uint32", + "offset": 24, + "slot": "0" + }, + { + "label": "maxInterestRateSecondary", + "type": "t_uint32", + "offset": 28, + "slot": "0" + }, + { + "label": "minDurationInPeriods", + "type": "t_uint32", + "offset": 0, + "slot": "1" + }, + { + "label": "maxDurationInPeriods", + "type": "t_uint32", + "offset": 4, + "slot": "1" + }, + { + "label": "minAddonFixedRate", + "type": "t_uint32", + "offset": 8, + "slot": "1" + }, + { + "label": "maxAddonFixedRate", + "type": "t_uint32", + "offset": 12, + "slot": "1" + }, + { + "label": "minAddonPeriodRate", + "type": "t_uint32", + "offset": 16, + "slot": "1" + }, + { + "label": "maxAddonPeriodRate", + "type": "t_uint32", + "offset": 20, + "slot": "1" + }, + { + "label": "lateFeeRate", + "type": "t_uint32", + "offset": 24, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\utils\\PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "aef7cd991289f7c82fbff1308277d759bd0fc4619c366bc34101c50f868f938b": { + "address": "0x23902F7eba39B57516D872a724490b6232A29200", + "txHash": "0xba94b32f4bcaf4cc4e1863612cbfa59e2fb9f738c3129d5ebfecb0d422fb38de", + "layout": { + "solcVersion": "0.8.30", + "storage": [ + { + "label": "_token", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:14" + }, + { + "label": "_market", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:20" + }, + { + "label": "_borrowableBalance", + "offset": 20, + "slot": "1", + "type": "t_uint64", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:30" + }, + { + "label": "_addonsBalance", + "offset": 0, + "slot": "2", + "type": "t_uint64", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:39" + }, + { + "label": "_addonTreasury", + "offset": 8, + "slot": "2", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:48" + }, + { + "label": "_operationalTreasury", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:55" + }, + { + "label": "_workingTreasures", + "offset": 0, + "slot": "4", + "type": "t_struct(AddressSet)8796_storage", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:62" + }, + { + "label": "__gap", + "offset": 0, + "slot": "6", + "type": "t_array(t_uint256)43_storage", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:68" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)387_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)938_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)550_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)377_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)43_storage": { + "label": "uint256[43]", + "numberOfBytes": "1376" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)8796_storage": { + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)8310_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)8310_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_positions", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\utils\\PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } } } } diff --git a/contracts/capybara-finance/.openzeppelin/unknown-2009.json b/contracts/capybara-finance/.openzeppelin/unknown-2009.json index 72587a8f..d3b868cc 100644 --- a/contracts/capybara-finance/.openzeppelin/unknown-2009.json +++ b/contracts/capybara-finance/.openzeppelin/unknown-2009.json @@ -27136,7 +27136,7 @@ "label": "_workingTreasures", "offset": 0, "slot": "4", - "type": "t_struct(AddressSet)9314_storage", + "type": "t_struct(AddressSet)9500_storage", "contract": "LiquidityPoolStorage", "src": "contracts\\LiquidityPoolStorage.sol:62" }, @@ -27166,23 +27166,23 @@ "label": "mapping(address => bool)", "numberOfBytes": "32" }, - "t_mapping(t_bytes32,t_struct(RoleData)233_storage)": { + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", "numberOfBytes": "32" }, - "t_struct(AccessControlStorage)243_storage": { + "t_struct(AccessControlStorage)387_storage": { "label": "struct AccessControlUpgradeable.AccessControlStorage", "members": [ { "label": "_roles", - "type": "t_mapping(t_bytes32,t_struct(RoleData)233_storage)", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", "offset": 0, "slot": "0" } ], "numberOfBytes": "32" }, - "t_struct(InitializableStorage)865_storage": { + "t_struct(InitializableStorage)1005_storage": { "label": "struct Initializable.InitializableStorage", "members": [ { @@ -27200,7 +27200,7 @@ ], "numberOfBytes": "32" }, - "t_struct(PausableStorage)406_storage": { + "t_struct(PausableStorage)546_storage": { "label": "struct PausableUpgradeable.PausableStorage", "members": [ { @@ -27212,7 +27212,7 @@ ], "numberOfBytes": "32" }, - "t_struct(RoleData)233_storage": { + "t_struct(RoleData)377_storage": { "label": "struct AccessControlUpgradeable.RoleData", "members": [ { @@ -27246,19 +27246,19 @@ "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32" }, - "t_struct(AddressSet)9314_storage": { + "t_struct(AddressSet)9500_storage": { "label": "struct EnumerableSet.AddressSet", "members": [ { "label": "_inner", - "type": "t_struct(Set)8828_storage", + "type": "t_struct(Set)9014_storage", "offset": 0, "slot": "0" } ], "numberOfBytes": "64" }, - "t_struct(Set)8828_storage": { + "t_struct(Set)9014_storage": { "label": "struct EnumerableSet.Set", "members": [ { @@ -27296,7 +27296,1033 @@ { "contract": "AccessControlUpgradeable", "label": "_roles", - "type": "t_mapping(t_bytes32,t_struct(RoleData)233_storage)", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "4ca4a5a8d2291738ad53994aed8bd65b2761b1d14f5a3a3d4e57c2709e60442c": { + "address": "0xa1131fB7B27fdDD7D6Fc3F15090856Cdf39ac1D2", + "txHash": "0x622ff1a42435cec41462b17af6bfdfae213144024b85c597aa483a821ae21afb", + "layout": { + "solcVersion": "0.8.30", + "storage": [ + { + "label": "_loanIdCounter", + "offset": 0, + "slot": "0", + "type": "t_uint256", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:14" + }, + { + "label": "_programIdCounter", + "offset": 0, + "slot": "1", + "type": "t_uint32", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:17" + }, + { + "label": "_loans", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(State)17979_storage)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:20" + }, + { + "label": "_creditLineLenders", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:27" + }, + { + "label": "_liquidityPoolLenders", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:34" + }, + { + "label": "_programLenders", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint32,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:43" + }, + { + "label": "_programCreditLines", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_uint32,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:46" + }, + { + "label": "_programLiquidityPools", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint32,t_address)", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:49" + }, + { + "label": "_hasAlias", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:57" + }, + { + "label": "__gap", + "offset": 0, + "slot": "9", + "type": "t_array(t_uint256)41_storage", + "contract": "LendingMarketStorage", + "src": "contracts\\LendingMarketStorage.sol:63" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)387_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)938_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)550_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)377_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)41_storage": { + "label": "uint256[41]", + "numberOfBytes": "1312" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(State)17979_storage)": { + "label": "mapping(uint256 => struct Loan.State)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_address)": { + "label": "mapping(uint32 => address)", + "numberOfBytes": "32" + }, + "t_struct(State)17979_storage": { + "label": "struct Loan.State", + "members": [ + { + "label": "programId", + "type": "t_uint32", + "offset": 0, + "slot": "0" + }, + { + "label": "borrowedAmount", + "type": "t_uint64", + "offset": 4, + "slot": "0" + }, + { + "label": "addonAmount", + "type": "t_uint64", + "offset": 12, + "slot": "0" + }, + { + "label": "startTimestamp", + "type": "t_uint32", + "offset": 20, + "slot": "0" + }, + { + "label": "durationInPeriods", + "type": "t_uint32", + "offset": 24, + "slot": "0" + }, + { + "label": "token", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "borrower", + "type": "t_address", + "offset": 0, + "slot": "2" + }, + { + "label": "interestRatePrimary", + "type": "t_uint32", + "offset": 20, + "slot": "2" + }, + { + "label": "interestRateSecondary", + "type": "t_uint32", + "offset": 24, + "slot": "2" + }, + { + "label": "repaidAmount", + "type": "t_uint64", + "offset": 0, + "slot": "3" + }, + { + "label": "trackedBalance", + "type": "t_uint64", + "offset": 8, + "slot": "3" + }, + { + "label": "trackedTimestamp", + "type": "t_uint32", + "offset": 16, + "slot": "3" + }, + { + "label": "freezeTimestamp", + "type": "t_uint32", + "offset": 20, + "slot": "3" + }, + { + "label": "firstInstallmentId", + "type": "t_uint40", + "offset": 24, + "slot": "3" + }, + { + "label": "installmentCount", + "type": "t_uint8", + "offset": 29, + "slot": "3" + }, + { + "label": "lateFeeAmount", + "type": "t_uint64", + "offset": 0, + "slot": "4" + }, + { + "label": "discountAmount", + "type": "t_uint64", + "offset": 8, + "slot": "4" + }, + { + "label": "penaltyInterestRate", + "type": "t_uint32", + "offset": 16, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint40": { + "label": "uint40", + "numberOfBytes": "5" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\utils\\PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "295c6dfc8681685a76cfb528870e23ecd539248f4c13a6f5090a23423e472c71": { + "address": "0x66185d8f36b440089A591e7696A5bd58a5b7cc46", + "txHash": "0x6bdbfe5c2cc686516072e7ceb2717dfd7bf87b7dd1c56d791c939c75c1d38888", + "layout": { + "solcVersion": "0.8.30", + "storage": [ + { + "label": "_token", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:14" + }, + { + "label": "_market", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:17" + }, + { + "label": "_config", + "offset": 0, + "slot": "2", + "type": "t_struct(CreditLineConfig)16407_storage", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:20" + }, + { + "label": "_borrowerConfigs", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_address,t_struct(BorrowerConfig)16435_storage)", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:23" + }, + { + "label": "_borrowerStates", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_struct(BorrowerState)16468_storage)", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:26" + }, + { + "label": "__gap", + "offset": 0, + "slot": "6", + "type": "t_array(t_uint256)45_storage", + "contract": "CreditLineStorage", + "src": "contracts\\CreditLineStorage.sol:32" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)387_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)938_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)550_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)377_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_enum(BorrowingPolicy)16375": { + "label": "enum ICreditLineTypes.BorrowingPolicy", + "members": [ + "SingleActiveLoan", + "MultipleActiveLoans", + "TotalActiveAmountLimit" + ], + "numberOfBytes": "1" + }, + "t_enum(LateFeePolicy)16379": { + "label": "enum ICreditLineTypes.LateFeePolicy", + "members": [ + "Common", + "Individual" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_struct(BorrowerConfig)16435_storage)": { + "label": "mapping(address => struct ICreditLineTypes.BorrowerConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(BorrowerState)16468_storage)": { + "label": "mapping(address => struct ICreditLineTypes.BorrowerState)", + "numberOfBytes": "32" + }, + "t_struct(BorrowerConfig)16435_storage": { + "label": "struct ICreditLineTypes.BorrowerConfig", + "members": [ + { + "label": "expiration", + "type": "t_uint32", + "offset": 0, + "slot": "0" + }, + { + "label": "minDurationInPeriods", + "type": "t_uint32", + "offset": 4, + "slot": "0" + }, + { + "label": "maxDurationInPeriods", + "type": "t_uint32", + "offset": 8, + "slot": "0" + }, + { + "label": "minBorrowedAmount", + "type": "t_uint64", + "offset": 12, + "slot": "0" + }, + { + "label": "maxBorrowedAmount", + "type": "t_uint64", + "offset": 20, + "slot": "0" + }, + { + "label": "borrowingPolicy", + "type": "t_enum(BorrowingPolicy)16375", + "offset": 28, + "slot": "0" + }, + { + "label": "interestRatePrimary", + "type": "t_uint32", + "offset": 0, + "slot": "1" + }, + { + "label": "interestRateSecondary", + "type": "t_uint32", + "offset": 4, + "slot": "1" + }, + { + "label": "addonFixedRate", + "type": "t_uint32", + "offset": 8, + "slot": "1" + }, + { + "label": "addonPeriodRate", + "type": "t_uint32", + "offset": 12, + "slot": "1" + }, + { + "label": "lateFeePolicy", + "type": "t_enum(LateFeePolicy)16379", + "offset": 16, + "slot": "1" + }, + { + "label": "lateFeeRate", + "type": "t_uint32", + "offset": 17, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(BorrowerState)16468_storage": { + "label": "struct ICreditLineTypes.BorrowerState", + "members": [ + { + "label": "activeLoanCount", + "type": "t_uint16", + "offset": 0, + "slot": "0" + }, + { + "label": "closedLoanCount", + "type": "t_uint16", + "offset": 2, + "slot": "0" + }, + { + "label": "totalActiveLoanAmount", + "type": "t_uint64", + "offset": 4, + "slot": "0" + }, + { + "label": "totalClosedLoanAmount", + "type": "t_uint64", + "offset": 12, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(CreditLineConfig)16407_storage": { + "label": "struct ICreditLineTypes.CreditLineConfig", + "members": [ + { + "label": "minBorrowedAmount", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "maxBorrowedAmount", + "type": "t_uint64", + "offset": 8, + "slot": "0" + }, + { + "label": "minInterestRatePrimary", + "type": "t_uint32", + "offset": 16, + "slot": "0" + }, + { + "label": "maxInterestRatePrimary", + "type": "t_uint32", + "offset": 20, + "slot": "0" + }, + { + "label": "minInterestRateSecondary", + "type": "t_uint32", + "offset": 24, + "slot": "0" + }, + { + "label": "maxInterestRateSecondary", + "type": "t_uint32", + "offset": 28, + "slot": "0" + }, + { + "label": "minDurationInPeriods", + "type": "t_uint32", + "offset": 0, + "slot": "1" + }, + { + "label": "maxDurationInPeriods", + "type": "t_uint32", + "offset": 4, + "slot": "1" + }, + { + "label": "minAddonFixedRate", + "type": "t_uint32", + "offset": 8, + "slot": "1" + }, + { + "label": "maxAddonFixedRate", + "type": "t_uint32", + "offset": 12, + "slot": "1" + }, + { + "label": "minAddonPeriodRate", + "type": "t_uint32", + "offset": 16, + "slot": "1" + }, + { + "label": "maxAddonPeriodRate", + "type": "t_uint32", + "offset": 20, + "slot": "1" + }, + { + "label": "lateFeeRate", + "type": "t_uint32", + "offset": 24, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\utils\\PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.Initializable": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_uint64", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:69", + "offset": 0, + "slot": "0" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin\\contracts\\proxy\\utils\\Initializable.sol:73", + "offset": 8, + "slot": "0" + } + ] + } + } + }, + "aef7cd991289f7c82fbff1308277d759bd0fc4619c366bc34101c50f868f938b": { + "address": "0xB13BbEcbF6199C226d92F5A0E81D1F9c638530E9", + "txHash": "0x0aacec33341ec50665b15d924b5370c744760464e66c4b8fc1d58e62087eb17f", + "layout": { + "solcVersion": "0.8.30", + "storage": [ + { + "label": "_token", + "offset": 0, + "slot": "0", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:14" + }, + { + "label": "_market", + "offset": 0, + "slot": "1", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:20" + }, + { + "label": "_borrowableBalance", + "offset": 20, + "slot": "1", + "type": "t_uint64", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:30" + }, + { + "label": "_addonsBalance", + "offset": 0, + "slot": "2", + "type": "t_uint64", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:39" + }, + { + "label": "_addonTreasury", + "offset": 8, + "slot": "2", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:48" + }, + { + "label": "_operationalTreasury", + "offset": 0, + "slot": "3", + "type": "t_address", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:55" + }, + { + "label": "_workingTreasures", + "offset": 0, + "slot": "4", + "type": "t_struct(AddressSet)8796_storage", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:62" + }, + { + "label": "__gap", + "offset": 0, + "slot": "6", + "type": "t_array(t_uint256)43_storage", + "contract": "LiquidityPoolStorage", + "src": "contracts\\LiquidityPoolStorage.sol:68" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)377_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(AccessControlStorage)387_storage": { + "label": "struct AccessControlUpgradeable.AccessControlStorage", + "members": [ + { + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(InitializableStorage)938_storage": { + "label": "struct Initializable.InitializableStorage", + "members": [ + { + "label": "_initialized", + "type": "t_uint64", + "offset": 0, + "slot": "0" + }, + { + "label": "_initializing", + "type": "t_bool", + "offset": 8, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(PausableStorage)550_storage": { + "label": "struct PausableUpgradeable.PausableStorage", + "members": [ + { + "label": "_paused", + "type": "t_bool", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)377_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "hasRole", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)43_storage": { + "label": "uint256[43]", + "numberOfBytes": "1376" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)8796_storage": { + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)8310_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)8310_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_positions", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + } + }, + "namespaces": { + "erc7201:openzeppelin.storage.Pausable": [ + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin\\contracts-upgradeable\\utils\\PausableUpgradeable.sol:21", + "offset": 0, + "slot": "0" + } + ], + "erc7201:openzeppelin.storage.AccessControl": [ + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)377_storage)", "src": "@openzeppelin\\contracts-upgradeable\\access\\AccessControlUpgradeable.sol:62", "offset": 0, "slot": "0" diff --git a/contracts/capybara-finance/CHANGELOG.md b/contracts/capybara-finance/CHANGELOG.md index 79de9264..e0c9affd 100644 --- a/contracts/capybara-finance/CHANGELOG.md +++ b/contracts/capybara-finance/CHANGELOG.md @@ -1,4 +1,15 @@ -# Unreleased +# v1.24.0 + +## Main Changes + +Fixed the `_revokeLoan()` internal function to skip the `onAfterLoanRevocation()` credit line hook for already repaid loans (where `trackedBalance == 0`). Previously, revoking an installment loan that contained fully repaid sub-loans would still call the credit line hook for those sub-loans, incorrectly decrementing the borrower's `activeLoanCount` and `totalActiveLoanAmount` in the credit line state. Now the hook is only called for sub-loans that have an outstanding balance at the time of revocation. + +## Migration + +1. No special actions required, just upgrade the deployed `CapybaraFinance` smart-contracts. +2. To be sure there are no broken borrower states on existing credit lines, you can check all the cases of loan revocation through the block explorer database. Only installment loan revocation cases should be checked through event `InstallmentLoanRevoked` because fully repaid ordinary loans cannot be revoked. The installment loans with a single installment can be skipped as well. + +# v1.23.1 ## Main Changes diff --git a/contracts/capybara-finance/contracts/LendingMarket.sol b/contracts/capybara-finance/contracts/LendingMarket.sol index 08abbd9a..496dd895 100644 --- a/contracts/capybara-finance/contracts/LendingMarket.sol +++ b/contracts/capybara-finance/contracts/LendingMarket.sol @@ -774,11 +774,14 @@ contract LendingMarket is */ function _revokeLoan(uint256 loanId, Loan.State storage loan) internal { address creditLine = _programCreditLines[loan.programId]; + bool isLoanRepaid = _isRepaid(loan); loan.trackedBalance = 0; loan.trackedTimestamp = _blockTimestamp().toUint32(); - ICreditLine(creditLine).onAfterLoanRevocation(loanId); + if (!isLoanRepaid) { + ICreditLine(creditLine).onAfterLoanRevocation(loanId); + } emit LoanRevoked(loanId); } diff --git a/contracts/capybara-finance/contracts/Versionable.sol b/contracts/capybara-finance/contracts/Versionable.sol index 50104714..0df891ea 100644 --- a/contracts/capybara-finance/contracts/Versionable.sol +++ b/contracts/capybara-finance/contracts/Versionable.sol @@ -12,6 +12,6 @@ import { IVersionable } from "@cloudwalk/brlc-base/interfaces/IVersionable.sol"; abstract contract Versionable is IVersionable { /// @inheritdoc IVersionable function $__VERSION() external pure returns (Version memory) { - return Version(1, 23, 0); + return Version(1, 24, 0); } } diff --git a/contracts/capybara-finance/test-utils/specific.ts b/contracts/capybara-finance/test-utils/specific.ts index 6ea9c6b1..403bfe99 100644 --- a/contracts/capybara-finance/test-utils/specific.ts +++ b/contracts/capybara-finance/test-utils/specific.ts @@ -8,6 +8,6 @@ export interface Version { export const EXPECTED_VERSION: Version = { major: 1, - minor: 23, + minor: 24, patch: 0, }; diff --git a/contracts/capybara-finance/test/LendingMarket.base.test.ts b/contracts/capybara-finance/test/LendingMarket.base.test.ts index 6c602d67..b9d6e3ee 100644 --- a/contracts/capybara-finance/test/LendingMarket.base.test.ts +++ b/contracts/capybara-finance/test/LendingMarket.base.test.ts @@ -4741,6 +4741,8 @@ describe("Contract 'LendingMarket': base tests", () => { const { market, installmentLoanParts: loans } = fixture; const loanIds = loans.map(loan => loan.id); const expectedLoans = props.loans.map(loan => clone(loan)); + const loanRepaidStatesBeforeRevocation = expectedLoans.map(loan => loan.state.trackedBalance == 0); + const areAllLoansRepaidBeforeRevocation = loanRepaidStatesBeforeRevocation.every(isRepaid => isRepaid); const borrowerBalanceChange = expectedLoans .map(loan => loan.state.repaidAmount - loan.state.borrowedAmount) .reduce((sum, amount) => sum + amount); @@ -4756,19 +4758,23 @@ describe("Contract 'LendingMarket': base tests", () => { const revocationTimestamp = calculateTimestampWithOffset(await getTxTimestamp(tx)); const actualLoanStates = await getLoanStates(market, loanIds); - expectedLoans.forEach((loan) => { - loan.state.trackedBalance = 0; - loan.state.trackedTimestamp = revocationTimestamp; - }); for (let i = 0; i < loanIds.length; ++i) { const loanId = loanIds[i]; - await expect(tx).to.emit(market, EVENT_NAME_LOAN_REVOKED).withArgs(loanId); + const loan = expectedLoans[i]; + loan.state.trackedBalance = 0; + loan.state.trackedTimestamp = revocationTimestamp; checkEquality(actualLoanStates[i], expectedLoans[i].state, i); + await expect(tx).to.emit(market, EVENT_NAME_LOAN_REVOKED).withArgs(loanId); // Check hook calls - await expect(tx).to.emit(creditLine, EVENT_NAME_ON_AFTER_LOAN_REVOCATION_CALLED).withArgs(loanId); + if (!loanRepaidStatesBeforeRevocation[i]) { + await expect(tx).to.emit(creditLine, EVENT_NAME_ON_AFTER_LOAN_REVOCATION_CALLED).withArgs(loanId); + } } await expect(tx).to.emit(market, EVENT_NAME_INSTALLMENT_LOAN_REVOKED).withArgs(loanIds[0], loanIds.length); + if (areAllLoansRepaidBeforeRevocation) { + await expect(tx).not.to.emit(creditLine, EVENT_NAME_ON_AFTER_LOAN_REVOCATION_CALLED); + } const totalAddonAmount = expectedLoans .map(loan => loan.state.addonAmount) diff --git a/contracts/capybara-finance/test/LendingMarket.complex.test.ts b/contracts/capybara-finance/test/LendingMarket.complex.test.ts index 62ca59d8..dcc9b273 100644 --- a/contracts/capybara-finance/test/LendingMarket.complex.test.ts +++ b/contracts/capybara-finance/test/LendingMarket.complex.test.ts @@ -524,7 +524,7 @@ describe("Contract 'LendingMarket': complex tests", () => { } async function executeAndCheckLoanRevocationForScenario(context: TestScenarioContext) { - const { token, lendingMarket, liquidityPool } = context.fixture as Fixture; + const { token, lendingMarket, liquidityPool, creditLine } = context.fixture as Fixture; const scenario = context.scenario; const loanState = await lendingMarket.getLoanState(context.loanId); const refundAmount = Number(loanState.repaidAmount) - scenario.borrowedAmount; @@ -541,9 +541,12 @@ describe("Contract 'LendingMarket': complex tests", () => { ); const liquidityPoolBalancesAfter = await liquidityPool.getBalances(); + const borrowerStateAfter = await creditLine.getBorrowerState(borrower.address); expect(liquidityPoolBalancesAfter[0]) .to.eq(Number(liquidityPoolBalancesBefore[0]) - refundAmount + scenario.addonAmount); expect(liquidityPoolBalancesAfter[1]).to.eq(0); // The addonsBalance must be zero because addonTreasury != 0 + expect(borrowerStateAfter.activeLoanCount).to.eq(0); + expect(borrowerStateAfter.totalActiveLoanAmount).to.eq(0); await checkLoanRepaidAmountForScenario(context); await checkLoanClosedState(lendingMarket, context.loanId);