From fd415685ac4deb058a47606cd5e762ed7d10c489 Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 16:16:17 +0700 Subject: [PATCH 1/7] docs: fix the changelog at the previous version --- contracts/capybara-finance/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/capybara-finance/CHANGELOG.md b/contracts/capybara-finance/CHANGELOG.md index 79de9264..14fb8ec8 100644 --- a/contracts/capybara-finance/CHANGELOG.md +++ b/contracts/capybara-finance/CHANGELOG.md @@ -1,4 +1,4 @@ -# Unreleased +# v1.23.1 ## Main Changes From bd8cfb2b104edf5aace5cc6aa047dda9a3ff6128 Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 19:21:48 +0700 Subject: [PATCH 2/7] fix: skip the revocation hook on credit lines for already repaid loans --- .../contracts/LendingMarket.sol | 5 ++++- .../test/LendingMarket.base.test.ts | 18 ++++++++++++------ .../test/LendingMarket.complex.test.ts | 5 ++++- 3 files changed, 20 insertions(+), 8 deletions(-) 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/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); From 996d1c94dbe89ea8831847a54d7eef387d2db02b Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 19:48:01 +0700 Subject: [PATCH 3/7] feat: bump the smart contract version v1.23.0 => v1.24.0 --- contracts/capybara-finance/contracts/Versionable.sol | 2 +- contracts/capybara-finance/test-utils/specific.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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, }; From d06d8ff0bfc197731910535d78620f25eda021f1 Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 19:48:16 +0700 Subject: [PATCH 4/7] docs: update the changelog --- contracts/capybara-finance/CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/contracts/capybara-finance/CHANGELOG.md b/contracts/capybara-finance/CHANGELOG.md index 14fb8ec8..b4dff159 100644 --- a/contracts/capybara-finance/CHANGELOG.md +++ b/contracts/capybara-finance/CHANGELOG.md @@ -1,3 +1,14 @@ +# 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. + # v1.23.1 ## Main Changes From 1dfcb295e4d33cc15e130b21b2a6b9b0b89d8247 Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 20:18:19 +0700 Subject: [PATCH 5/7] docs: tweak the changelog a bit more --- contracts/capybara-finance/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/capybara-finance/CHANGELOG.md b/contracts/capybara-finance/CHANGELOG.md index b4dff159..e0c9affd 100644 --- a/contracts/capybara-finance/CHANGELOG.md +++ b/contracts/capybara-finance/CHANGELOG.md @@ -7,7 +7,7 @@ Fixed the `_revokeLoan()` internal function to skip the `onAfterLoanRevocation() ## 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. +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 From 1cdcb0adcc1986d5a1483dd241cf1d87154394db Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 22:35:55 +0700 Subject: [PATCH 6/7] build: upgrade smart contracts in Testnet --- .../.openzeppelin/unknown-2008.json | 1026 +++++++++++++++++ 1 file changed, 1026 insertions(+) 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" + } + ] + } + } } } } From 81fcb1832282370a41fd9a2a69ba4a14d87d5345 Mon Sep 17 00:00:00 2001 From: Evgenii Zaitsev Date: Thu, 26 Feb 2026 22:37:25 +0700 Subject: [PATCH 7/7] build: prepare the upgrade of smart contracts in Mainnet --- .../.openzeppelin/unknown-2009.json | 1048 ++++++++++++++++- 1 file changed, 1037 insertions(+), 11 deletions(-) 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"