From d7f46e4fcd7fbcd3e050c86ec03353a4aec9a09b Mon Sep 17 00:00:00 2001 From: Xiaozhou Li Date: Fri, 8 May 2026 11:09:23 -0700 Subject: [PATCH 1/2] ledgerlib minor reorg --- docs/contracts.md | 38 ++++++----- script/README.md | 15 ++--- src/CelerLedger.sol | 29 +++++---- src/CelerLedgerMock.sol | 1 - src/interfaces/ICelerLedger.sol | 10 +-- src/lib/ledgerlib/LedgerBalanceLimit.sol | 64 ------------------- src/lib/ledgerlib/LedgerOperation.sol | 27 -------- test/gas_logs/CelerLedger-ERC20.txt | 10 +-- test/gas_logs/CelerLedger-ETH.txt | 38 +++++------ test/gas_logs/fine_granularity/ClearPays.txt | 12 ++-- .../fine_granularity/DepositEthInBatch.txt | 12 ++-- .../IntendSettle-OneState.txt | 14 ++-- 12 files changed, 93 insertions(+), 177 deletions(-) delete mode 100644 src/lib/ledgerlib/LedgerBalanceLimit.sol diff --git a/docs/contracts.md b/docs/contracts.md index d98c708..8cfcf13 100644 --- a/docs/contracts.md +++ b/docs/contracts.md @@ -101,9 +101,10 @@ chains. [Source](../src/CelerLedger.sol) · [Interface](../src/interfaces/ICelerLedger.sol) · **Versioned** -The channel state machine and primary user entry point. The contract itself is a thin -wrapper — the actual logic is split across five libraries under -[`src/lib/ledgerlib/`](../src/lib/ledgerlib/) and attached via `using ... for ...`. See +The channel state machine and primary user entry point. The contract is a thin +facade — the bulk of channel logic is split across three libraries under +[`src/lib/ledgerlib/`](../src/lib/ledgerlib/) and attached via `using ... for ...`, +with the type-only `LedgerStruct` namespace alongside them. See [Ledger libraries](#ledger-libraries) below. > **Supported tokens:** native (e.g. ETH) and plain ERC-20 only — see the same @@ -330,38 +331,43 @@ refresh. ## Ledger libraries -`CelerLedger.sol` is intentionally thin. The actual channel logic lives in five +`CelerLedger.sol` is intentionally thin. The bulk of channel logic lives in three libraries under [`src/lib/ledgerlib/`](../src/lib/ledgerlib/), attached to `CelerLedger` -via `using ... for ...`: +via `using ... for ...`. A fourth file, `LedgerStruct.sol`, holds shared types but +compiles to no bytecode (no functions). | Library | Responsibility | |---|---| -| [`LedgerStruct`](../src/lib/ledgerlib/LedgerStruct.sol) | All shared structs and the `ChannelStatus` enum. No logic. | +| [`LedgerStruct`](../src/lib/ledgerlib/LedgerStruct.sol) | All shared structs and the `ChannelStatus` enum. No logic; type-only namespace. | | [`LedgerOperation`](../src/lib/ledgerlib/LedgerOperation.sol) | Open / deposit / withdraw / settle / snapshot — the bulk of the user-facing flows. | -| [`LedgerChannel`](../src/lib/ledgerlib/LedgerChannel.sol) | View functions and channel-state derivations (balance maps, peer state, withdraw intent, etc.). | +| [`LedgerChannel`](../src/lib/ledgerlib/LedgerChannel.sol) | Channel-scoped view functions and state derivations (balance maps, peer state, withdraw intent, etc.). Operates on `LedgerStruct.Channel`. | | [`LedgerMigrate`](../src/lib/ledgerlib/LedgerMigrate.sol) | `migrateChannelFrom` / `migrateChannelTo` — peer-controlled version migration. | -| [`LedgerBalanceLimit`](../src/lib/ledgerlib/LedgerBalanceLimit.sol) | Per-token per-channel deposit caps (gate enabled by default). | **When debugging or extending channel behavior, the implementation almost always lives in one of these libraries — not in `CelerLedger.sol`.** +Balance-limit admin (`setBalanceLimits` / `disableBalanceLimits` / `enableBalanceLimits` / +`getBalanceLimit` / `getBalanceLimitsEnabled`) and ledger-wide config getters +(`getNativeWrap` / `getPayRegistry` / `getCelerWallet`) live **directly on +`CelerLedger`** rather than in a library. They're pure storage reads / writes — going +through a library would only add a DELEGATECALL hop with no logic benefit. + ### Why split into libraries? The split is **forced by the EIP-170 deployed-bytecode limit (24,576 bytes)**. The -hot-path library `LedgerOperation` alone is currently ~20.7 KB, leaving only ~3.8 KB -of headroom; merging the rest back into a single `CelerLedger` contract would total -~39.5 KB and fail to deploy. +hot-path library `LedgerOperation` alone is ~20.5 KB, leaving only ~4.0 KB of +headroom; merging the rest back into a single `CelerLedger` contract would total +~37.9 KB and fail to deploy. | Component | Deployed size | % of 24,576 budget | |---|---:|---:| -| `LedgerOperation` | ~20.7 KB | 84% | -| `CelerLedger` (facade only) | ~8.9 KB | 36% | +| `LedgerOperation` | ~20.5 KB | 84% | +| `CelerLedger` (facade + balance-limit admin + config getters) | ~8.4 KB | 34% | | `LedgerMigrate` | ~5.2 KB | 21% | | `LedgerChannel` | ~3.8 KB | 15% | -| `LedgerBalanceLimit` | ~0.9 KB | 4% | -The split-by-responsibility above also keeps cold paths (migration, balance limits) -out of the hot path's bytecode budget. +The split-by-responsibility above also keeps the cold migration path out of the hot +path's bytecode budget. ### How the libraries work mechanically diff --git a/script/README.md b/script/README.md index 92f6d08..d0c0f82 100644 --- a/script/README.md +++ b/script/README.md @@ -16,13 +16,13 @@ existing core without touching the asset-custody contracts. | Script | Deploys | Lifecycle | |---|---|---| | [`DeployCore.s.sol`](DeployCore.s.sol) | `PayRegistry`, `VirtContractResolver`, `CelerWallet` | Once per network. Permanent — never redeployed. | -| [`DeployLedger.s.sol`](DeployLedger.s.sol) | `CelerLedger` (+ 4 ledger libraries; see below) | Versioned. Run again for each new ledger version; peers cooperatively migrate. | +| [`DeployLedger.s.sol`](DeployLedger.s.sol) | `CelerLedger` (+ 3 ledger libraries; see below) | Versioned. Run again for each new ledger version; peers cooperatively migrate. | | [`DeployPayResolver.s.sol`](DeployPayResolver.s.sol) | `PayResolver` | Versioned per-payment. Run when adding a new resolver. | | [`DeployRouterRegistry.s.sol`](DeployRouterRegistry.s.sol) | `RouterRegistry` | Optional. Independent of the channel graph. | ## How the libraries are deployed -`CelerLedger` is split across five Solidity `library` contracts under +`CelerLedger` is split across three Solidity `library` contracts under [`src/lib/ledgerlib/`](../src/lib/ledgerlib/) (forced by EIP-170's 24,576-byte deployed-bytecode limit — see [`docs/contracts.md` § Why split into libraries?](../docs/contracts.md#why-split-into-libraries)). @@ -39,9 +39,8 @@ handles it implicitly: 3. The now-linked `CelerLedger` is deployed last. So a single `forge script script/DeployLedger.s.sol --broadcast` call actually emits -**5 deployment transactions** in this order: `LedgerOperation`, `LedgerChannel`, -`LedgerMigrate`, `LedgerBalanceLimit`, then `CelerLedger`. All five appear in the -broadcast log under +**4 deployment transactions** in this order: `LedgerOperation`, `LedgerChannel`, +`LedgerMigrate`, then `CelerLedger`. All four appear in the broadcast log under `broadcast/DeployLedger.s.sol//run-latest.json` (see [Broadcast outputs](#broadcast-outputs) below). @@ -62,13 +61,12 @@ forge verify-contract CelerLedger \ --libraries src/lib/ledgerlib/LedgerOperation.sol:LedgerOperation: \ --libraries src/lib/ledgerlib/LedgerChannel.sol:LedgerChannel: \ --libraries src/lib/ledgerlib/LedgerMigrate.sol:LedgerMigrate: \ - --libraries src/lib/ledgerlib/LedgerBalanceLimit.sol:LedgerBalanceLimit: \ --watch ``` ### Sharing libraries across ledger versions (optional) -By default each `DeployLedger` run **redeploys all four libraries** — fine for a +By default each `DeployLedger` run **redeploys all three libraries** — fine for a clean version cut, wasteful if you're iterating. To pin already-deployed library addresses and link `CelerLedger` against them at compile time, add to `foundry.toml`: @@ -78,13 +76,12 @@ libraries = [ "src/lib/ledgerlib/LedgerOperation.sol:LedgerOperation:0x...", "src/lib/ledgerlib/LedgerChannel.sol:LedgerChannel:0x...", "src/lib/ledgerlib/LedgerMigrate.sol:LedgerMigrate:0x...", - "src/lib/ledgerlib/LedgerBalanceLimit.sol:LedgerBalanceLimit:0x...", ] ``` With those set, `forge build` resolves the link references at compile time and `forge script` emits exactly **one** transaction (`new CelerLedger(...)`) instead of -five. Most production deploys won't bother — re-deploying ~30 KB of library bytecode +four. Most production deploys won't bother — re-deploying ~29 KB of library bytecode costs a few hundred thousand gas, which is negligible against the audit / coordination cost of pinning shared libraries across ledger versions. diff --git a/src/CelerLedger.sol b/src/CelerLedger.sol index 6dd16a5..e7b2aa0 100644 --- a/src/CelerLedger.sol +++ b/src/CelerLedger.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.20; import "./lib/ledgerlib/LedgerStruct.sol"; import "./lib/ledgerlib/LedgerOperation.sol"; -import "./lib/ledgerlib/LedgerBalanceLimit.sol"; import "./lib/ledgerlib/LedgerMigrate.sol"; import "./lib/ledgerlib/LedgerChannel.sol"; import "./interfaces/ICelerWallet.sol"; @@ -15,15 +14,16 @@ import "@openzeppelin/contracts/access/Ownable.sol"; * @title CelerLedger * @notice Channel state machine and primary user entry point for AgentPay. The * contract itself is a thin wrapper — the bulk of channel logic lives in the - * libraries under `src/lib/ledgerlib/` (LedgerOperation, LedgerChannel, LedgerMigrate, - * LedgerBalanceLimit) attached via `using ... for ...`. CelerLedger acts as the + * libraries under `src/lib/ledgerlib/` (LedgerOperation, LedgerChannel, LedgerMigrate) + * attached via `using ... for ...`. Balance-limit admin and ledger-wide config + * getters live directly on this contract since they are pure storage reads / + * writes that don't justify a separate library hop. CelerLedger acts as the * operator of a {ICelerWallet}; cooperative migration to a future ledger version * is supported via {migrateChannelTo} / {migrateChannelFrom}. * @dev See {ICelerLedger} for canonical NatSpec on each function. */ contract CelerLedger is ICelerLedger, Ownable { using LedgerOperation for LedgerStruct.Ledger; - using LedgerBalanceLimit for LedgerStruct.Ledger; using LedgerMigrate for LedgerStruct.Ledger; using LedgerChannel for LedgerStruct.Channel; @@ -68,21 +68,24 @@ contract CelerLedger is ICelerLedger, Ownable { * @param _limits balance limits of the tokens */ function setBalanceLimits(address[] calldata _tokenAddrs, uint256[] calldata _limits) external onlyOwner { - ledger.setBalanceLimits(_tokenAddrs, _limits); + require(_tokenAddrs.length == _limits.length, "Lengths do not match"); + for (uint256 i = 0; i < _tokenAddrs.length; i++) { + ledger.balanceLimits[_tokenAddrs[i]] = _limits[i]; + } } /** * @notice Disable balance limits of all tokens */ function disableBalanceLimits() external onlyOwner { - ledger.disableBalanceLimits(); + ledger.balanceLimitsEnabled = false; } /** * @notice Enable balance limits of all tokens */ function enableBalanceLimits() external onlyOwner { - ledger.enableBalanceLimits(); + ledger.balanceLimitsEnabled = true; } /** @@ -454,11 +457,11 @@ contract CelerLedger is ICelerLedger, Ownable { } /** - * @notice Return the wrapped-native (wrapped-native) contract used by this CelerLedger + * @notice Return the wrapped-native contract used by this CelerLedger * @return wrapped-native contract address */ function getNativeWrap() external view returns (address) { - return ledger.getNativeWrap(); + return address(ledger.nativeWrap); } /** @@ -466,7 +469,7 @@ contract CelerLedger is ICelerLedger, Ownable { * @return PayRegistry address */ function getPayRegistry() external view returns (address) { - return ledger.getPayRegistry(); + return address(ledger.payRegistry); } /** @@ -474,7 +477,7 @@ contract CelerLedger is ICelerLedger, Ownable { * @return CelerWallet address */ function getCelerWallet() external view returns (address) { - return ledger.getCelerWallet(); + return address(ledger.celerWallet); } /** @@ -483,7 +486,7 @@ contract CelerLedger is ICelerLedger, Ownable { * @return token balance limit */ function getBalanceLimit(address _tokenAddr) external view returns (uint256) { - return ledger.getBalanceLimit(_tokenAddr); + return ledger.balanceLimits[_tokenAddr]; } /** @@ -491,6 +494,6 @@ contract CelerLedger is ICelerLedger, Ownable { * @return balanceLimitsEnabled */ function getBalanceLimitsEnabled() external view returns (bool) { - return ledger.getBalanceLimitsEnabled(); + return ledger.balanceLimitsEnabled; } } diff --git a/src/CelerLedgerMock.sol b/src/CelerLedgerMock.sol index dde1cef..f25d6fc 100644 --- a/src/CelerLedgerMock.sol +++ b/src/CelerLedgerMock.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.20; import "./lib/ledgerlib/LedgerStruct.sol"; import "./lib/ledgerlib/LedgerOperation.sol"; -import "./lib/ledgerlib/LedgerBalanceLimit.sol"; import "./lib/ledgerlib/LedgerMigrate.sol"; import "./lib/ledgerlib/LedgerChannel.sol"; import "./interfaces/ICelerWallet.sol"; diff --git a/src/interfaces/ICelerLedger.sol b/src/interfaces/ICelerLedger.sol index 7f26a53..3b3d205 100644 --- a/src/interfaces/ICelerLedger.sol +++ b/src/interfaces/ICelerLedger.sol @@ -10,9 +10,11 @@ import "../lib/ledgerlib/LedgerStruct.sol"; * acts as the operator of a {ICelerWallet} and exposes the on-chain APIs for opening, * funding, withdrawing from, settling, and migrating payment channels. * @dev The interface is grouped by the library that implements each section in - * `src/lib/ledgerlib/` (LedgerOperation, LedgerChannel, LedgerBalanceLimit, - * LedgerMigrate). Any change here must be mirrored in the corresponding library, and - * events declared here must match the library declarations bit-for-bit. + * `src/lib/ledgerlib/` (LedgerOperation, LedgerChannel, LedgerMigrate). Balance- + * limit admin and ledger-wide config getters are implemented directly on + * CelerLedger (no library hop). Any change here must be mirrored in the + * corresponding implementation, and events declared here must match the library + * declarations bit-for-bit. */ interface ICelerLedger { // ========================================================================= @@ -291,7 +293,7 @@ interface ICelerLedger { returns (address receiver, uint256 amount, uint256 requestTime, bytes32 recipientChannelId); // ========================================================================= - // LedgerBalanceLimit — per-channel deposit caps + // Balance limits — per-channel deposit caps (owner-only admin, on CelerLedger) // ========================================================================= /** diff --git a/src/lib/ledgerlib/LedgerBalanceLimit.sol b/src/lib/ledgerlib/LedgerBalanceLimit.sol deleted file mode 100644 index 22bbf9a..0000000 --- a/src/lib/ledgerlib/LedgerBalanceLimit.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import "./LedgerStruct.sol"; - -/** - * @title LedgerBalanceLimit - * @notice Library implementing optional per-token per-channel deposit caps. Enabled - * by default in {CelerLedger}'s constructor; the owner can configure individual - * limits or disable enforcement globally. - */ -library LedgerBalanceLimit { - /** - * @notice Set the per-channel balance limits of given tokens - * @param _self storage data of CelerLedger contract - * @param _tokenAddrs addresses of the tokens (address(0) is for native) - * @param _limits balance limits of the tokens - */ - function setBalanceLimits( - LedgerStruct.Ledger storage _self, - address[] calldata _tokenAddrs, - uint256[] calldata _limits - ) external { - require(_tokenAddrs.length == _limits.length, "Lengths do not match"); - for (uint256 i = 0; i < _tokenAddrs.length; i++) { - _self.balanceLimits[_tokenAddrs[i]] = _limits[i]; - } - } - - /** - * @notice Disable balance limits of all tokens - * @param _self storage data of CelerLedger contract - */ - function disableBalanceLimits(LedgerStruct.Ledger storage _self) external { - _self.balanceLimitsEnabled = false; - } - - /** - * @notice Enable balance limits of all tokens - * @param _self storage data of CelerLedger contract - */ - function enableBalanceLimits(LedgerStruct.Ledger storage _self) external { - _self.balanceLimitsEnabled = true; - } - - /** - * @notice Return balance limit of given token - * @param _self storage data of CelerLedger contract - * @param _tokenAddr query token address - * @return token balance limit - */ - function getBalanceLimit(LedgerStruct.Ledger storage _self, address _tokenAddr) external view returns (uint256) { - return _self.balanceLimits[_tokenAddr]; - } - - /** - * @notice Return balanceLimitsEnabled - * @param _self storage data of CelerLedger contract - * @return balanceLimitsEnabled - */ - function getBalanceLimitsEnabled(LedgerStruct.Ledger storage _self) external view returns (bool) { - return _self.balanceLimitsEnabled; - } -} diff --git a/src/lib/ledgerlib/LedgerOperation.sol b/src/lib/ledgerlib/LedgerOperation.sol index adbb8ce..e3254b5 100644 --- a/src/lib/ledgerlib/LedgerOperation.sol +++ b/src/lib/ledgerlib/LedgerOperation.sol @@ -556,33 +556,6 @@ library LedgerOperation { return _self.channelStatusNums[_channelStatus]; } - /** - * @notice Return wrapped-native (wrapped-native) contract used by this CelerLedger - * @param _self storage data of CelerLedger contract - * @return wrapped-native contract address - */ - function getNativeWrap(LedgerStruct.Ledger storage _self) external view returns (address) { - return address(_self.nativeWrap); - } - - /** - * @notice Return PayRegistry used by this CelerLedger contract - * @param _self storage data of CelerLedger contract - * @return PayRegistry address - */ - function getPayRegistry(LedgerStruct.Ledger storage _self) external view returns (address) { - return address(_self.payRegistry); - } - - /** - * @notice Return CelerWallet used by this CelerLedger contract - * @param _self storage data of CelerLedger contract - * @return CelerWallet address - */ - function getCelerWallet(LedgerStruct.Ledger storage _self) external view returns (address) { - return address(_self.celerWallet); - } - /** * @notice create a wallet for a new channel * @param _self storage data of CelerLedger contract diff --git a/test/gas_logs/CelerLedger-ERC20.txt b/test/gas_logs/CelerLedger-ERC20.txt index d11a489..480be38 100644 --- a/test/gas_logs/CelerLedger-ERC20.txt +++ b/test/gas_logs/CelerLedger-ERC20.txt @@ -1,8 +1,8 @@ ********** Gas Measurement: CelerLedger ERC20 ********** ***** Function Calls Gas Used ***** -openChannel() with zero deposit: 305442 -openChannel() with non-zero ERC20 deposits: 469472 -deposit(): 149957 -cooperativeWithdraw(): 89094 -cooperativeSettle(): 88937 +openChannel() with zero deposit: 305397 +openChannel() with non-zero ERC20 deposits: 469427 +deposit(): 149979 +cooperativeWithdraw(): 89116 +cooperativeSettle(): 88959 diff --git a/test/gas_logs/CelerLedger-ETH.txt b/test/gas_logs/CelerLedger-ETH.txt index 20d90e5..b7ea920 100644 --- a/test/gas_logs/CelerLedger-ETH.txt +++ b/test/gas_logs/CelerLedger-ETH.txt @@ -6,24 +6,24 @@ NativeWrapMock Deploy Gas: 416592 PayRegistry Deploy Gas: 565639 CelerWallet Deploy Gas: 1149117 PayResolver Deploy Gas: 1910790 -CelerLedger Deploy Gas: 1939849 +CelerLedger Deploy Gas: 1830162 ***** Function Calls Gas Used ***** -openChannel() with zero deposit: 301469 -openChannel() using nativeWrap and msg.value: 433020 -setBalanceLimits(): 26123 -disableBalanceLimits(): 1688 -enableBalanceLimits(): 32611 -deposit() via msg.value: 77942 -deposit() via nativeWrap: 121744 -depositInBatch() with 5 deposits: 526397 -intendWithdraw(): 72761 -vetoWithdraw(): 3995 -confirmWithdraw(): 57592 -cooperativeWithdraw(): 92298 -snapshotStates() with one non-null simplex state: 77674 -intendSettle() with a null state: 87600 -intendSettle() with two 2-payment-hashList states: 279888 -clearPays() with 2 payments: 16990 -confirmSettle(): 48787 -cooperativeSettle(): 93127 +openChannel() with zero deposit: 301424 +openChannel() using nativeWrap and msg.value: 432975 +setBalanceLimits(): 24540 +disableBalanceLimits(): 1132 +enableBalanceLimits(): 29544 +deposit() via msg.value: 77964 +deposit() via nativeWrap: 121766 +depositInBatch() with 5 deposits: 526507 +intendWithdraw(): 72783 +vetoWithdraw(): 4017 +confirmWithdraw(): 57569 +cooperativeWithdraw(): 92320 +snapshotStates() with one non-null simplex state: 77696 +intendSettle() with a null state: 87577 +intendSettle() with two 2-payment-hashList states: 279865 +clearPays() with 2 payments: 17012 +confirmSettle(): 48742 +cooperativeSettle(): 93149 diff --git a/test/gas_logs/fine_granularity/ClearPays.txt b/test/gas_logs/fine_granularity/ClearPays.txt index d4e50b2..04b1f24 100644 --- a/test/gas_logs/fine_granularity/ClearPays.txt +++ b/test/gas_logs/fine_granularity/ClearPays.txt @@ -1,9 +1,9 @@ ********** Gas Measurement of clearPays() - N pays per following list ********** pay number per following payIdList used gas -1 12196 -5 31370 -10 55339 -25 128157 -50 252526 -100 512229 +1 12218 +5 31392 +10 55361 +25 128179 +50 252548 +100 512251 diff --git a/test/gas_logs/fine_granularity/DepositEthInBatch.txt b/test/gas_logs/fine_granularity/DepositEthInBatch.txt index 341d987..5681243 100644 --- a/test/gas_logs/fine_granularity/DepositEthInBatch.txt +++ b/test/gas_logs/fine_granularity/DepositEthInBatch.txt @@ -1,9 +1,9 @@ ********** Gas Measurement of depositInBatch() - ETH ********** batch size used gas -1 123311 -5 526350 -10 1030423 -25 2544290 -50 5074098 -75 7617986 +1 123333 +5 526460 +10 1030643 +25 2544840 +50 5075198 +75 7619636 diff --git a/test/gas_logs/fine_granularity/IntendSettle-OneState.txt b/test/gas_logs/fine_granularity/IntendSettle-OneState.txt index 8b77c59..0577dd0 100644 --- a/test/gas_logs/fine_granularity/IntendSettle-OneState.txt +++ b/test/gas_logs/fine_granularity/IntendSettle-OneState.txt @@ -1,10 +1,10 @@ ********** Gas Measurement of intendSettle() one state with multi pays ********** pay number in head payIdList used gas -1 219428 -5 241295 -10 268579 -25 352088 -50 497561 -100 812370 -200 1545265 +1 219405 +5 241272 +10 268556 +25 352065 +50 497538 +100 812347 +200 1545242 From 2b2a30ccb28ffb1f790b50feb4d74b8255e20586 Mon Sep 17 00:00:00 2001 From: hhl42 Date: Fri, 8 May 2026 11:19:08 -0700 Subject: [PATCH 2/2] update comments Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/interfaces/ICelerLedger.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/interfaces/ICelerLedger.sol b/src/interfaces/ICelerLedger.sol index 3b3d205..0f5eab1 100644 --- a/src/interfaces/ICelerLedger.sol +++ b/src/interfaces/ICelerLedger.sol @@ -10,8 +10,8 @@ import "../lib/ledgerlib/LedgerStruct.sol"; * acts as the operator of a {ICelerWallet} and exposes the on-chain APIs for opening, * funding, withdrawing from, settling, and migrating payment channels. * @dev The interface is grouped by the library that implements each section in - * `src/lib/ledgerlib/` (LedgerOperation, LedgerChannel, LedgerMigrate). Balance- - * limit admin and ledger-wide config getters are implemented directly on + * `src/lib/ledgerlib/` (LedgerOperation, LedgerChannel, LedgerMigrate). + * Balance-limit admin and ledger-wide config getters are implemented directly on * CelerLedger (no library hop). Any change here must be mirrored in the * corresponding implementation, and events declared here must match the library * declarations bit-for-bit.