From 7b367a604bcf3bf7de5afb1bcfd956f922669779 Mon Sep 17 00:00:00 2001 From: Jeroen <1748621+hieronx@users.noreply.github.com> Date: Mon, 5 Aug 2024 14:39:05 +0200 Subject: [PATCH] Add fixes from Spearbit review + Recon invariant tests (#2) (#389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rewrite UE-2 * fix: actor * chore: cleanup * feat: new library * feat: virtual for ERC7540 tests * feat: initial progress towards reusable Centrifuge ERC7540 implementation that is also non state impactinf * feat: progress on ERC7540 * feat: progress on E_3 * fix: compilation * feat: ERC7540 with reverts halfway done * feat: all properties to stateless * feat: admin trophy? * chore: compilation * chore: notes * fix: override unused properties * chore: cleanup * fix: toggle back ERC7540 * chore: cleanup * chore: trophies * feat: merged delta handling * chore: brought back ERC7540 * chore: ported out erc7540 logs * feat: initial debug * feat: triaged and flagged findings in legit * feat: property 10 * chore: fmt * chore: fmt * feat: initial work on Global-1 and 2 * fix: woops * feat: ignore ack findings * fix: incorrect clamp * fix: linear clamp on remaining orders for decrease * chore: skip erc7540 * chore: untoggle ERC7540 * feat: admin mistake example * refactor: make ERC7540 public * chore: debugging scratchpad * chore: rename * feat: more debug * feat: E_4 broken review * fix: medusa default sender * chore: triaage * feat: broken E_4 second * chore: notes * chore: links * Cleanpu * chore: debug * feat: canary 1e6 * fix: properties look ok * chore: run link * feat: decimals clamp * fix: decimals ** * temp: hardcoded decimals * chore: undo hardcoded decimals * Round up reduction of maxMint * feat: extra * chore: readme * feat: make ERC7540 Reusable * chore: docs * chore: comments * Add new claim cancel methods * feat: limit property * fix: investments * fix: removed trusted forwarders * Add properties * Fix new cancel methods * Fix properties * fix: investments * fix: check for proofs only if > 1 * feat: progress on properties * feat: recover and dispute recovery * fix: remove canary * chore: triage * fix: calldata = cannot debug * fix: naming * fix: traige * chore: comment * chore: debug is broken * fix: clamp to one main sender * fix: message clamping fixed * feat: SWE * chore: debug 15 * fix: compilation and trusted forwarder * Debug aggregator issues * Fix properties * Update * Round consistently * Fix max changes * Cleanup * Remove file methods * Check * Fix * Fix global 6 * Fix e1 and e2 * More precies clamping * Clean up * Fix some tests * Fix * Disable property 10 * Disable erc7540-10, add rounding error to erc7540-4, block deposit>maxDeposit * Format * Cleanup * feat: echidna settings * Dont authTransferFrom to escrow * Clean up tranche functions * More cleanup * Fix * Fix * fix: typo * chore: note on TODO * Cleanup * Upgrade solidity * Fix test compilation * Fix compilation * Fix * Fix gateway * Fix handlers * Disable transient opcodes * Fix setup * Fix rely * Update readme * Fix missing decrease * Rename * Clean up existing tests * Cleanup more old code * Simplify 7540 properties * Fix rounding in deposit/redeem * Remove unnecessary log * Add scope doc * Fix forced authTransferFrom * Rename * Move transfer check to vault * Fix max checks * Fix tests * Adapt property 9 * Re-enable transient storage * Re-enable cancun * Update scope * Allow claiming 0 * Add if statements * Rename and move * Fix echidna in ci * Add forge build to echidna commands * Remove old invariant tests * Fix interface name * Basic investment mgr docs * Clarify * chore: Change the way initial ward is set * chore: Gas optimization by caching array length in array iteration (#14) * chore: Gas optimization by caching array length in array iteration * chore: Rename variable * chore: Fix formating * fix: Remove unnecessary inheritance that is breaking compilation * chore:(finding-21) Make stricter check when parsing batch messages (#18) * chore:(finding-14) Replace _initiator() with msg.sender (#17) * chore:(finding-14) Replace _initiator() with msg.sender * chore: Remove completely _initiator() * chore:(finding-3) Rename balances state variable to reflect the metadata it cont… (#11) * chore: Rename balances state variable to reflect the metadata it contains in its bits * chore: Change balance book-keeping for the tranch token * chore: Fix format issues * chore: Renaming field and removing unnecessary code * chore: One more renaming * chore: More improvements * chore: Fix liniting * chore: Fix weird formatting that appears on save * fix: Gateway.estimate had mismatched local variables (#23) * chore:(finding-24) Safely cast uint256 to uint8 (#19) * chore:(finding-24) Safely cast uint256 to uint8 * Fix linting issues * chore: Add unit tests for MathLib.toUint8() * chore:(finding-19) Add a view method to allow user to see if they can execute their deposit requests (#16) * chore:(finding 19) Add a view method to allow user to see if they can execute their deposit requests * rename parameter * chore: Rename function * chore:(finding-2) Remove unnecessary interface declaration (#12) * chore: Remove unnecessary itnerface declaration * chore: Clean up all *Like interface definitions and usages * chore: Add missing documentation * chore: Change wording * chorel: Fix linting * fix: findings #8, #27, #38, #49, #53, #56, #65, #66, #68 (#24) * Uses variable name tranches is confusing #56 * updateRestriction could try to call non existing hook #53 * No vault level emit for triggerRedeemRequest #49 * Slot name could lead to collisions #68 * Unnecessary typecast in concat #66 * Comment in fulfillDepositRequest() seems incorrect #38 * Could use safeTransferETH() #27 * Very low number of minimal decimals #8 * byAdapter => perAdapter #56 * Fix interface #56 * Add comment * Assets can get stuck in TransferProxy #77 (#27) * Fix transfer proxy * Add tests * Add recovery to proxy * Finding 64, 57 (#29) * consolidate licenses * Use constant instead of 8 * fix:(finding-40) Calling PoolManager.transferTrancheTokens call directly tranche burn without checking for any restrictions (#26) * fix: Calling PoolManager.transferTrancheTokens call directly tranche.burn without checking for any restrictions * chore: Add hook for each tranche burn * Remove unnecessary check * Fix linting issue * Remove unnecessary method * chore:(finding-33) User wrapped token amount if it is possible when calling openLockDepositRequest, otherwise use underlying asset if possible to wrap it (#22) * (#34) Check that vault is valid on `getVault()` (#25) * Check vault exists in getVault * add more tests * Format --------- * Updating set of active adapters does not always clear votes #78 (#32) * Updating set of active adapters does not always clear votes #78 * Cleanup * Format * chore:(finding-70) Improve documentation (#34) * Fixing findings #45 , #48, #76 (#33) * chore:(finding-45) Optimize by caching values * chore: Remove unnecesary variable * fix:(finding-76) Cannot request deposit cancelation if you don't have any pending deposit requests * chore:(finding-48) Add documentation for fulfillment param in fulfillCancelRequestDeposit * chore: Improve documentation * chore: Move documentation * fix:(finding-76) Allow calling cancelReedemRequest only if there are any pending redeem requets * Limit owner in `requestDeposit/Redeem`, extend` open()` docs (#36) * Limit owner, add comment * Update tests * Add validate controller method * Fix comments * Update * Enable/disable * isOpen => isEnabled * chore:(finding-10) Replace hardcoded value (#35) * chore:(finding-10) Replace hardcoded value * Replace comment * chore:(finding-83) Replace non-transferable with non-fungible * Require price to be set (#31) * Require price to be set * Fix test * chore: Remove redundant check (#38) * Remove unused import (#39) * chore: Optimize gateway (#42) * Fixes #4, #85, #88 (#40) * Swap order * Swap deadline/nonce * manager => investmentManager * Any tokens left in CentrifugeRouter can be used by anyone#4 * Undo * Initializing with 0 isn't necessary if the variable is also defined in the for loop#88 * fix: Unnecessary authorization (#43) * fix: Unnecessary authorization * Fix deployment test * Improve testing the deployer script * Fixes set operator, #37, #95, #97, #98, #100, #103, #104, #108, #109, #111 (#45) * Block setting self as operator * Use _maxDeposit * Remove encodePacked * Simplify transfer check * Remove unused method * Clean up checkERC20Transfer * Update src/token/RestrictionManager.sol * Update src/token/RestrictionManager.sol * Cleanup * Update src/token/RestrictionManager.sol * ExecuteMessage event * Unsued imports * 95 * Several more fixes * Comment * Format * Add test for max message id * Consistent storage * Fix test * Remove vault asset id * Test authorize operator * Endorsed operator test * Disable crytic foundry tests for now * Revert gas service change * Execute message event * Change getVault * Add isPoolActive * Move address zero check * Clarify gateway events * Change deployTranche * Update InvestmentState order --------- * feat: Introduce toppers mapping which are the only allowed addresses … (#46) * feat: Introduce toppers mapping which are the only allowed addresses to call topUp(). * chore: Rename variable * chore: Remove unused code * chore: Change state vars order * chore: Change wording in revert message * fix: Test * chore: Remove unused import in TransferProxyFactory (#53) * chore: Rename transferAsset to avoid confusion (#50) * fix: Missing filing in deployment script (#47) * chore: Make Auth abstract (#52) * chore: Cache reading array length (#56) * chore: Improve comment (#51) * chore: Improve comment * fix: Comment format * CREATE2 transfer proxy (#55) * Use create2 for transfer proxy * Format * Add file test * Format * Change escrow salt * Format * chore: Use plain bit shift operations (#57) * chore: Add shiftRight to BitmapsLib * chore: Use plain bit shifting operations * Add methods to predict CREATE2 addresses (#58) * Fix #5, #47 (#59) * Fix #5 * Fix #47 * Add test check (#60) * Formt --------- * Fix comment (#61) * Make transfer proxy factory deployment deterministic * fix: Initial changes to make fork tests verifiable again * chore: Make deployment verifiable via fork * Improve fork tests * Update base config * Adapt for base * Add arbitrum * Add ethereum mainnet * Add celo * Add a few more sanity checks * Update README * Update README.md * Update README.md * Compress pdfs * Add test for determinism * Comments * Error messages * Remove restriction manager verification * Disable determinism tests * Format * Clean up invariant test code --------- Co-authored-by: Alex The Entreprenerd Co-authored-by: John Co-authored-by: Adam Stox --- .github/workflows/ci-fork.yml | 42 +- .github/workflows/ci.yml | 50 +- .gitignore | 11 +- .gitmodules | 3 + README.md | 28 +- audits/2023-09-SRLabs.pdf | Bin 246940 -> 177866 bytes audits/2023-10-Spearbit-Cantina-Managed.pdf | Bin 542184 -> 203655 bytes deployments/mainnet/arbitrum-mainnet.json | 53 +- deployments/mainnet/base-mainnet.json | 55 +- deployments/mainnet/celo-mainnet.json | 55 +- deployments/mainnet/ethereum-mainnet.json | 60 +-- ...bd142ec8f00bbf5f1aa22f66abf2eb476948a7.sol | 2 +- ...142ec8f00bbf5f1aa22f66abf2eb476948a7.t.sol | 2 +- .../testnet/ethereum-sepolia-demo.json | 37 +- echidna-assertion.yaml | 9 + echidna-property.yaml | 8 + foundry.toml | 1 + lib/chimera | 1 + medusa-aggregator.json | 86 ++++ medusa-core.json | 88 ++++ remappings.txt | 3 +- scope.txt | 29 ++ script/Axelar.s.sol | 2 - script/Deployer.sol | 16 +- src/Auth.sol | 12 +- src/CentrifugeRouter.sol | 138 ++--- src/ERC7540Vault.sol | 73 +-- src/Escrow.sol | 5 +- src/InvestmentManager.sol | 124 +++-- src/PoolManager.sol | 101 ++-- src/Root.sol | 10 +- src/admin/Guardian.sol | 6 +- src/factories/ERC7540VaultFactory.sol | 35 +- src/factories/TrancheFactory.sol | 36 +- src/factories/TransferProxyFactory.sol | 90 +++- src/gateway/GasService.sol | 5 +- src/gateway/Gateway.sol | 129 +++-- src/gateway/adapters/axelar/Adapter.sol | 42 +- src/gateway/adapters/axelar/Forwarder.sol | 25 +- src/interfaces/IAuth.sol | 3 + src/interfaces/ICentrifugeRouter.sol | 52 +- src/interfaces/IERC20.sol | 2 +- src/interfaces/IERC7540.sol | 6 +- src/interfaces/IInvestmentManager.sol | 73 ++- src/interfaces/IPoolManager.sol | 11 +- src/interfaces/IRoot.sol | 3 + .../factories/IERC7540VaultFactory.sol | 29 ++ src/interfaces/factories/ITrancheFactory.sol | 25 + src/interfaces/factories/ITransferProxy.sol | 29 +- src/interfaces/gateway/IGateway.sol | 34 +- .../gateway/adapters/IAxelarAdapter.sol | 22 + src/interfaces/misc/IPrecompile.sol | 11 + src/interfaces/token/IHook.sol | 10 +- src/interfaces/token/ITranche.sol | 8 + src/libraries/ArrayLib.sol | 9 +- src/libraries/BitmapLib.sol | 20 - src/libraries/CastLib.sol | 2 +- src/libraries/MathLib.sol | 8 + src/libraries/SafeTransferLib.sol | 17 +- src/libraries/SignatureLib.sol | 2 + src/token/ERC20.sol | 30 +- src/token/RestrictionManager.sol | 26 +- src/token/Tranche.sol | 27 +- test/BaseTest.sol | 10 +- test/CryticTester.sol | 13 + test/fork/Fork.t.sol | 482 +++++++++++++----- test/integration/Admin.t.sol | 6 +- test/integration/AssetShareConversion.t.sol | 12 +- test/integration/Burn.t.sol | 4 +- test/integration/CentrifugeRouter.t.sol | 148 +++++- test/integration/Deploy.t.sol | 10 +- test/integration/Deposit.t.sol | 26 +- test/integration/DepositRedeem.t.sol | 4 +- test/integration/Determinism.t.sol | 112 ++++ test/integration/Gateway.t.sol | 13 + test/integration/LocalAdapter.sol | 5 +- test/integration/Operator.t.sol | 34 +- test/integration/PassthroughAdapter.sol | 5 +- test/integration/Redeem.t.sol | 12 +- test/invariant/LiquidityPoolInvariants.t.sol | 262 ---------- test/invariant/handlers/BaseHandler.sol | 68 --- test/invariant/handlers/EpochExecutor.sol | 124 ----- test/invariant/handlers/Investor.sol | 138 ----- test/mocks/MockAdapter.sol | 8 +- test/mocks/MockERC20Wrapper.sol | 4 +- test/mocks/MockGasService.sol | 12 +- test/mocks/MockUSDC.sol | 136 +++++ test/mocks/PermissionlessAdapter.sol | 5 +- test/recon-aggregator/BeforeAfter.sol | 6 + .../CryticAggregatorTester.sol | 13 + test/recon-aggregator/CryticToFoundry.sol | 13 + test/recon-aggregator/Properties.sol | 68 +++ test/recon-aggregator/Setup.sol | 68 +++ test/recon-aggregator/TargetFunctions.sol | 41 ++ .../debug/CryticToFoundryAggregator.sol | 13 + test/recon-aggregator/echidna.yaml | 8 + .../targets/BiasedTargetFunctions.sol | 112 ++++ test/recon-core/CryticToFoundry.sol | 15 + .../ERC7540CentrifugeProperties.sol | 261 ++++++++++ test/recon-core/ERC7540Properties.sol | 302 +++++++++++ test/recon-core/Properties.sol | 385 ++++++++++++++ test/recon-core/Setup.sol | 154 ++++++ test/recon-core/SharedStorage.sol | 181 +++++++ test/recon-core/TargetFunctions.sol | 63 +++ test/recon-core/helpers/CallTestAndUndo.sol | 38 ++ .../targets/GatewayMockFunctions.sol | 254 +++++++++ .../targets/PoolManagerFunctions.sol | 119 +++++ .../targets/RestrictionManagerFunctions.sol | 43 ++ .../targets/TargetSwitchingFunctions.sol | 44 ++ .../targets/TrancheTokenFunctions.sol | 100 ++++ test/recon-core/targets/VaultCallbacks.sol | 227 +++++++++ test/recon-core/targets/VaultFunctions.sol | 302 +++++++++++ test/unit/CentrifugeRouter.t.sol | 111 +++- test/unit/ERC7540Vault.t.sol | 6 +- test/unit/PoolManager.t.sol | 140 ++++- test/unit/factories/TrancheTokenFactory.t.sol | 1 + .../unit/factories/TransferProxyFactory.t.sol | 120 ++++- test/unit/gateway/GasService.t.sol | 2 +- test/unit/gateway/Gateway.t.sol | 92 ++-- test/unit/libraries/MathLib.t.sol | 13 +- verify.sh | 1 - 121 files changed, 5334 insertions(+), 1566 deletions(-) create mode 100644 echidna-assertion.yaml create mode 100644 echidna-property.yaml create mode 160000 lib/chimera create mode 100644 medusa-aggregator.json create mode 100644 medusa-core.json create mode 100644 scope.txt create mode 100644 src/interfaces/factories/IERC7540VaultFactory.sol create mode 100644 src/interfaces/factories/ITrancheFactory.sol create mode 100644 src/interfaces/misc/IPrecompile.sol create mode 100644 test/CryticTester.sol create mode 100644 test/integration/Determinism.t.sol delete mode 100644 test/invariant/LiquidityPoolInvariants.t.sol delete mode 100644 test/invariant/handlers/BaseHandler.sol delete mode 100644 test/invariant/handlers/EpochExecutor.sol delete mode 100644 test/invariant/handlers/Investor.sol create mode 100644 test/mocks/MockUSDC.sol create mode 100644 test/recon-aggregator/BeforeAfter.sol create mode 100644 test/recon-aggregator/CryticAggregatorTester.sol create mode 100644 test/recon-aggregator/CryticToFoundry.sol create mode 100644 test/recon-aggregator/Properties.sol create mode 100644 test/recon-aggregator/Setup.sol create mode 100644 test/recon-aggregator/TargetFunctions.sol create mode 100644 test/recon-aggregator/debug/CryticToFoundryAggregator.sol create mode 100644 test/recon-aggregator/echidna.yaml create mode 100644 test/recon-aggregator/targets/BiasedTargetFunctions.sol create mode 100644 test/recon-core/CryticToFoundry.sol create mode 100644 test/recon-core/ERC7540CentrifugeProperties.sol create mode 100644 test/recon-core/ERC7540Properties.sol create mode 100644 test/recon-core/Properties.sol create mode 100644 test/recon-core/Setup.sol create mode 100644 test/recon-core/SharedStorage.sol create mode 100644 test/recon-core/TargetFunctions.sol create mode 100644 test/recon-core/helpers/CallTestAndUndo.sol create mode 100644 test/recon-core/targets/GatewayMockFunctions.sol create mode 100644 test/recon-core/targets/PoolManagerFunctions.sol create mode 100644 test/recon-core/targets/RestrictionManagerFunctions.sol create mode 100644 test/recon-core/targets/TargetSwitchingFunctions.sol create mode 100644 test/recon-core/targets/TrancheTokenFunctions.sol create mode 100644 test/recon-core/targets/VaultCallbacks.sol create mode 100644 test/recon-core/targets/VaultFunctions.sol diff --git a/.github/workflows/ci-fork.yml b/.github/workflows/ci-fork.yml index a793d55d..e1cc8ac3 100644 --- a/.github/workflows/ci-fork.yml +++ b/.github/workflows/ci-fork.yml @@ -1,26 +1,26 @@ -# name: "CI Fork" +name: "CI Fork" -# on: -# push: -# branches: -# - main -# schedule: -# - cron: "0 13 * * 1" +on: + push: + branches: + - main + schedule: + - cron: "0 13 * * 1" -# env: -# FOUNDRY_PROFILE: ci +env: + FOUNDRY_PROFILE: ci -# jobs: -# test: -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v3 +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 -# - name: Install Foundry -# uses: foundry-rs/foundry-toolchain@v1 + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 -# - name: Run tests -# run: forge test --match-path "test/fork/Fork.t.sol" -# env: -# FOUNDRY_PROFILE: ci -# FORK_TESTS: true + - name: Run tests + run: forge test --match-path "test/fork/Fork.t.sol" + env: + FOUNDRY_PROFILE: ci + FORK_TESTS: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4bd7782..1b0ce0d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ env: FOUNDRY_PROFILE: ci jobs: - test-unit: + test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -24,19 +24,45 @@ jobs: FOUNDRY_PROFILE: ci FORK_TESTS: false - # test-invariant: - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v3 + echidna-property: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Compile contracts + run: | + forge build --build-info + + - name: Run Echidna + uses: crytic/echidna-action@v2 + with: + files: . + contract: CryticTester + config: echidna-property.yaml + test-limit: 100000 + + echidna-assertion: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 - # - name: Install Foundry - # uses: foundry-rs/foundry-toolchain@v1 + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 - # - name: Run tests - # run: forge test --match-path "test/invariant/**/*.sol" - # env: - # FOUNDRY_PROFILE: ci - # FORK_TESTS: false + - name: Compile contracts + run: | + forge build --build-info + + - name: Run Echidna + uses: crytic/echidna-action@v2 + with: + files: . + contract: CryticTester + config: echidna-assertion.yaml + test-limit: 100000 lint: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 6d887982..c0b13078 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,13 @@ broadcast/ .env.* lcov.info docs -.vscode \ No newline at end of file +.vscode + +## Recon +/medusa +/crytic-export +/echidna + +## Recon Separate Configs +/medusa-core +/medusa-aggregator \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 888d42dc..1fea4e1b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "lib/chimera"] + path = lib/chimera + url = https://github.com/Recon-Fuzz/chimera diff --git a/README.md b/README.md index 6da8b19c..a48226e3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [foundry]: https://getfoundry.sh [foundry-badge]: https://img.shields.io/badge/Built%20with-Foundry-FFDB1C.svg -Liquidity Pools enable seamless deployment of Centrifuge RWA pools on any EVM-compatible blockchain. +Liquidity Pools enable seamless deployment of Centrifuge pools on any EVM-compatible blockchain. The multi-chain protocol was designed specifically to tokenize RWAs as ERC20 tokens featuring customizable and gas-efficient permissioning. Investors deposit and redeem onchain using the ERC7540 asynchronous tokenized vault standard. Issuers can plug-and-play custom investment features through ERC20 wrapper support and accept multiple stablecoins using ERC7575. The smart contracts are immutable, rigorously audited, and controlled by onchain governance. ## How it works ![Architecture](https://cloudflare-ipfs.com/ipfs/QmW7N8beQ6TF5efwqkMndouxGub2J1jqsEhv5gXDbyqA2K) @@ -33,13 +33,29 @@ To run all tests locally: forge test ``` +To run the invariant tests using [echidna](https://github.com/crytic/echidna): +```sh +echidna . --contract CryticTester --config echidna-property.yaml +echidna . --contract CryticTester --config echidna-assertion.yaml +``` + +To run the invariant tests using [medusa](https://github.com/crytic/medusa/): +```sh +medusa fuzz --config medusa-core.json +medusa fuzz --config medusa-aggregator.json +``` + ## Audit reports -| Auditor | Report link | -|---|---| -| Code4rena | [`September 2023 - Code4rena Report`](https://code4rena.com/reports/2023-09-centrifuge) | -| SRLabs | [`September 2023 - SRLabs Report`](https://github.com/centrifuge/liquidity-pools/blob/main/audits/2023-09-SRLabs.pdf) | -| Spearbit | [`October 2023 - Cantina Managed Report`](https://github.com/centrifuge/liquidity-pools/blob/main/audits/2023-10-Spearbit-Cantina-Managed.pdf) | +| Auditor | Date | Engagement | Report | +| --- | --- |:------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| [xmxanuel](https://x.com/xmxanuel) | July 2023 | Security review | Internal | +| [Code4rena](https://code4rena.com/) | Sep 2023 | Competitive audit | [`Report`](https://code4rena.com/reports/2023-09-centrifuge) | +| [SRLabs](https://www.srlabs.de/) | Sep 2023 | Security review | [`Report`](https://github.com/centrifuge/liquidity-pools/blob/main/audits/2023-09-SRLabs.pdf) | +| [Cantina](https://cantina.xyz/) | Oct 2023 | Security review | [`Report`](https://github.com/centrifuge/liquidity-pools/blob/main/audits/2023-10-Spearbit-Cantina-Managed.pdf) | +| [Alex the Entreprenerd](https://x.com/gallodasballo) | Mar - Apr 2024 | Invariant test development | [`Part 1`](https://getrecon.substack.com/p/lessons-learned-from-fuzzing-centrifuge) | +| [xmxanuel](https://x.com/xmxanuel) | May - June 2024 | Security review | Internal | +| [Spearbit](https://spearbit.com/) | July 2024 | Security review | | ## License This codebase is licensed under [GNU Lesser General Public License v3.0](https://github.com/centrifuge/liquidity-pools/blob/main/LICENSE). diff --git a/audits/2023-09-SRLabs.pdf b/audits/2023-09-SRLabs.pdf index 30ae11b50c0a9dbf5a12034d6060b6bf4ded71eb..06830c0fd98570bc9695402296ceab46c3155476 100644 GIT binary patch literal 177866 zcmb@uby!@@vOdb-5Zv9}1{vHE+}+*X-95qGo#5{7PH=)la0s5@Za?zvz3<-V-tV4s zp6A~6N3VXSdsSD}`&Mgq4L& zS3m&K)XwCOB$EGnA;N<=|GkEYsj?(|6w&5m2Z6X)x!AcmL2Mjc!XS1b5fL$VPHqu)Zc#Qi zAyF2A_ZjTMV(c93AWo6@xgb$)R#BEu+?;G|!XhG{#KgD+bb*p~CZ-la; z?aW;)NVxyf!0jJ~aR8O z?BZl0C`F^R$K&6>6b zz|#C+#u@z0+U8?I-4k)xBt1MCA#1>%e%t!pC0FeM53%OTw1HM}#l3uWva#VIi z_;=U-bFF_m+1bU=$;HFT)C>`x84;e6QdC|H5&oZ!M}+6#__xRZ#+CmxnuU!Es7%7m z_FwEUFfahm{|Jo*4ILwn5QG3r@~wBG7arrlBah_#jpS-^4oJ+9)7#6;3s19TiZaP? zm^P4D8$C&q5%@JYuq*geXK-Eqr%nh-T9k8UX2wj2LZ|=@Sc=|d1QTgyb(SP%0t2p5 z1-M4BfWD+pk%8M%&gSfQ6dffo`#MYrs~?NN0MK9=ZKRHWWAa~k{EMoFcIGsucC1H5()cXq#$AcGeJrBoxpZ3rgrbcY@ok} z+1USa`{REl61G3Yf4}`DorLWl5W*LO^Apij$$8vxDIu%{~7?%D*PQTP*t?LWX}Y>pkG!)%=$? zluVuNU7g+yf0r)m;Ucc=@*ZaIeR1V?9a#V9{N80DVQ2f({S%GvR{l|hRsWBUe~qiC zFq3fnW2%Y@3kk|F_E7u)}2{F<7r{SOY5SNi8Pqp%@&C1Jw}pd()1Q2>`NH0*QU zayj{Y3W79af`88e&C2*1$l(J51az=Kyn81vQSJf7FI;mT(^=+$^qCCYzQW`QiQ-NJ zF&4(WIT>S|`uYiteG0P}xKYF7bOk)t&mq{-FxlgDoXP-vqRo89zd3&JHCSlKIWgC@;W>WFsC=?kj7 zL`$(NZQFFmU=ov-;$dT&ZA=spAnuOv55$+U@ln)sD?>xTL?7Lav$0mcrO&fj)as0j z*acQlIG1}o{-;i8aup^USeb%xdg_2xiSS=zw%TV2f=@p2!wzW|6AsuaRFwBSvm`oZ zVY*UKWo+~^aRPH2Fi?Pf4a%S|Lgjh7RM7}nOccm!W*H&Ve23;uh*KtuV_Vybt#SP_ z6>(Nh=#U5J$0Xa*<0K)YQLYmud=kM55~4hS=>QlbN#GIgtQpVEr(zD}HOL}ncQP8= z0=*+pVg!t-2sPu-K)dVuTG>PqZDe!K^X|ExE30aD?EGNsIi|vqOc7UofC`nx&-~~` z6{JxD_>h=H%g@jz3h2_eR351N*0&L;PCRQ9hmjUFe%jMZ`WP^yX>`%rkj$FHC zZ`UM>-4PTYP@_smW>fg3>yi;*9i|On`U~I&kR*ihhX<^=T~9UlNgx{$*=^t*6&a5y z54|Lgp4UkkM0ZAQU+U-#RhV@kY`H1UiJk6t^beREQ%3IcV-t2?D3^((9AjJnEJ4J2 zi7DA(1Y&VNLy5s8x&m*a0YI7Km7JRwFrXYJxkF*J4f7*bFGJT?C|$l*;$NSwi0| zshEEixBVR!Fm32%u&S#WU0%#LVg9q)k{bEJPCnc`y7vDue^hTSi?-^4&WTIlW`t?By68p)3= ziqfIWY9pgxv?o*?Nq>O|bTFY_V4()}jNu#@k}zaQe<({{&j_aE2Y zS}!`=JQT4*VWorrK0}J(RsMKzEJC*5_+*QI`(xXS*y&aLx$Tw$)DV>3Zhg3>&i*h) zNUJq=j$zaWCyyF$ZT7@ne;fL!|C5^s?z@teW>g_)j?8eDmIli9Be(J;EM0n(DQl?_ z(MP-xi2?TH5TWwr^*v$V)<+8=Ni1b4GA;S<%hP7EG*EpmeQ5AOWrnl3VVMeMbQYhK z^`NzaTR$bI0_1Lm=c(>7aO2YR-APOdyVtR-RwW?sc>{o~11m325l>l=7-@*Q8v-}@nXJ_XA z_r4|(-l(c;{ev09cd4c|_7}+5T6ru zEdmRxB-CoGruiGA6%^f4Yl7{7+ua~ZA}1fTO>VGC9L)dqlJXbV5Ta)}0!ixPP(=w* zRSax}#4^rESH9WsZ@%EOh7KbIWrZwK))*`491rH^aVzVEeQ4=+nPEgpQD^GkKd~<@LuT?SNyZNR`CKL?>Qg*Lrn%Jty(MqGi z<&taSH99VZ-302C9dB0Icc?cMCyHK=G{3k`9=IezpUS@ScZ$%$To-Cf`)2iX;kBJ| z_;8t*WarbM571)6MEK6jnI70~C-zcwLlHD-r?!1tkG`WrDllnJ4bz2H&S2e`6~blBQt!>>`s zk5FQ7Tb^cHbVgM`%9HYCNN?fm=;(c2%IFjM@C5G@40T9*!~jbAO@u&=It2yQZCzz7hA zTM?2>gtSV2dbRI1aJ`^*EJ*ni4%DjmHuyJ}+uNund#sOZ3&(creKu-cdhYl%cI}r& zLz!mXg{P!IyoKfQ>To4WHa$3*WXcGwpH%s_nX{wamLU^Jio#X07IttCA^k!1euqx} z`2y4-9jNzNqVpkc=8C9F%2=KPdEy#k<}XePdEi6Gk|{y5M~>wy9f1#@7K}6Qe8^R? z-nQr51WIdYPjuAI_vmkyaAuQ_OY&S8`%U17IQ6t3hJZQO82X+GTF-lt`CexMpWOp*@1*>Y6bg!yZxYCw_ks z)0YTx|2r=Iuih>}Z2yHzok`Nt5G*JoXAc<86A{@{CY+fVQm9R^0w_o2Fc%8ejNNLs zk-3|eiQNvUhSES@nFP8v%U300D14Vf-lH}Ag$}EgC#6}E99iAIN z@mZ&p*58!bQ`>c?uez>Pcz~=kA7BS$5=>kn899&y za{=YR;Q&AQ!F+7)Yatz-tm@_J9WxN&;Q^ilRx~=#*;gDeZNZYp&OqqW3oGmg?z_Xe z=tgacW4KXu%5`w#k&hO#(%tE$eATDD4l$j9Py7>;Z;r%alBv|>vn`1CtOJXTv3VY7 zuQ*ttAMQKaovf7hq!K!C7^awGrE;Mh_oh=Kw>FKQZLs$HlRsr~Npbc?T8Y^juQ`3$ zNm?YPoML!vl52UG^`~CHkk+4jV-I^ueZAS_c!p&L`^p*F^>^6+M=j@XUcdf%0%2nV z{bwE-RPB>`$G+=;em@P<%`IV+qC+7M3*g`Z6n(RK3+O&#H za*G8Tx_*NI1)F5C0|*8@)ht=Kj3PQC3TCXG0wefC+(E8uaK~bh$%UspLK?%V2qM-f zd}~CVR^Y~Q1;bs^81?Q)PEDeOyCgn{_DLtWypugmiRa5fl~|=(aNiL!-9@tWT6mAC z-@D@I)IH`F8nw@4tw&?}Qaqs)Pt~{zx4I1!g}UBn(us>6pdULL#J`XS9kURE^{93^ z6FiPsmuQjKgIwX=STkJv9!i{$X#F^%z97$S+S}_GxO4?a=ytLA7S#9EpAs(M>}@Ev z<@+Bp!${pV+AFA&+P|orGxdUbZYH4p9VUP33;$zoXZz1np+tCR62COWCzLNwFPO?3 z@adT=XTfn~EU@{a-=II#!Qw$+RSaXi`q&$TyQ4@XjqBD;_C0kDG&Ic76yKqvuqjRn zroep}xU@@ORH&RaU`Z|be&7E3L<!@1B1Cr zg9*R$5hF4fq=-8TL=0_QtIBzW!YZGLmbM?2i7ui zZlt_1#}|?7@%hCi>?fJSH&3ypnp{D%BeZctgs;{s%Gh~?%_BIW1dkcNYVSoXY>WG1 z!63k9UE_)V4wC;UtNu4(!pZ!fVbZC>FF(MHvGzj0VL|?LD7TJWl@J~Zt}no9P=Q6n zmR1x6-gJ9&mn#W6q;xgO#G%srRyXT_moD9(L|DH1+lTGmzCCC}F2)%=kL>tNa+=ZJ z#A};D!)~&&JAx2MfALCDazu%#?>OhmLWb_F03j6FiHJ!$ zT_;wfN019{VSPa;k#$KW@hz{pIdkzVe|1HJW;kD(Hkal~y^?ZOV*aN^0a^|dW3REG zHtg? z<;IH1SI7Bpq^mq6en*pT=zXE@xcSa~?)@9w{wmJ>&!NQrUryTZTbn#M3&!WW7fkn+ z44IO220jN6=Y+{nwU=Wg~q#JBc5L%?+8sTqS;*Q+P@3!5xpHe;W{?)w&OZdy!(c41n1O&gj>X9SG}8}ZFOrnST`K7bpBf5mE5f;xJ9l^ z--?cq!7a+SbvyZHAmbC;i(nL$xDg$pMLz9(DSrNG4JaFxm@hHKQ$l+|x^gfr7--&N zF;1p4rdAuViAv;>{%lw|&pz?m!;Dvj1y61%d!Gk?ZH7G|QgR$cw|zpV0pqXPBEjR~ zvHG1C*M-+E1IOS&jLs%3hs0~omGEvb1o(aqDQ1eW|2we$qe}bV1Q`qGe+jZA+4mqr z_;U7uDL^IRx?3ozW4UU`OiId?2krQg06vN(WDJM;m0xu^4;FG&-CF{^&5M|~T0i`a zk4_-M5#wM-)M92!Dio=e1OW*P-O&>)8b>sqSRJpphAcKd0CuNqrnKv`$A`sK38Yeo z<(#vSHSY4-C=4D*4XfyBq_3D06`t$8264HIlNfu2qfB({1TitIhmW;F1qVo#%MdaU z>Bwo~J2`Y8pqni5P5GeZKs|o)YU!Z?zdLYjHVjw+uIi^!F)I6?rc}&6ZIm(u_((ma z=cDa8N64v~ePmJ@Cb3?4C3VW__K`TrY>%PNq#A^(UsrU^O%ys+bXIQ)y#U$7*-R_o zb9we}&io?WHut}^gwqEt1yf%u{}{sn6&yvY9bd0HRURRj!~qx3#i12E;59!tly7hG9ay zR(9(^G@gPP{hqfyQ`oe5V}{{!jT=6||B<=s_NKT8$m9(ej4EC%!B^Mp+Jx{sgKpTg zvpZh`YA@W9iJnsZgd_R(H2t;!tW9d><)-ozCkYKURYQtFOg4D;X>d)Cy?lebOKM5vdK346K< zK<=^93mp>j)Mw6B))O|i;QdXsfi$S-HAC|#o;^Uvz)2(ZY=jRn9D6&AJ&y_iLodAyXCia`C zhmN6eTe|#2x&yBugto@SNiFRU@aC_JAkN7lK6q^#+OEwW#7cat$(e)FDe~Q4maVU; zacIs=m$(u3q`I9^NwD5LbR!W%9ozfDYcOjKgC&6-!Q8xna%|hhO2D& zwUVhVez^)04aE8^+gcqMvz&a^z1#L?*7k{#>Bg7q#%}N=!phwD3u4kr{{8mrZOvNq~|2iGj~A8x$dl7Hv(RnWu@zGAJcZgx4u9H?Nb7!PkAqVD7mDn_Q|6XYB2^7 z{@8BcL$#FJ>Y-_OAgrA0w6jE!np_L&b58R@EmN)4^^Mf%s*e3TR9!%{C@!<%7>I8@K zp{+k8%ovLtEg`t_6i~X?if9Tl67Q%suf4wV)TTfS#~l*|30NQq1f)Nc6JTMfgewv3 z*CZg#F3av(5t!9%)z~hKkT+#V-LQQ@f=C|=S&HT1fYP= z+d%b4viK+{-rHLGxc_V9FHsWx+rQF;#>lxPEDJR$sAvYb^+m*^Wsg zpd*H%Vfs1tP|Cb`HAXgz6-k@7NSy3WKfD~%|H_@y{?XBTr**cm(e?2xhd%P#5EmfH zfKs&)F8h#mcv@MN=X=-pk?36WYoS3_N0m;}ZlGJF`4C>6sE269A^OXX{f_a4`vtP2 zvJaVEIG|1~D>=Ye|=_z0*0GvxFUm8C0fZKJ=_?i zX?{W}Uq9IH#rSm&YDU~ zr(k%miAEB;`xZDT_AO!iF$w}XslD~oirFUPt>n}BZI4Y(3J2lfE*$Gpa6}!x$i#Ln zmsnW}$VxV(CYc-=cjO|xq6Et;kE#%Kiz)jKv$FdXMXGVcXdS^X{MKt zR9p49{8(_VEMJp;5w`O#D!;*h!4%V%WP=U|)vkOKzLBwZtH8S|BdYT7c1|5RDE8n- zM~gTWMTFB#Ka@=SxDGczmvwtfw9jB77Rt;2!JBIb?WQrq!Q=TxOS5fhH^;C+6^{c0 zw+|h=Zx!l7G_g-RQS!Umw&W6x}VcAT26Jf@9G``SjU)?aq9DTXBmMVJF{X;{0ps|(ctg^SzQZih%gi#o1Kh?$N@tkBr-{m{p})l#9= z+{xl4r>(3HO`sW`@vgwSh*ezk?XjuS`BwSdHfGRO5&NUe!OTQ$$F$uXaq`A3+1MAUsv^|XPTxWSWNZ(esVdD|M{nXBVYfa6YJvEbu$={(SC+A_MapSB&w()R8 z;rBxQuebdMnXLkvX=Z^l3ewC9u?PuXf(Am)WF~R?#%Kw{l}WpLI3c+#xV(-P8(2;n zI+8;x+rB#YU%oAkx4%z~euU7eSuYSZt6o$ycFB8hs{3r7Wl}@?%|5$bKKI=5?q{C) zxIwXH6*Bb#wD%31b1TY27J_igdcR@zYxV88WL}TUJ+*PHf3h4uavX`KM5i8?wmmsS zGcMbf6bwqI%}GjWJVT0wymDG(u9-&t(UkwGe|P(epyhCsfqSy=Iq|u@)T^L;Xwyy0 z5+emz6D?}9)L71!&WN;(`+7i;>MX`4pDHyLMV0!4NfSEaLc1SLsHAZqyj-JPxW2s5 zs(c{AOY!B-zun}sZ+SRWJgqIevq8Q5Bft4+1`{J;hJ8t-tul{?Q~|po%)nw!Pi}FP z=)F-jYW&gZM>W+bccu{;JF(9uSmrB%-)%eOzF!dN35VOMcgqfIP1>vH&MmMVmaibG zOTN+4W^a}&2crJ8p_ss^>62OOZ!CA|kdmk3l^dTT`w{Q=@am9$MyoldmX0xBXm=ab zFjj6EmEcuQPke$GXXfd>ZQ4 zXquADb73DL<58O}nnsou=PJ>3iox}X$DvbxOGd=q67iKKODL5FWyn$?mxa&~a1WcF zeB)Y`kTpqeo7BT3Do|=;GK{WB@ft{=WTLH`HHq?O8Y%`2p3M;poUdUcAhe6)BiiY| z9H2=)?5c8ECoQ3DQd@d!EN%kq=chfLyl~h&t1e@~oz!pwk1Dr_e>f#J? zm*af=5>3%-S3v`spR=l#B#6&UeKqH`d6f3pdfJOhbG+y$Kzj}4Mu@UEpVrCj;{5v& zBljlC!WX=9es@X{!hbmL$P9-5tvH_a6@mWz&_PY@vA;)nO_kOw6*R|YcFp7caF`@l zkz&QoYY}03<uT96;5G8U+V!p*;0*xyZT>GcZl)k!9sSRQ0nNzwvd!NAqDaoVVpEN8x=gRU+m z^&%H)kHSWUjGs-nA)x5JoT#++)6O*|yADN`mSU;VYR$eImKI*wi}l4|u59%CsEHU6 zM{u3!s_=QqH_dTt(@0F4-Q;jGR`Oca_b_Z; z&a}}7Tzv*BQeq_S`(gv}=OijmeH0*(orC~2jq4BY>8U#QA|g(_CJ)Z~Rq|8i>`oo1 z^+)e^m}J$_r}{xeH@Y0m`O6_t0+2_s`x7{K;Ps(2am9eGu}1gVec);fF4M$h%X#y7 z#JRot+9>vrP;6K*Q+Ye??`k|k%SkET&eTW(HRDl;5%JBqXZm}i8P5G3J~Z>EIo~It z+}N#XA8(ZwjK!b#-$5 zR>|IrC(!FO`L~I^zda0cevGAGUd;0z?qroGoH8KW2dO7hHvQ^7bssoVylGHc=npxv zB2aXfXzii0$6pi1XCRtm8-8#q)mkv$u-~w5#Jie!67pTOV9y0XPf%+R8~gIji)#`a z^7lP5p9ohX*Kdq^W!)ex{)h$?ton>;jL8cMswRRarcwRm&XtXAex`i0*m^XXU_Rqm zy~o`*M;2^3R~|5pb>2X=i%0m;dC}aiIX{a2sMU)YZ~~z0bq%lvzyM&tmcVWyZUML8 z)zCUnt!T9{4p0W12G|DF1~3M^2KWZ_1|JOA3@~cpn89hlzW|_mQAm)#0hl0k;Fn>S z!8DL@AU(ja9pDTI4ZvoQ4y};H3ngZAZA^{Zu-2l0dSTg_%7!xqdkN6}|65wh8 zw1DIQ%z!1Z6bL481_&Kk3#d-KbGlx7fHXiF3>!=j;K6OcVt{HuY5*WX^1w9^*z)O> z1~3NTZ1Dv^c)*ds*8;A8~8K&IdbnNz#rln^BlW3 z7vK;6jCu~!dj{x%;Dfkl+~N$-hwy{Cr`*C0$c6BOzNg)y4j_i`gXDs{C*6VxC;@E3 z@IiT?okMOp_8JF>17gACz=)vvAU#md`Fq^~n*ctrdyXyb0DJImKr68W@s?ii65tN3 z8@d(W0eh<=fEO?Va0j!4@quzcU`E1$@WDN&?8OGO0Aj%D0$54Fd;sU3y$4{qP(IM- zmc1olxsYq{_mEq=0ptO(00H=W*sXy8WPkwdJ=oSuz#U-Yg9q}~dVo7%1I`0x3#<1B zz#gI#^Bk);6JQVCiFyv*I|)YYfWF1Ng|c-MummvhhHVc0-!@Dzy>BSb$bJ7mHn%7? z$bGjcYe;>+{+~@z4182Nr`mpX+DJ|t>m5M~zRU6B*qSK=Wp=yVcvEs)Gy{z5aX^Z7 z;}a?`|=__0%tlzcfvYg!B3*@UHpIj8g#Y1gi3o~BRZUW~z7e2mp8(v6jKta(NH z(zz*mjQm>dO_dAvV&g+vYSu@yvzm4F44RCDm=%ddy3)l)u62d6;8#gFhZ zBNg+{#aNDyuQFG8O4Cz)mfSaGOvmC&9R!)9rJKos&m~#*SKzZndzcFs1C(>smyCBj z<&2M69c37d&5cZCc+e(AM$-@|62i9%qwAdNkfyl#0_Y9OtA&@w9;n z(tVN^f-MWd26-_gq1&-njM|!8$LfIJ_Kv~nfvYT)l2{< zrYGblV%HuZ#5dV8(`9v@VphJ5+Nay6AxR8kC;+Ad(_AOCaN{E+a1{e84WB0t zCd?;FCa9xgA2h_a&a7|9H!evVGOUT2E7I=L@6z1U-P4jMesrEPZd_7bK`-f<>ly2r z>TL(6a(jh)#(M@@PhX`Rq?xxh2Wd_*7^kpKI~??IJyKsGo55Xy8Z=hFkVh8ULe|G= zlGqM?^D)b5ge%lpJx{IUQD0ppb;be4PVcvAPRLl&3z?nYyO`mzC0{U`%Fx!hUEO1t z)i*|qP+ioAuW<+BPDdFJvl@HYft35@)h2ce(#U=jj7AxJVH-&MDnr_HjpA3|Cj;nl z5vZBk#sA3~eD4Tz84YPaYFM8RkV$FeiI=fN>=gde2<_)xB7Fj0*waWw`qD}neMDb% z{|4TKEZ&u_m*paPLQq)JC=h)ex7a4(ZpkR#KI(uyo9xJ1HlfT)@aC)D;V`eMbr~lo zBW?-zym;8lRak^QtEc4@?>3td+xSxpzqqLpB(CLX9?=Ndtx?|y`D)W_qIK?pw)vGi z@!NO?3tVRYz^(urlz#STIlEVHp4Hs>4wF(WroeS z;e8bk2+obM+vN8sY6CE}V{wIDvE49dI}^NzQUhGSZ25XVA8>9X^7X`Y=nd%B>{P2W z-?4T=0{cIl^YMi`Pw#YNk{+#I#v#~hN`yCqOpJ=mOp=h6~Q~F`}?*dnCD?V*)DrWO?Xk= zR_~;F$@S~hie149yQmCWqHp5h;0~M-gTNM!csR~4deos9GL|uQ3NaqBu(=Ajpi68Q@!iM;uGpfY3NE-PL`E_%zd*os6Zn>QmGDnf^ zjr#%_9>^`-rhK$`#f86Sb$%#9FIrtyl%4$1;8e3@6_n~nUW`%nCBK|LDQmFtrf)0& zsIR+YpG4^4YWDNVn(2a`tcS!sx}0fTyWqI};J(UI^ML@U)vgkLlCmE=K9&5K zOuyUyv*=+QVp`7p##wbsvoED{uwO~u(x|#2(x|Lar{T~xa{|*Wd$ce^MwKdiE(F;g zey-moFtwbyi;bbEYusc$s=Ze_S&?`fWJGoTk`ZFI-zoz=nTKBX1tECKQsUQdC%l9N z-M0(=CFpMIP42o%6yWC~)9{5J<}qddKtm$~j`NB}gxy}joa4HL`xe2qF9?i7@+&>m z38;7gwZO$aG74m=6*B?&fk-$#@1I{!hYo$C>~+zLs-IIz^|`_jh{JY@U%X` zQwU3203>G!(7xhQd{njokN%1Z3V~K2KK{gKp@6+Zf^~`l@f`&!9tFTrD?|tj^C7Jd z($FA8f%zls{1<~#DE6<=kgiqz6+|w1LHQVEY0A01#vYK!+kmxDZ->9K3KZuyv`(nC z17>xvX)7f5Hh9)w38mMP3yOLhk|0!y3tD^|mf(x90}4{F-!hE1A@b=L-CA_FUboT! z+gi-#=OMdvFi}S{$7f%*355QDH9SaUvAD4OAOi(*ng}xZFzOOKIGXp9_*k;1M5x=d;EO<YsBVAul-%)96=AeF>EHat|su>YJe~@f3twwq*O%57O{4|;)1J)Cc$*v>T@CRbf z9QNemKHMZ3S`fO7a8}`DtMS|e-)E&yc$4`npwL;%YPZ}m^;t&~j@*(y1f|_c6D2HS zb|3g;o5v8R^F=310Y(qo=8xEng`!EJcb#b|ApC=#ILv^eYuaw)aSQIMJk@)>%CGsU z<@67aR$Agi_frldDFsRs;%narTrzGIag*o#{1~YX7eX*CHBxc>5K9aZXD>oly!`8G z{mR-G#(Eo^r<)a?3N1^`k91j-J7U(-SGbg0BhQIiJ0^TBDdEo%gx2mwgqpMbUx&+I z%R8%AYl%d?=o`LFw;ukqa=w7qibPrq;BP6{X+*6&M}A88Hpxf zb&o-(jhZ^caea%lDp{1rvKSjO&AK|&)3$!i{p)L&N+4%jE?rqfP0w!)<(sb6MXwRx$Uwo56ouM*`euNTXSa1$e zk6~XHbcr*tHe*{!h>N>MMPEMiOc&i-;=JBcKYD}Dj_g>g6)?mZTG&$9jA|K|a;86I zkT9V+B8$|f-9V5?th{{exX#=Xk7YKgFldNDYd}yrLJKf8Nz`FWf70@^MVjL-mdCd| zsxf`5NYhNWwd-BWFsH$(8i6EqpE%QSnJ<{HPbA_tuteu;^07*`TNjcpBbtV?5y~vA zSIvt#sq#KqraPC@a$a_8erb>AQ2+INS+L%JzF8wrR|Wlf_B9vD4k=bOl}EsN4RY+p z(dlFl-0NtUVd=8g`DscVQm5G^efT^3bW>@d9e~Hq(Ipm&O)sx7o~Vz{8qZOC`}Ym_ zWHY(uU2*AbG~NbsB|{G%K9z&jv*P)=LE~&ngD(fF%P$Q>zuVFaW{Dy=bVDpJ+pl&!Mo6JTqa|2SFhh+Q$xE2 zU4#Sdd&>;ZkjCc<+**J62a*n$M}&0(rVi1UKS^`Ze0Zi8kE67>(gF|KKcs}V z0mq%sMdNUiIkxu0w&AuaY78o6JUUrVOa$(x=kppICOQO_UGDvL@Tp`@;#h%iKG6U0 zdb=&{TUxn>YNd3g_v!7ZFI8^Ntl8K`>xN^+ZugsoTc`JPb;v8+E8GwqWwNm?sv(qgw8}iDX%OavIm{Z;_t2m&dlYfqlJEhp|$%r?TMr-Ffr{$72fDb{_FA zjV`4wJzwd)UsQ89oEHaPakF@!YfONM$ht#Q^l9Y%iiabQe932g_r?T!!bVSioEN3D#P z{zK${J^0?la}MO+VNo*jWFMrarrrs^etUj+5M(5}!?)4#ah9B>{E@;(a}Hcqc5pw+ zD>CK7_VD}1qW=Z(@-9sk~glJgtgVpG3%JTN}aeLcE8!_JlS zx3-6C$8@`|`^hk4L$38iS9{xLyHkbu9fyEgGgb0M>%6ck?ip$F!HD!^SKEoN)}Z&3 z1jfTftE9C(_7A+&3_B)vrq*cbJEE@>ox$8S$z>v6YZEF6bSR0kv-sB6*B>SMym-n8 zWGH>AO3Z8gl-ygI(aKbXi*iH8(;II$4QKOs+9-s7@(=4SE;bh>hwD()S=)YZswr6c z<}lJ-eG6YE#FUInm*tJ<02@ZUcV5-Mwy`?A(LXcOzcIYJp`++7Yxa1m&pLO|4Sg}4 zD*4lwtdmzt9T!&$VehiMxoY!htt9v@EhWVadN{>wpW_Ss2j`-z-mrGhMYlEn)5@yP z-V2B$PUWC!1XdHZy^nG(+1hsy^NLr(pJ$^Gl~pYvO6VpF;Ef@N5d%@diM5%WK)bh8 z&w8V0zFFzy?yZq5_#28p_wF?;D{X!m)UdJ|azINdWzbUoEVo(^O;#yVp=CT3W)K?} zdkej&k96E=-?{JFt>Y(({q_FF%TMJ0qa$a%scECh-EeYbm4=c6h2++bGt2-@YPN8Y zk@83!jV3%HOe&d-4D;(3I;8>-%_rFQTeP*jV(CVp?LwGT1)oa9ssLz*l%zbL1N`(? z+phH))476ljyK5pz-sF3d7Aq!->B}85u<*^O7#+(g1M;EgOU2DxVS@m28TaQHc|>% zZQ+c6L$lLl@`=UzXRq->Lrhq`o@sM7ax;w`tQN|2iK4~Ip={=dUy{;UFQlPEuNIB^ zZnZGl`b4$oPOKQe?+lQZG}U{<2EVv)dgHty`nP|_c4@%s*y=s`;qTB&P`N;OUFTYo z*`UD{do{UesBonjqJhvJlLyN9_(o|X?WKZ#aa(#wijA!U0x+?VVA`?{6ajP@`<$B~ zr&SlyNfX&joW96R#f{>!a$m6|3R_sdf-ln~hjOtSP(^X#5%IK7TnHle5!7&GnV1YF zoTyKEQt!@3XBHIPc2l{{4_#`Y^P2yfEA^N_RKbvRN+oVA>LRm6!HeYV0kV|Rq!(Xxn5R9XpldboM1^U$Du;?5t} z5474Vw$ZWPu_?exRhG?4uNYO{wLwQ_x7v+~ry{Ce+L8rpiKFr- zQy;R`R^+y!tD-0zE|m%)Z47hK46JjKItm{^CVrW__@zw!b~!c}xQ-0XUGe#6Ru*r| z)yz~nXRa1+_gmFSOOFE4)v{;i&-_x)^|3tEtk;{K4bQu&2YxFXn!^;=8ngsLvBhPd z)64jQ9&b}+y3Be>R7lkziw7=?mB{=bWO@LB8HuESRa{>_6m#j-z zr9{NFTsr$$sYK*PIx2+Vqe^MVcpsJAq!zE%DVomdaW!6+D}`3%16Q0N4bao z{5CypmedOPmiW3Vhe2A?jZ=-+p{E0{wHkB$K8d3Im`<-I#Lxr7c{9C%kwdbrNubwc zbC#R@X_XRy<&Hv+m1*5nE2g$H()uMUz_5F=jjIBa$riubSz$>7W|KQZbvDmcpkWiu8FC-#hoT&(*J6CJ^;%f={ ztiCz*E)GIOi*SF;fcUky0##NU6d_ZrSK7A*na-!qW-k2U(Dl^Y=Qqb56XrPR-rio= z;B>3NGL?(6*c$FL1Q~LMJN6z5*HfG>Lizij0W`i^y028JwbmZMMls*N+|Rn+idrLJ ze#g#!hW*TkH;Np+7bT%SE35&N+#&{%BLW40EDNNQA=*3;tVV&-`FYZ9L< z6=y2pfN>o3vksZ!H#xn2zSDdUJ`JD@t%9~$1DlAfLSP{hNNXIsV&StM3-vXcNp!50 z3F-+&T69KJFXzRUP8D-9CH;c+N_tEs*6gfQe#P-jMiW{*ZkaNbdAQ2+&#|F;V11SW zHq~u+_fs32Af27x!$1iq0g*jW3hg8S=~235dfa>I*TbT60dm+w*B+u=xJwy%<-NzSQ+6FfKU+&mZ+U@YJBMUbn;H$}N5k^72T>aOEFw z6_>x8d{3o7a~@L6!l2O$+`%k`g`yLBze^Yhy$Vo=XC;bENs=8<#5*U9?Njj2$4b$G zHWFl*@k9EuuskAP!uZVL~Rv)o^wr1~zM+tY968bQR z8M9&+LBv291htCAWmbPlbQWPqnm_rUvMQ!3VZDBb3=iVN%;i=fjqh51b-IRLzBt>`|G#W>1!9UpZ?h4sf zZ&QM@16t0xt`E20bx5I3JZ)*{G8@q6W<13wC%-?*xJE|&*(^V-X?pYj+z1Ho6tosoHz0Spu1y+ zQ-|2Iq{7B*K2J_FRXBX!cMWZMkyTPpVsco4V+&5MYF_5K1?P!kOpvxTr$ht(xXdx_ zyv3=86*Zzbnf4Y8nH|tTCYj)~v5`K_fq!hp$DDdJ75J_vC=1IO^UUoNcHVAbVUGw0 z%eQ;?PY?A8`atl`W0upAp@7pNhgDiGP@g0UELR^Qjg3WRJR3-L+OXl1a7wY;04AVHi%1YFgCGW%Nqeh=wJ+F1#i; zs$tkC$=H<31Aus0)=M3iWg`cc{=;YQr|L!H^nSliF{~zP!AKS!v#_@aa&gXN^ zaqevA{PXPAWFM+UDa+{ zTTLy2kgT+YX>{$R?vF`K)g}#%Zt9SxZ0n}3p-G%Q@A({??4QNT`StmIPkz4d^E~h8 z8}rV8*gU*5-?-_GP2_vvBmuRIdLZrLg=zYZ&QDl?pk6F_Ml06Hic`~yG24nU+iEY# zm{ANqqKP;Le$%6g@6mGJqalPxLkN#1zUL|!m>R+Xz)&|3#I>s%ycf6gi#2?)&Y=Q9 z-GDBrma=Z}Ufiyn^CjA@awqhi^=EIL``+(Pb+12n>)f+9pYEB6JaA$E{tG)|^8L>} zcHo7tM9K3n&RyIw^ppSm==m?-+%fp$f4{cx-BW#APhTBKY&_y z6EWf?l_^7v7Am8K%4p@yXywglp)xp$Y=VRZl(2vjZ>&YVk`KO{$O86v0{*;GS;&^jm;xVTT>=&iMuH}wpb02w0t%Xd0th(n zZs5UuT-mQ6MX_~4+!OvSHm&Wco@Kgq@$f5mKRE0_u<-^3FP$jBLO))4rJyavWvPnR zTGi|#R0H)t>WMZFh1p#Xm1z-0)GSA2x$NpV#v1ZC{Z@`XT%TOIwf$gOS8#cjRL;5K zU|%G->cLiDb24iEnu#sWcW-udWzPJxdw7)>8XpT~2Q4SnJk%AO|NWxgK=nGRcE#YM zt8=59+N`E{M_;P==a57_)jMX>GsRwi`)25XYZs=eVW`!0C|Wu>a|?Ga*YT(~r^%Vq zWX@^*FQ>_xn<5iRJgr!)s5h+$Xk#cHN*i5vyw-(}9~aN#3oLQrt#iFirtleb$)%Fh z^-B)z-CBCTQimbb*l-m^h%8tES>Xg<7G)LAhj)-OrgklK>)KLPZrdt#_(e&3+i)q_`!><0#?Vh zM^~B#U2Yn97ne6TFxqFP{$6{*P{XSaznsrKI@E6Cz(%m9%;p2@SL9cR(*0xmcK2u6 z$Ifhx4{hwQFf>UqoStj!&bPH}Zg!>z_Uzj;kU@JNcxE^)`U3W_SCq{9Ks4ydZq8); z+Eba8TMum7^7vq~&f&Fig56?vTMX`?BsHxHxAb+SGo1qmFyYog|M?i|EKp*{NxOo* zoPc$|jEVODZbld+goW!9xXu_eHn)=2Z_SKT?ws@`#iZB8k)WL;%k_DJ5x!BnsE@t^dtl+j-Br{ubu&=|(a|AdrPE3>> z?9L?e;qKwX-Nc8}(ub+YhcnWLeUMP?gCL6uQIkT{q!2YJL`@1&lR|u(e@Y^j|@Rj2upo?}yo_P%wrTeUj@ z3!4}?v~I(pEpb&fzr}!Vef{UhR;@g8e78`%i37Cbm5>MA@pnPXIdbZcr>l zoG2+4!p%1tLQecHJ5khzm+#<#V#c=|c86UKd;9G=bIA*t zTe}1^DwPk8p2+7>KA(^0Th$Q;$f>BQu zx3kC`4Y>Vg1C0(MG)A$|O1+_4iuG_NmO|hYIF=q4T_&1hYink&(Ovky&g2qt?43a1 ze}dRMh?6S)$sH&?wJ@Ws#*HQn3C-d`v=N1Q^-dTC?066hAiEC_k|~sILdg(H22r+u zS%0vJqsj(XW412XZTLg+eEH>4>Xyze170P5jLKAbv{Z?EHPIcXd3Vg?jk`^B@iX#E z%H)js{0Vm*ReYU6g6#8#EP4_J5wcPSYuMxVTMZP7kw~H#OHlFzd8Cs~0;V^?ME!QI zu{@^VusN}CCT{iy-Nx0yLBrN@v%jL-YhbK1Ic;!)^UzuTLd%dpQQ`nral&qk80Fe2 z5-A3o?1TH9434uMKv)h-%OW#Iqgi^`yj!=sHMG}>?8h8AmXb@G2K4KNAw zu)-LbDOA>!Txeq)7GbeK07exl;@4xjK&os>Big19Qhw?WdWx6*{;-v$hKfo*U1JHk zrJ#vq(HL#CM?8+8-ORDnH_12AXora7WsHXDzZr};P2Ba=`aB%eylY$}|u5qyxO< zr(X3-f$rg4q`NI?VwbJnhF%D^MaAMZSF)qHA-<}?UVK%Iuf+B9$ihFV<8%|ToY;$1 z7`GFVDRQM!V-#l_r7nq-0#nEg$M`OC#+PbJk*UNKT7FSKMs&^J%ulNqfUcW2K!Yoi zI9reebwN!**p(t@3MoCFKVEn#bB`CHI2CL z>PE|^(MFT~ZoxF7bKNcIM(;Ht!K%HjM(w$ECqI08R^3M7ZvBF5!quZigrP?IXbAV?7*NlOwELZYTLRen_Y7m2kgmKudWgfu`~sf}7i zX)95wD3wx&1c5|i#yxjtXT7#-OFOeO_iE3%-#Op;KKy;qJ*GUIHlydmaDJCdX3gp? zhVu!$%rWY37*5tQTlkK+3zz$_^go@ z%To`FutqU`U({ADu|D+D_?O9e;x5aoNAV-H9VKC>)pKS6ja;`G;CaZhYQ*xKU_*rmJveO=p6$LnL^3fp+|6!D|3M1St~?sblUSh#`WotQaA^h*4W~gs1BZ_L$BiE5}A} zl~n`n$*YNh+Bex^tE}#!KiKc4R}hT zr?kz<+tjC3i`nV0mN}F798N*PGWsb9sOlI;0b0s=$)ph_aHNKjqhLZ$OGT4Tidt@T znGP$p1fRs`9IJ-hvBkKNZ&?=uMj&q)Va@-P;r%)eQ~|hcHFgk1Fw^L1N=mc%Le3I# zq^wO%k&G36~gp+ zFd@eltMu9V({?*aTWIq5{L7W6pF|Y9uh#!4L;Sv`-e*%HMqS}3^(5^M`X~krm zEwK~PS)9E@O)e1_mslB|&J@`R3cUtvIk{A2EONUpGO8q#Dc^VU!>Oq&$GZEU|8VLj zmyhR4;eqFN?mRjeRR-ZYH54XlPW|ci&G{E^oH_A_bDQ&LuD`bPe6c%s`25ygZyoCD zKXL*1MT=cyof{A^gWtoaFikH3k_Vx(gP@u>>zbMV9k2=yNp%C1eDXd;+2ap9ul+?k@*lUG14H`*ExFecZI(OwF z)BQc3l=#NGU7J?P#J?XqwJW8*UJVt^*jqOj1~%^JDM~#Q>KN298Z})7jN(`p+pEoT zi^3&+QhCpKuXi4%6Tbh?PvO1;Yo3>)Rm(ZOkMHzNZWILPN({p3c8!% zdTb~%>Z$QGuj!3?WBHeEo;h(75PtEK(`%3YXe8F$=b_`o;LbM>0oreD8GXCh-GAhK z8P$t`YAYz3ah)@*glA?I*T83HiSAOOOA}{opn<>B)#c4TK)tB5mEnYLw;(T+{i`-M zTn%0Pog%DMvJZ;owWx0^KBzK3lFj4_%qyMcO(7}Kz;Q< zeJNO{#u=Ci%4u3;O&rYLY5%xY1#TAx)A-7q*ZCDcGON2G~MLaxzs)G6nGY_uB&ogLPLv+8^)O-RMEvGv`g%E)3 zM8bX9nkaAu{~|^A8WepQy`cQn?A%+;&Wqxq+{#rGXl~6@@9y7o@o*=UujC60=IFXT z+3fCo*eobgFeEVeJI}m5xw^G*;UsaykQR?F?knUYk^I;iZnw!WwLq`p-8=CH>tm*O>9gFMcoXEw-BHdEbd4!7AcNl2h5ND=TsOy({Y~i>BrKBx7S$reu^{k+aY$=t|bOL)n|| z{Ezi&jcwby!k45dN+Kyz)RU5I>MbjbEnAWwvg3$x96u$yw&OVQCVOdY581T2Nt!uW z(hO}d!RruIKUq1kSs_Oq|>ktMb;FtvU@LO zM@{!*8)gE$G|77o^_}mW^Bn{4ZE6gu9+tX6Z5TLDlM+z95Q^V3gcJ)j2JH;>KKWP5 zBn2D%A&H?rAZ}46J3_@u8f&PC9QolU%?VE+WO?{wYKrC2UEcigC;GL)>T^T1I$)%~ z1<^`_lR8TyWEb#)CK70tl$=g^;Q_2=Qd;$J7TCF{fDWNDamxaE~vbPPa zBkWb0B+5$ctlr{isVUqLa$4v=2;7FjVuva^CK%c3t=(P^Pg77p5zo2Z)pPKIqIr*p zc$@gG%WK6GLG}AyFEM9^PmETtqnd@-h!C3-5Ss`X)T^|cw6F4fHqqi?v+|bxZdj}WY?3-VU?GhpDU`!v|7~X6C+BK z_Vzl#mu|0#yxJWDZVHUvv0dp@M<on|Ejw=ml&Ap>xVJA0AqBGJ_dGxUT_J;XdPBlOR%H-=srTd1EJ636{C*+ z$EbIdi4QcNQZn9st?SLgz6 zr7#fgEK)=Wa`iFtMc-w8Ukq*3%q4v*jrKxX7xZQe(ROF+I&R$g@z$$X@2v@mvAJAW zMqW!F`9@J49vFz5B%jmamy8T-ymCM?HH{7pH9h^(Ow-HG%mFR1TiX}!KeKoD!A_aD zbMngh0b8s)@p%)6a+)*IU0cK6=IumRSR6a|)06vNSm>2@^rfm7re<~>IgQlCEW|iK z{Tj4`Ut#Uz2jxevUxY}(^#(#0ATC4rKpepgAH)&t0$%@y!Vs^)57&EWL%d9~8lSWh zR{4&iS@o4<^ocmY6YK&WKl=@D#966dQOq=lyn1j zWZ`njKGH_LTS7+Gkr6YpvRX11bQ!ARlU_~g2NAjJ#{~VDj*H z7Tfn6yKqRI=x_I!jikg2@mY~$r9a zVh3Dl+XE$IP@xaZW8_55rB&<%R*zy1>wLZAIO`@Oj4$)}Ml4nn`G$WFzw;wOa=Bx% zTDT~u;nd*QM`uruhRhP2pA-k#lYh%uxcDJK#>AOc0`#M5A)iFBUyY!XAo7YV&$`IB>3Wd4;$ieB& zm$vR0en*l@$50|yXtmnBwz$$5QS=yxag3d!EOBzwkJ)hk=clp^UnqjSc zEwha4kOM2=kC+1o#MDJ^KqX4i*6i8Q=m-Wa-i~E_jStu89&4Z#v;Tpupj@^l`Lx%E6iL91~AH(>F-)D5wY z5>ae<&RZ$X4GIY*L4qE!2l4`2pK7^Vg7$}zgG;5F2c)x}U;%Qn)w!`Q{lA3XM(9Nm zZe$1oDw%c05%l@O9;>l>{)za9l8@tm^7;QF{=_sR$svyn1)f!?zDg`}7B8xm6vLZ| ze^mJ=InXto{9icm@NMD?7T!!z3~S~*V)fN()aKNALBB>XgR|f|;>8+RIXX@uVhnYT zTj6;0Kx5Or>2Y|hIAXJ?n7USSljDw>mGPA*I?%+K5zIWshmGS_^(koHupy+g37 z7}lE$dn={^R2>i@QuVYzgt&?cVM~iQQ{pc-Zi-iJm=9iIQkf*dg17)lfbE}|xl@83 zj$;>m3Hs>uR7%iGGjaoaUUR{;w^D+xP?12)NPUzas77pu6>7LzOv7QD!&OHEgHD)m zP48`MkN=oEWT(r~@`)Fwrk?@(mu*8dn6#VCI<> zxw$XV)Yl?6wwh^D;`nIScJbIM^!054l4snhQft0`wQqT{rRBi$({qf?YmWq~jmPHA z7Bg-2NR1($XPM~eiKmGV0};E|#*FNm>Gb(i13S7VQdUW>r;gqt9QDlvQm4y^H0h^c zFa93=IS>O`@H4DQm0SM`=8%&M=^;;^)PFr77PA@=^MpJ6U8HhqC(=N z4oL$#Bn{}0M5iHXK!-5)z%r9DME!2s)P#YB%>mZZe=!wEjvxX(afvwt68nhMlhDf# zviQk)fz6rlv-1LZn2i&}tPqzmISba3C7kpU`>0A8L6q%KU1zMGa)-yJ&0hQI#Iq*q>DX+rhqq~*-WhxGw1KhK>x;v5ab28?9P#7$H^4Y}n7r)A;lS%_q#;Dcs z^)wBHGcl7$eS92RH0d6D2n3Bv+<*E#8Ti}235Y<1X+1y$sG);j3h$E|^`S?=ohJ6N zK$$EirCDY2=pG9mk%Tbh6WSjovl`A(^_C|H{`NAlXb(>EsHy?V6ymg?*W-6OFYrBdmy-hXDW#o=-=CeBu7HyaHcYmc2< zI5)lcQ9AYWKMvbJo@>b;@4(a0_xyY1EKI{L>LTv_ZKnkTCIL&g#PM#K-`x`6yCvhg zq5HR6n|uq;zfRaJRz=>YN0F?n9<}n`yoDzNunqH1U@81WWXSLmPBv>qj|8~0wH^u5 zy=0WNi4-HblsIv1M9G6}O)imM(aKpGVuf*3HoAT7Ueg1uL8rEvAHZN@Sr|+oiVNw7 zwfw1E?Y=srR;4!ED@ujfS9S_rz-Bq?}8@^>UR+fQqS3B*-<@)9be# z($ejg9*ySJI$a@gz!poArV|1JFG=YJtqliUH7&Ys~RI{)yiWHT>C$m#Xf)X@7Di6&v3DqNR%dn@R=ZaqVw)Y^mna z(b<7Unqe5dR&Uh**ak-Q*8W0$maQK;WuJ-%3>Xe{ zId5(XJ~PyU(vzs#HG5&^27eu0&J-tS&@BIc{+;|GKAn#n^Z~lngk|b1sNr(2HRsFp zAudadASJ!%2y6*OXgMqqBLRdc`36svoRRR};4fcC0)Er%3=%fJtJ6frLT8~Bzb;`A z@C&&g#G}I6#-b-iwjNR=h7rmzk?>WJHw$C9HXsh{i*?Z4~ zjV`R?PiBMr9D2wHeVNwbZE)qf6c0BzLs>IE`s+c_N4iZunkYF_XTZ*cSN>ge=C0n3 z$<5B(?9u^T-K?V_bnM<8kWeRzLsCxD_rZaVfY*r;f@ zMT-t+`}hMWo~d<)P?T@Xd-6sS#*(FQA}@uPu%#ekR(<3-tVIHTHhusJ_~~c}38m-R zRe!|g`6UbWMk-gY{!HJ;jjw{ncRvuL;=wD*HRpq014#!krAlq_dbGHKuig0Z)!!ry zG#Z!yr>N^hgK)Uxcsb7f!U)tsz`(p(rz)eR3ky;R!vUN_qJ_jI55 z?YN|yHUVenD)o@)cJbom+%cTq#lF5+VF*v~$*Ys?B*kOK*d%<4fd$2X6FaKTO&90* zE9gSz*iaFjC-@Szp@-uW)*m&t4G8*-vwaX7*QWZC<=4XxWyY z*4X(J7=o*)wi6_1?s%hEo}<|p#jvRP(?{Fb3G!I4d(%9|bnw0EE_ljL4Nyhws?XBY z7s{Veda4R?V4&BF-QdJb9C}LJe`1(9Y4*$bt3z9vu()P`hhbv!UM>u== zt^yL^{zwoB=7jtNKIIQx%K=$&Ssh7n)k_FhsaYpmo717Xt8@A*clayx`U?M!O21QQ z+eU@#J1J+d&aKzbN|3_p@_EvoO2);}|Mb-33iTe3kJITm-w!*t>!&z9wK~1Q!dkr^ zM$14xyV>W@$%N}wpH#eb9^!ms4?s%}E+#;Fn9=S9i@4UX?I;s)D8H6C^k z-+>ykMi$lZHYr<6yb>*xyNXp%Y4 zPX1WJRLKF;$PtjpfZ>~K!SHG&=x5{V-RV7`pX;R!zg3u&Z9IS+fq^FS}k z=Ry4~IN=2K2ke7{uB(e<2M13~;1e<5!?HetA}4qbJHQ=k^iA+%=s=d|Q)pL)Gx|`7 zugc3OrKJ8E`Ea4*9iHLP^z*{@hy+itBSknsHwkwSuLAV zRhytN-IU$|ObALksv5bTZmi@MCvgkiOs36fShnV%f@+dFE09)G)GcyKQ>jpl|EuCV zs-JQw>nROY2ec778DbWc!d+_!KK-=|%C{08Zfv-JH#(N(`_UNxlYESC%4_P3m3d>qo-oLhNcK9DMj>5>ime+nk0`D4fpHR;PF) zc2xCZX%qvDjjiF>8mHc5ezvG68vjpwwZ%4(Ug3W{w#Ro*Y|q$^6WhUY9LI5N$Id;m zoe=D?<6KCf2@N6K6528;w-uBvy=(y?+Df|>)k;WPb^Ee?sZ>E=NudvYK&Yy^5~>gq z`?NfiOVOyi`_Q7QI6eQ&_>vIV0;0j7vi|is3l35whRusc)jSaVYF~TNm52F@nzBY2CbyrJ=Q_K zy^rom_2;aDzxwX{eBZ%-+(UAq5bKZN9&vcR3u ztA3pOe#Rpl%^u_q2s4@f2q#Q(LxqllpQ|a41(lRc$)iD~iv+6I_K^{>x&`FWM?C_M zgU=igcpQF`6Zka`kj8~dwx-sO46nfVE9Y~iJzXa@O`XQNskR~qF~>m;hKMAG|GGz9 zm-SL#+7V#QWT`JDwt-*CUm0H!|OrURw zp5gKMGCJ(x6HXuYa9dA2GLo?hsjM#|^l-s~lPjBd*|_hN9e^3hq^trDyL%!6U*7LX zZP@L+?nqead|o4S#o5pK26>5tR@K52=$BG0oSKS8JRZG>+tuBXNdJ;p3{T8QF_86{ zbpKHRaxpv4%?gD~)YmU$xXwZqqU-D79kKgaTM)fRGm8K)j#8KvcpN9wFYr~79H|%A z#Q$4fRSG02B@gq4$peHnR}FQ}|6z9Qd476BBAJF1hz1rGLJVgjTX^1fx}Dl zVt`t{9HA~O@Hhr*5O^_)LncrPBbLgSQX^fGcrB5$mSQ&EF0a~5N+}NUt@Uj9vP*e? z#%-WTQms*GZ0?}TANQJx_ccI+!)wtz&=@r;i}_(E$NK9S3N|UVv^yAKv-{KaWZU!b z&+R%_g5PR4sek}Sd~5ICyA-6VQfr{@N*oq-bMsoAR%LQn>Nn9Qt=d0wY)oO2SW!QO zEPD_AS@fr5vUbdc6D+WEr;#_|wzGD;_T*`tVlBocV=epyet=@3z)6nhjvb3F3fr?| z94B;TPPP8&D8ujXjTG|6-W%j4tFY9A{+)_R; z?1rRNsx)ef!7@mAO~lU|K_9*$pAqXrtEO!A;swwLWs@R201H-G=m(-cY@iRda<-b# zm*?u_hGLoCHFs`W?toz#ZV;FEy;wsCk*K41fjm$C5hc+WnkQJ%p&3g!OPh(&ti}Kb zFKs0X*?4MY_31Kvhx6ylX7T*l$M{l;8i$W*quD|f#$8Htl#EjptSr;SsB2~Q4{0NO z2*)Xxi;9Pp2=7hkiBU9zA2H*l;kKC;e_9V`zd1^g-T6-qQ;!&CcQ^UCpKI|B-RsWJ z-t&%Q5rXtm0=9VJu3)i4-xZ2~5(?c6*+GSoNGMbTi}WWU_zjf~V(TTwHRM0#4Gc5& zh{wVE$;Uhn-#v7X@6LN?@A2>mtU}OUDukaAqHl#D9yS#$kW$Cp6i~xZ%i8U3vZN|3 zr>-VYVyAe-Dq`(04-ttbQE-y9tcj*Tz(mU5$n#e7JHER1xgU;o?Q>b|gPl({AD(PW z9Q^3W(#5^4bVJM=i?sVajftJ_6oOd~LD$q2iwkqnY{b4W8{;DOsrjvsy+Mce%<++h zq>FsZ=V_ddjD2USwVt)KxqWR4ouXl2M_=;r_Lx7tBhirTjys)&)`8tk{<)#ix3`70 znug*RI}dofbIm&zJzdt|MmE#Gol1WL0aPFJK={-Z&{;@}vFzmf+?XuB8{DtNc)P1hu1Ih_0PV5G~e~)kn*aAaMTt zikT(~@Zldg^YFs55uc&n+TD5`tm$c3&^z?_6W*)G*K{Zimyo-~Nv{y6Jt;J1- z$%@-U>=a-TL~=bg*4Dn>5dJHpL!O}|EGQz{+Y;=7ztvS_1}yHY-c~dbiwGe#@ugW- z6O3)Y2ZS0iKEH#tr&o0HYZKxWx?Fm_4PWm07pi&>kT6Mtm`l1n1-eb3WwBxyQk_IF zM#RzT2vZ&=HhkY+s2JY)rz1u9xqGW0iq1rDrwt3Za-uvkqi!!!9g-OsH9Tp zwK2z;62~PyE{jXAL3HI^rMFVu2KS#J+#=5|3yqx#`%M$AHxPw@10N4h5}7KOD%%&% zKC7I4R;+@Od%4{#e000pb=bso*u-==s7^F79n_a=6X_aabRrp$!v^HA0Xb|y4jYgG z3fv%`f{oII`tnG=5j&Z2FrUnXyK~`!vq~+v7RfM$dhSR*2>ohEUIFM3{@}Vag6;4M zKaw95qnY@%;YxDCmFX)C@nAjKspUSMl*5=tb*jwEW5X)9@` z(3iFQFlkk!YWuKnTk~OUN=BQkoz#BdOC}MiQaVj)5-lIrq>65pHf`Fpj_m(D_ZSQz zZ^M!g<9nVHzu)iq{eFL7JxyK3tP48p=#2!_W@bq)ZB_s<9Sm7Tv654$@#(RJ6AQk- zLZS+158qN~_Q!@QbfK=dmQ^IIDhve|^|-RCRcmVWMNi^mBm9pJtTmwDDLx^vHh>8r z9z}We-3OZSHlXOD8mVg-$J)Lm-Q=W`5}mNq2^*cT&|Q8Xkzn8KUS)Q7nEuO&-@P&1|H{&fa4o>~+|a^QSNoBL zVqxJ}S9^JZf`r59;e>k`5{{++M(?8#sy|=7VEh75ZH7j=h*13yY%kKm6Aki2gM7sw zd4d~{OOr=NP{{}?xdweLBfw;YDMxwuj%>ulv|Xi{j}nF8khr%CekG9g_2~o0jjHC9 z#?|SHzAS;(L4DF!GHB@ly%%NPk7h37=mv;4jr!zo*{r%s+Iw&@@M^}3*Zf^RzQbd2)+?(`_ zymsmAp7YZ^E@+~wzt}&~Gkp%X{R_D5BXqCmjt}tGTV-^7Wgf$Z0K+yde?tEo?#$={ z%@E;ch|gz;pfiMk3<8<=#D}cU$@M0&72y*o?6^vsek&Hym{6G#D(-xv3gaAKSrtFUt5vUR}SlhNM>&V7lxc zAxyL3U4xmkSbTLckH0P39o_7b@qBkzojnq(vzd&vampK#IF7TpTSq$o`@zFL`D(}R zM!{&|dCn08OvWB)hUtUz z(mv^^bV@RIN}ZCo=gWMMNfx~KbVC62G^wjAm6{Ya5gV#Z>I95T@aL-8AQ$g!y`@V0 zeU*|#DJ&Ts`i{w-FIBuJ2c6N5c%r?jzCrFi)RR3nw9V%9h&I71N`8^``n|4bTWw>u zDcsQ9bAZy>WagNY)Z5hG5u2Yea)npCCNw0ZW-|RY-2;%kx-% zy}m?Z&9^*cFo{MbHx38%nVB<~SX+Hl$~!on3(X5o#$va;#&$tm3JP`vS4H*2<-P0veS$!ZlibA0&p zsKF7AxdIYf=o#+})@~n2<_fjp&=%_Ge!RB2kL^jA%{5A*|KwO}>!I@p%d8Y|#loxn zRYTXuwV@%K2HHeOlSpSiQyG)!7e%TTu(|?#B zP}9@}+>uK8e0n;A{(1jsZ6Zyj8{lQ17@bziWpgGms!b@J@Q>wqrMPXRR`F`)K~j3) zbfukLDL77dqr8N3tnGy;xE z7e9&PYM?416sf|@^Ei-=-BD$3s9{&k2FYu-Fc!Hj7;g^?*8o|@Dg2=lSF3UrtdHiv zcxAHu<3mZiU~>gsE}w&OT5B?6-BUW&-`-zKG|xKj&bo;7NRm*e1y+pTFe&J?7g47* z#0|fs$lpy1xa(fjyRP8_iqcs$-UOxRsTsuLc! zd0|}jq3Lxs^^^z)1K+;$>^Ks2e{T8{M9QxTE)KxuvOGG0P^q`~+iT%PW#t3ZsFGK9 z?hGq!ib0uh$XZr$q5~W+9QG+tVSg};XptF zj7|b0dw7E_AgPPX5DRF}4fe1J(T9Vgf@ox|e@R>Uhv{>R6iOn`?+dNws{l6`Ss~Q4 zHRSZCz)=mH0?Sv}VjOon2EouhVCcwVBBFyQs8^98xh1>Z{wO+V+G1lFhP7E%A8hSI z>{0NcpHkN`Q&VSlA*Rab8-b~%{AA0yxPi$4-uO*kQ`feh zDQoJCGBJp$oGA97{XbI418Q{VLWHLA7>Ay)sWU%=aXs~cs-izqF-!KSiQ&wwr!EQ3 zRu9f*<-pmlS)38f>FTyBHd!gsxP>|_V&sY1pl^Va7UKB^yT!-|$on`e_iX0(lxMkG zJlJj>4zOF|i01v+DVKDoWDFIjG~dNexuiQK^FPk3Cbo^^3h&J9a=Bb`xyvP&KPz&% zBzH-f)Ka2;s6U%j5&aFAADS_n>>A~uj7g0umbAJ-EohvD;gN7DX=tawuRYt*E})B_#!DilT(LGdp}UqxZfy-+V9DXG-53 zFv2Qx&CN68z=}(dtF={WwcTEoi2fi9Tzz1Kq4{U&57B!netLOf>A=FsLb;rs9G=9J zD~!HrEwGdtVm)cuBZh{j4Jf0!x#cDm&8YR$?oye~?pn;GJP9;0X{|7pzS*%BVyw#! zvA%NL<%Wh=fc-yN@jnnXdTKB9it!~(ybC>^PsgF3jAx^Kx4I{tcFBe~d%^uLs$?&? zU(WP<7N9u3xxGm)lV344X2Y!mjm8)fi?oU>(kia#2Mt%0!!lYb(prwP$a_pvff~-} zDL3xw(5WlPR!~t!B@X3E zFt9&|3OQubZo@W&H+YBAIhH5@DmAH4^S3WjJm< z(&mvwC@e(;(DZqxwM0OV02C_5APNU)gDzRvgpy?SjGmU13&};?C*%(@u zH@5#w>l@lO1Cai57FLkMyYe&Q0kXPhy%P-2T+>B@o@@UIyP5-EZ zD)hI?2K-yHsx3TSdA@=V!DxKR)s-L9n73~>8n+ zh)B!=;3CCY6i0>!TX|7Qx0EH9&|Gd(B511G0}D|gduIob68D-XdiIpdw5Ug7MdAkB zwkPTcLOwC!08c=$zeU-Nv8DksWZth9jZ8i!vVXkGim}{4+ES2!65V@#q!zR3d^Et` z`iKoEhMu+}Sm=IMk<=hZc#%g>buU3fxS%Sb_tDQJHN+BMfbXuO6=(=6M#J4FD6e(j zB1r<|mtK^-L$(6tlDmL?=z6i})O@6#!ioTOn*BBPZIsI9;vyTUBe zpipK2QYm|MLTN>B2ESmG=vhH1OyWhNuG%(a-B>RKXjG-yr)g0hkABxTQcGnO>^mpO zr2A{XT*zc{QGr8<-1jND>_9>Bb#KTD7mP}1ij4%wzU`zn_ zs+FWBH#%U$QKPFJj(P_5Ub)u4uT0Py^c>ZZ*;5^+D>z)jq+NX1=a>9jcVartcyzw| zqO7t)NWiS91bI5veGdK94|T#}Raf`{Gbd?UQpT&M6@ho3q$yb`5l_im7kOD{Fmn+9 z7B@Ma8DgfHAG(^2k4u3#GOC8-ZuZ z8TXn7!C!5!Z7Ne$P-maqbZgxyD)X(Zb)f^3o!ILg#*v**9TFrkzocL2l-2_EH#+Vb z?!66~z6yj>hE>WQ(NN{pzrA}3%v1V(Nk(JCyV9S^u8BHs>KQX-wWlkK6GmyVGym0) zF=|`0Lm7W4BF&uMf3Q83dihvs#*Wk~l|}*oB^VS#!`7fyY3y?j4QY9O-#{o5Q}P39 zG?PeAELXo5)UsN!SSUiQIuNUOeJW!!b>?w5Rsm!91M~=^GDY-iQ(;siAXTp9){@Ui zXGYh#XQ_1c${|#}{YgJ4)GAlG((&xL(e(~kQbp?3HG8U>A}waVs9n5#=iNX+4WhYn z6TfRV+p_~TXDFfPWKH6Haw-~4$z1LDX!FEm>a~zjD_DoCr6Ys+njw>Whu4ml16n>Y z8w{~N!AAx-p2HX(-QN#c)uXEit%Kv)!HEx@A!BSFa-3#Kf=e>P%rV#R1Y>Q0$KgQi zt#t0~@EUoiQo788zgxFA=@+u#_D$-mmX5vENr!W9cfxBG@=mA1mo9gB*WH_C`t`hJ zcM%lzXT$@nIKH-w#ShN(HDogPEFLXgT<=9)fe# zk?P7fXAhrQDcd%3I6q6^PUN}|IZk$LK3_OIZkES^%$OtK^S9uxXMT_Ogk=Hn_47-5)(Tpv! zt{b31{2LcRKcq@lf}ki2^rIgIBE?E91P$5(a#6r_(Ijnwu84r3A1PGS2#ORaD)hcL zBt^+CYFQ&Z%p1IS?!D*Ub2iC~4TT7b%RFz-EowAL(`tH2YuQ&+T+4{(E%bl{g9F1n zM=^-<;<5qX&^e$vO$IISot9oQw3cdLF;ug7CKI#$qJ{uw`#07+Z!|Nq@d6Rsh;mIW8w!4KJ@l|;>vko8;Mdti*GunFWb+r{_jEqrYIgvC!#m)7a%Rb}fV`CSFqa$92 zE1`Wicd8uHrx#|XzB(QmNQN{$Ap7HE7l%T5={=77;7~P~4!RDNL)oA!H=KV>S7(lA z59tE^N53p))!bAm;BqWDs-X3XiscBWA7 z#loSvl1zQtt=5sL$^78%N@v|We=@1Qv9mSkR9Atg6!ULFB4R|ttX`S?1Arp{qJxN% zfepXAiE;hKEHgl~?vHMgf%go51HS?|fnTAz5TCkx)zlZj#FG3^MhHlq8%qI!am5R{ zSUgvV?cJGDSsP1H@OY4kMADgPq#ggO5dSi93Egm%IOk&p?Ud>3?;gWPPm z2szF%sb=W9r;~|xA|Mq{N|+H`?~b-RR{0$K z`gluQueFX;(xqnlrqUDLI&R$C`Ry9~M*&vGq0+}&HErG4|3N3%_1^yd%(_3gM#UpZ zhy}9J&V=PN045@UJavWS! zsuTVl9m-Ynp@g678$C19uEbX$S_8x^j#i&%uM_Y@h+j*#`V_6%36K}JX4D68X!s<* zX7ubZz32an#vXdq171N16#;5xM4wD`g5cL<{?e79!)J>7_&<#xEk6Ybg8}ZJ0F`nN z(1@T@#t@z#6F&0Wpvxkl%j^#SU7@AFVe0EH^&3vXe-~sXqrcG+)cfw=ErmA0Z)A;3(vyG!tyPZ*{E!%&txv zOfe~&zF==_uRB1ydl4lM^n-3Lo^}WI%cFsTOiJk#Aj8Yv|T>&?uX+A6=re}lPYN@)bCM@q|`eQIXSP+NTYEd%d0)im0?uO55lbc9mc z<6N>Hl+$LT0Sdk_+_*Fnh>c$v^A8T>LaZQrVt!Ll$9N8$A`;X>2Qz5{E7aE1*ejVK z_|bkvjhRP&2ZzzD-6` zijB6hyaFhWQV+=;Kv5^|n0>uQo_kjt&<33TP4avrOgJ-(pA`R5q>7a#e~syHITnBF z`L&1g$V&|Nee*jA0Q!px8mm3b%KlUr!?1E+K3W2?ezKmiyqrBcsB(hfR3w+^WZYgMo(#nlCDj;C9?8mfr^^9vJWj^t zcBKOmU6uRCP}X&b*W1iJqGY;=`-C1%qO7|`fr~CASN+_oxR8C*YWAqdJ1`p`Z#{YV z+bt9mDY_sgR}H_|5V=)DT(D-}G_38G6>vY!ny%3_L?qoHS$hfqH_6Dc6X5cNDz+E|G(ssB_ z-#smZ(Nw!@>b76^DlVpQZRqe^QD#A5`uuLTT8mAkJEMmB)agP6Jzm12gFMBW;z&{(L}1 zKG%&Nfb2o{y*VHe9JuO#DX+HJII1%|=bSlnpPlQ@b=SLVJHD;$ZIj>&BzP5?rY%k( z2p$MHk*W|>$qi22KnkMCLsON~6jT*e(1#Y>DyWpENgT&Y1Q<1K0;wYJ(Kz@SB53pp$)P*`rGxS5wE4tiRY z1Oj&S;y;r=fE_n+yOMr{T%C@^?Y=hgUJW^V;?=xg_5ONs5I36_K1$6qm9x z-iGi!M0VN8Rmd|u5v|DebC!s|gYo@HG{bB*%m`!;#ygN?r8KEVW(iIAXj<*(pOTg_ z)kV@Y4LzL-KoV+WYGcH9Zx>WccL0YKZZfSdTG2EYaP5$-<^BLZoUdxL=tt9@T2Yl* zbQHR&Vw>7M(WcV;gtb^iB{cqViAWZ^+@zvk`hL*(0i(}rB=Am=(FT+aI-MO2+WbaI zFN*k9ip*jZv^Wyp^)Qj4vX6?U@cfj3jA9h#Es1=4l1N6JjS2=9eu4ifYa)+fJD)xc zVU7_ZBdsRsa8nTJ3or5#Pl%|?AG6(nKEPXnffBc|S;x;DmL$cWMUNaQc}3ZCXVIfo zP4RLQS=pG7caZxVg=14WQDSi#<&`CGHHt@OXu8J-2SFBTY2rJnC_GOP(bq}2$Ilyx zUw=_VnU*MkzJ>oO{yrA0d=Ru4h+;!mc}Z6eV$X0j9*de<+lkRWQGqR`IwqH7uCwTU znt^?NYify!F3hyJ@Znl#(Hm7&E?G~8_Ze+Z(H)Se=HMSf)qLuxr1&j`)|2D#25oz4 z9NvL2JO}^H3{-;n%VO`KlSE>0Q;FqarvD`Lz7Jv(Yd-bM!$d89i3xM8c{7?HLzQSgDIN@ZAH^ntM^$(hj70Dh(kH{*q_?51fk6?q2&Uf}XbgsCHzf@` zTmCPe0oe{)!+cwYS6-D(H_m#oLdD1E^D2Z&Nw?*pyw zWTG)%=F_%wS|(L3XOhgh+(T$X?+w?N*-<;d&tKouJq$E6%I{XjDJ zmMiAoa*erf?j0WLDGv{oYe(p^!E*QD5X^mo!$_(B2VJC_fX8lb8JioP$Lq~6!#=un z24@vkG?u2H8BZv>zcWuLb%E(O^zC1!M_MdoFHuL|OLQ^SKUR zmi>-gzTK12b)o`M9KLW}GZjizL;Iwd?+jEm=*;K4LPZI?V88d&-b9n!U%8meCwW}; zbDa4XCd9*P6|NzZMa)Ud07NP}h(OLFlu4*}tw*TtgpTDah~KLQ?NQk7tB(~{_V?;;PHuTp5pnJ;e(0#u(iV2`7E!y`D|FSc>#~{y3>*ki#AW+ z(+w8!99?)wH)L4Y)tQZj`bvD5f9-S3KSxxUKPXx}LGMB;%E4L|p}$ddi3qG;xP@I& z*nMpNwP+gm}i)05>=a0imdu#h4c0bCsr8=!<38b9$#5CBKrlV1k zEvS3BkqW4_TrR`vhuAn6sU-OtXIWZ<@; zTw(aO6$px1&(E2de&dzeo#$V#Z9J`6DuqIgZasV9()R5a-#B+KF9kTH32<|Lf<`{#RsE0ki@? zU%LhHzEqpTF@1n5r1{}Uc*=-QGUrtmlFG*jPmLRVbTake5+6338|KEeUt_RvY-H-3 z=Gm%hdm7>dRpO1z)D%0{J}Jc_^f^M=i7gS5wpGl1v`R31#@oi)9GY2z!#oulCxuUO zgyyO7P%uu83yU}?i!;rtWrekP#Q>oh)%LY|#(*+WoSI6{bVzwPy95f>kACSOHgb5k`uTHz9CCvatOo)I|o(XJOB21mM#v$INd-^ zZMj#~*2|+`8~rM;w*+?RsHAsIpBMD6>A}zrWT8Uj`5#Z!o;`4|_S~-(OQEcqz5TZb z4&OaC{rl%`ry@_Nl3~gMbjK2O%Tr|)(8Gta26r6WoXt@f7?F~|18`=F4{kK@U0X;k z1Re8x*Ysl52I;rx=zn}yYj6|S72dlqS+9Lavb3_Tr)61|CbE$XvVyT>1AfT_*{(4* zV6ZVsD4XGBY#u2zu`#7-DI{qUXgZw?p7fQH7#z@yo6t->!*mLz9o%O6qhUN_nhqTU zKjO(0YPsjGEY~o!T50#*yEnE9*g0=he zgaWA6JT7Z#>nBSBi@{+8D2l)i3W^HABIfQpoOasmcAKX`jRK>p*`XmV_rATr=45p4 ze3ml{yoF;Q_2y$7Ux0a>Q|7TEvr_r!dK{_;gKpfSU7X0o-!j_Xq8pbjwDxHe!SfIo zQyI)77oBsP?r8OT?cgAkT{I1+J0|yer>(&5%BSCje83B4j?H&toXA{ z1^S1f|E1DDru47Q+hFfaLjT)JzjNLOdjR)eQS!oT)bl9H901 zs%jxEsgPU6O9q3LQ&}{*E{g=UD58e5q6yu^ElRD+!5RskL7r2dv8dwmy><9Ou^URd zXY%7pAFH?Q z>_H|->>&n;AtHrmd1>#URFpz5#g_$j(lZsr5vfgTBWkzzO*wpyWk>Ico%fQ-gi1FU z-0NXP2OM3i?#V;ViThmue{6C_DP;|oXh@8f&ImIhF)Tn#d^UlHKNJ4+7cm;0f*+2M zfTM3p2Cw4LdvdZ9eor`-!85q-O5B&ba0taF0!zII0^mHun;fl>gOY4%h$&jxfRRk` z2ql3z9IArxAgm_G=9=uVmbxC{Lsdybu!%*&&pzE~yE*&6?7ES5Nn+zSq0fZ&rnm zPQKUB-@Zb_su>c|DqXbu)#t|3bLZ=|j*5$s>gC~#eDc+qLZWN88inoZIf!AqFCT`=%-%pjFIQx@#PV9Jg{pp*(iLWWCZrRZ6 zXiSQQ(PF9vM?`v#J;M|dT|^JDow%vQZBJco*ES-BUXJT)yXzaiv29yxrQ2P`q|nWa zm1Pa%=nq6IA)*^`M_JFUt#x&h(1AL7i)U>%={aJyx>x!-(5sn^Z0{i;JOt%CVZgyL zu?0|!V(R*0N|>C2G0_mUmPP?&sT6|5un;D7J-1}+m*_wms-xFdJS$`0)z!qTT-_Ux zzLo>M5zVZOA0a`I2n%0u2xq7#@ne)g0Z13301&p*Pm2N=q|JuhY;jWTT4eVH4QEjm zQZB>AjH;nu?=yVf4)h+>=}r?Em+_qSGmn*P^FgROSp<3~Ro zL1?tAWYd{%7W&LNbSym_qgc_EXLspI1{G6!sl@3C*MS@XKagwMvaC)uD$n{)!aO(NLUjO*y`i=|fxu0#k@LD^_RLy%o zXEiL%>Wn-&1A3CC)tq{3`Y_c9Tu96xggt*2xbR2BF5oH8{6p$<#zb@gGagd3pDo$4 zVO7KJ&gE=pxoXpGyI-_-!r@un;%T$A0e{7mT_}cOXNN)yml#IMfh{{5Zp(_Peba6E z30rB2aX_(!b1ch!g%swvOet?`R|kdN zV~}q@Z=4(TpBJ!W?+*I%f#IB#lIXv5OB4d2Z{O?GFY9aX~+O{=tQ`qQOt z$F}qsYQnj~1{i!rdx`b1kv_*5T+VAwR@3qP6#D&@B5$xXLKjs)#=jERGjtQ3;PAL) zZE3BcrPa`mKa&U-#ifK=osi;1VV3aM?r4fsPbW+1WRPi|&hzT?l5jXz?r^?neDQxl z2&vlwqxd6CiI(USCk0{bI9WX{E1vV3r{yPH{~v_eEWpsnmV6P{VrvoAY$H;hp>LHd zOXR97yk8mkH{HiEVsAMRD`IF3EV8G+gq~o_^c=&y!N9-m{x1I8IlHSAiVYY=RvYOk zwb%q26%6r)xpQum=OVvw7o;B)xZJLXSqvZkx8-uV3y^^C-pw%X-Me~Txw^KdA0Pn` z+&Vu)FQ>zVktinWGaA=K)`GgV!&yUEk@+IOxiE#yqs&$!HWLHVo0?RVByWY$F`3`Y z;M*5vxG%*5vA|M6kktbj>LRlVj9y-OWc=u>SNbFP`bw%la?#Utuyx)3^*&G2KKK*rbCuN`ZDdr!P_*X!-=Z|#Na8=!^?=O21>t9j8X>e#C!q)Q4`87t2okSix) zeXEGRjPf*-J1>We;2@$Ya%fEJbVgyfMC0lT(M++y%|bMVo*iYkz+#7DAQ)yK2f&)& zz@aJNg&zZppkktxvoX49?WwVJAuK>AjkEB$1N2%?XE5F+1X!vRc%z1d2>2V9fI}gBz}-t zpD@`F*C*S2$r@iW>8qhQTZ-Iyh2V^D%mlX#L_5h*Vt%NR4yZ_<5++y0g?>K%gKIiy) ze0+}Y24BI(v9SSTgKdnBZ3vi4a0nC(PH<9g#y}EMHKZA1+S+AJrcG?^G$~usZenY+ z^ui@r>MHf2Yxj`8R9hxRinMeu)uw1qlcp`;{m-!-2%%CspNHei?^yQle1E_1=gT(E z?{@FW0xyf$Q}*C}`2WO}pY5kYkD^P#^S2h-7hh-=6Cf4g0$kL1e4#yhCT?~PEcILx zO9ecPFBP4Q&UD$d-hOZJbfN*cFu_B3d_{0@E}XiOsx`Kb2Ey|L?&ajw=@zBIAd)Eb zN=75aO;)41b;#oz4x0%|t6($~ZV8Y0>|H*C#cshUol>flk@9Mb%5~zUj?m2UW-)>_ z9G?eMZ!QRV4Pb8{fn3lymn2*!Dv#isHXaYE%_G>h(m|OGHR&7yf;W#hNE?;)p z(tb{kZqLI8cB;0Eg%n$PCs!(Em#KrRR8-Y04-VTpo^a~9adYhdWRe7RAr zHZjCbUPMc9!2JUF--Lm?GU=5IFLd-6#8HY9cxnwzmI@ORglk!T)PlpSENDPSS75&*jk3=}A4 z*y_z3GlH@8dzMgY3B1=5Hs|olnqXT(lt8G|A)@3I=zZ_}Z_XXRoDN%MjQiNq+Ptl& z%`M}@xL6>x`ujX5UmJ3u+GyW!U3PWU_P)9~6|L?$8rGU3ry_0Rt$O(8;4dzA)g*GS z|N7*>tzTZ9Y7vmMtWryBDLzS&y(_;Rlj_w{|HRet(5a|JqB77c?`CW3`zKiKcnd;w z8ED4<#f#dZkm(H^SIP27VgpiPvOL_fp-qX#A$B%k_XD;mtWMT3E&JJKj{A_cnubyX z2>1z>7bl@819Tb11o&<}PO2?Bla+#T_^X{a1X2Mer;&e>3K5Rpqbs#q^1q+6Yl9#e z2`?dJDrj3ZPFDbvfzE(C`UPeJKJJCup;`9#{vL868b}V+Aex9!FSY39;1K#gMB>2U zBS<_V7J7o1V@ER*+j(+x{hY%W^Qs@LPi}!mq@Yma*vV-|u-MMN8|yz{_f0Oetaxq> zf-Tqxf+?3>RX!in$faE_rTWk>Lg&}AXKtJe*?Z?YTGA0y{lw2FPyZ;gj}*p&eE?;Io4oc@W-LH+X% zu7su{MIKH{J~S_{A9&@~S$luHo)Lmz#23`G4tO)yQniS-t!Joi?x!hRV{UD6>E`L0 z_sp?Or0rx&g(ff>?fD^mci?w7u1&TGDTb-kDRfc-WU%h#wJ~X>QWBWFmK?hNa!2az zzg<{)FXyg1HqjW&#HwrA-Ove?^w~isZ0DG;ont~(kqK3YGNG!>gsN}Egy?7Wx!cR% zdFMrY-Q4Zvm3JoW@2f*I$;5P9rMiVX>k&FvV#2vkStk7B^6<|V!h!5hhD&EKvG0OW zxWTgnUrQDz){bZ+Qkh;R0tcjKXv?S_Os2d{SPuXmep1AKPUzbV9RVdcTeAmL+6SK> zgei~d5L}dTTl@wtln^^(gjj^*z>r|_DR!jQwAx7Hf9I0|EY4^t0+=^LYh?oD9~?xg zWNMiR|F{g1k1q>kT6Pzm2mkCkxGMqZbeSY)@3<}CfV_ERX;Y+hkP@g+Du&gGR6UhB6FSq~ zAi+ceOsEW}7Q-X2jyN^(3#ms)BcPsx$QaJ_cU1MJj5Q{{tb);+lvNf@O?NKZG?6Xg zA`DFdT3iJ^7%tOdJ(7q>`Ub3h5o=$cHG-1B)3bmUgR-DZ>EmdzYrt7B8nLc1<#W>_ zcXgMqNQ(nTXCcRZ!P7?nb+qXFKVfmT^}?;$wsXS)DIZ5kiNHIs5RbkXH#-KFdS3zk zB5)BYILD!4W6~SQ^fU;$pobA;;KX7qb!8NwVk#J0=&$|W@Qc$C!fdiAMirYp`ggsQEcH>u2>0-(esTt5&cq5uksm_T4SUIJ9kAOa-oEP zfFJSX##)1^&LCZ-l)E?K-4^%{2RKo$lIyi<3EBhRLwS6X|M&+_IB^2_!J8Z>UV54n z*#y$L1ri9O_I(HkAtw|72nh0nGj$+j2D=Ng7yl~bFcYEQ07j}4Iu&rWu&O)#e zG(BJV>xLBW1?R7}!Ph`_VpyCn{3jv=FT{aDT^(jE0%-gh0ClAQ}V^QuI zkXqUSEV(XF$brilYZ*!7&w-@)^C0O*z;MqcFOP+)DcW`H<+b_ho`{nKp$#TP0+H3% z>q-BQ^g4@e<2VBVyu0M`SYErlcSZ4#M3Evzijqk2l(<@5)_vK!LR-{DNe*Mljvcos zlK4*C7`0IcL6E==n!|-%)J7t~VBJ3CDK80vwuphE@I#C=ekcOBD3B-)BB}o_Nn5hz zG({zVGn$slbx8AnCuKKvH)_r2tY9G6d0bQ}AdQ z=|JDj&$MClU#l7l?P?2e(WT8@M`Furz_6BmGUs~@b`9?R%_bJrv@YJ2d%q+v(7?vCD)e9fIk|RQ&NN)2_ ztf3U`jR*q^jr_pKO{@h$Ha}b8!}ehqf4HJAlw_e)<;ztVgK#i8mf*jG3&59h#YuC; zNpposbNuF^2o|bDs1f%8(c88W-FwH&|9mEV7XA>jj!=+7L;jQB4~Vz$1CWQWqkRJ8 z+x}O`3wdZq$=^&Iy!`a+uMWiA-3QtdDUke(Ao*$syEoCX)b09fX=FH*T>{G|=CYo$ zw)xiNWTWl$sbeS6p4}%W{GOqo^cE~Xm}+P}ItG?MkgVUgyVEXMe$vw#pn1(FqPE}* z>u>wJn;RXrCPDL0Lv9*^?0s3#d@FMJam}}^I{EYsxqy{>Snz<L-t{2}+*#hzT zb3-F7NZIrdyl}qm@6^=V5Q&epL8jLHJ=o`05Wd86dp+eSGn8 z;j2OT8D98m$ft`xUii18hpsL?^G-GtTfVx?m)G1K)3MgMmNHkzbeu0S^YKqF^faIP z_}uYN&-bvWK6&-7( z9KHZ)Z~Y@a?eTB%1Eqz3u$mQ~@Hy|JhvzI7+Jg9S!5QdnLT@*lYzEoiNrMs>i3!<# zh0au>HQOku86Y7N@q9=hCoom1i84`2@taaP9K8~`1m>3lr+dY9NCH_ZI(_O!y%Te>v<}_G#)drOWC$y@+w2sy5O}-X?{qCe!E+M2MOe~`s`ldo7 z&kt2G&4-`*4SHKkwNs2%E&($dth7n>=hmf(9!FWc+FVk`NGXe6rKeP+wbW4EJsS06mq>FJsAt!6Lq5{PXq37Vy`2VzF*Tgq)8?loYFe+Q z)i@JqtFniy%uE@Bt7)CaK&muWi@v;Nx~XnYi;ocD9&Q|Vb>-&wqSN9E0BQh93sw&} zG&yv0)rI3oO%A=nYK*Ruz?#_SAW6b8NANoZmPQ-py}k|WED2H%tYx=!H5dB=*o8&> zuUfZa0@qJ#HJ7A%n-RD!+o*=?A!0&xpW6JV$P5zVkmY<_MbXO-%pS{|J(5F7 zR$1NjB?LwFta(d3J%Q`O05WTD`Z6mF!Oh#^=wZI!LF$$Hkl8AAeos>QMG=|Xo_%8^ zFw){vNyI|FAY9RbdM?e{&YfZ03;#Mn{^|Qp!l#BmKVgga{XzZRqbUB{GuHX&Ie-<118zqTc>xh=~K6_e2Yjjq2cB z%nJFk3XVhls*+)p^-y7Th_d0X-><`MHnw6-mtnstq@sgEc%D4EEKT(cL|#Cc}>8#PXT0j$fQu9u7zq8j?2a z;krvGiP+Q&tx6+B)C?USNX^SBqk87_U|CtbkB_68&F@6&?V@fjh`Ny%H3b=W#XPH6 z*g@3%GY~cZa3@g*w~JaWlF0ClBVx6&oOZY<9DQ$njiR(9c0oxgaM9ni7TToz{&xzM zOoS^*g=n#|qM{rpOW;sJy5U_e!n@=}-HjaKXZlAZfMJLpabp-u@QTgb^$(Z<4s#AO zf*~VZV<_O3;NDwwrsG!O744%pbqX5b+0OT98Vacb0S4i3jz*aRP^XY0BGCVikkK0Ruu!xJ30 zrxw^Y(%3Q{GN6j){atQnTRPz%*u~oDDBE2fnd$O6xm3j4#lT25e)CO4@sSPlt;b72WkGM^i>JTDm@t&v$Rx*gRBMZW=u)(cVw~CM?lH_-Vw#r~& zVqg2YyA>5ue}-9;KAJTiI*~O(Uw`cDYz22WD|DAKYgy?|8AJSN#t8F4vXc;v!ix2% zT`h|jXFYvQF1190iKPTCuZ;Evx}WKCV#Wy9=^Q^c> zbJoU05Q`>XI(cL)q$EiNq0y=gj9RRsRN?fo4i#(#|Ip#~T_>iaw#4Ycmm8*E8Y(Z3 z_j&hb2#pceXaLrzAJ)i#R3T0ISTkY`5LR}~z{-^+YgESh?IS#7l~l=EmdfDHZ~sGj zxyLqjodNv5udlCP_g=s4*uHk+B#vW~haEc)+X*Bg4tba)hLMnvPyz%)pg|RkM+t4w zpzE4#uul7{8%W*ObrXSswXI^B(56LV8q+}9q^hbAQUBOO6U&fjz-Q6K4bPr(ZlT~?i+9lAZ5etn_iIAJBlSoqGth_P7FGw%QTUtW)z^ZCtFDU$v3Qxtxek@C47&aVvNMSQUC zJoy8nE{mbpO9=w0%%WFh@&_Ih6pB46 zVvFmFzA_nZo$}ejsZd>al@aYvo*j*P;)6$C>DYMTl@|wU6e=yNR0}G>s-;*p8y!2d z+2RWh9PJHs)Y?leW9POOmo#=slplsFX@<;kKBasDC~pGF$F3o!JmszHQr?=Uy!CS_ zFV#T-^UbgrGB-u40rT!s9fe+5{1@yj!D+C!)SPk!^zX88oy>z?DcJZt>Tx6m`_~2g z=RvBF=4I0R&?SUNiedMZcD2*a!%I>9OALo2xe>z?oT9q1F6b+!@X~vx@%VlG3rN4* z+f;flV;aZf_cQn!(o^e#o?7NSwHEWhtT5j7+go4x`mSncY-cRo8?sewJ2$lB%+}J0 zgR$Yb^LIOjcMci?o#AxaWs9U6LR+fL6O#ufP{YhyV#^B~H>BE|Z02b57JtL;%|7p@ zp-}p@4fe)O-RQ^huC9cmCRkzej^zxVX!QoGDOla$?o9O-SQRVeds@!-B1m(7R)aK2 z*{&&VdFXc2k$L~Pd7fUK>>vF(TF7*F%R?xA+8>$E_{VAU{4&5-Wje8%VV_HHsX2_t zbmgrFE{>IVG)e_j+8|z$?ka;2 z?2NQcV$qh@&mK)zGa8-RQlz(NAxqTtqi0$ri4F8mwRKF(bujsA)ovhnNn>|eWk-$O z1JM{+`a2OKMM(>hWIlHcSP;_0i3Mj7r8SExXSIFB@VH8*3;e$Qk(}vQwNmT#jJA)I z+GjJ+VGYHxl~h=ZaUv8y{r;(wKYuCGboy5>pMvMCujgoT`>~{0-aFN~?O3OXO<(%= zPe#%|di?$GKK|KA`p1voR?W;!H*}qU|488pb?RAqf>ERi5s{jFor)NjU`!mVV(nYW z0jSOo0Ni(EYTrbg?f}r@n(KdKpK@`GWl_oG;lTpBV`4F zF%|itYfYq1h~ZBeB>zUO7&$E;M(0UJ%PdCJMva1CwCX3@_t$ZDxHZ-9+8k8Enn{de zxcc;=*zg-W1IG4O58lCo3eb=wZxFWCX*Uf4t?v`SVcuwz1v+XD!3wp#>8oK zCB@dz&{tbyCue?o#nO?)D~djV+7qxQS>Q zxCYJ`&Z2BW+0o~JcrPfeys9`i&qox!Tju8qWv~99^@cfQSS8T98eyA^qPNXjE zZO}Vh8nxbG^w^wUmphiO32%?PX`R&|fE~IM+w00Z!cKR&NNKHlwTajAVzDjQf3&@6 ze=5piWOe@`sCf6%6M`W1vj2@g^*{Bp|9x^z(my%S1+Uwx9C)q*UXu(^>da_KF8q=RGizMg0jT z5PKv^UCR7yYCT5<n#~`Gfs6=;Z^KC!;!(iB$=9z0RUj znCxcv#))KXxXDS7gtY|IiY^9fwzw?!9SlR!(Ad}Du5cRS^jFe_QTVSB$$~;)L8l>Z zt1M`sU_l|tg5VBRdCi()2iCD5sSPYhYFy8P!fPz(G!DL>tD-b!k4^OIPzwEc@e-Ux zq@KtAsWGq=ahor)Su~&gL8VjRlv+>|Nk*^>UN6PlrF+h9nERhd5$66IMDp69rN80X z|I%LWu~D2y0N-!#_8zlZjW5ImyVw{LFgD;MU>=9;5S*4c z4m2t&vLfL>qYKWAKEXk%>S(;Yrv?QX(-kiJ3^u zK%#n5t|3X5R2F8=D^V-kvAL2s+#>04h*r3{%y8pPa0>}=bK}!TENsq%X0A`bvQS~> z=7g2X8xv+KznCyldHn;Bkq`+L*h!pxuP8!y6dGx#TX zeBc?rvcgwnkmx)Hk!%F>P?qI>xnG>_m+=y(sgTntP^uR|if*l~eiC`$j>Yw)o_xj#ST%W>>IfOWR{T%?Y=W-9PrlnSrO?`SQfkFR45= z@Wu;0^`6dy=kmY0w68JJx^efVL;@t@Ct)9ncuB-VVr~*E zAxRn?TL>JRLSL9MASuG2^OBxDJ?(a0^}U62Yh*U$vy zl?m7rc1Yx<6XDfKu|V{*cybq@s_1q3vV2jl`44^k1NA+e zvi`ZtH(^)8xWm~zY@x$F?vsk_y}S@nYD&KW#Uxq|kL!4|{%)V%BJ1;4+)r z<__6(Hw+ddm$Q3CJ@iGp%_|u-pN;WabFf5miwJ01Ez#-)-PebVk{4pK8)9;dQragp zCgx-vk%J@|Ah94((D^0ke1*6$8(gBvOxj)OOcxyIIh-p-q+yDEl@W?A6u_m5U`3~Y zSIm>;X;~#b^%OJx=*j;-^c|znS8H)v^%~x4`ueHu4K{ym=i=sp6={=R&}&)F;Lfh! znJq%!&xbCvHQx?>i86yN=(M^-i!%~-Q|KE#G`^ccA9#HbD$-%3KJrAduk?bW{pjdk zk~V-V(^z)W)Z1zFb{ZOv!Xp;`$ZaPb5SZ&q43@+~aGN7VwDh5+k6QZB(x;{aU}WW4 z#()_F#*>={yef3X2*wKv;3)LBV(uRpZ4-WgbAu{Z+Gh(8ns zTJ6cyuT$pH>iYTw&}ujl=Bz%K6~+TQoRq3HBPy-xYdd#B?@9rId|IScT%BW(Cc(C@ z+xS}3wr$(CZ5z|J?Vh%6+qP{^bK15~?{jy=y>WkKW<_O2ROPCOT2=3QUZi5o4UB4{ zdMTt@f_RRIA&Dh;0Xl6H#$GnWR0};LNJ4na7+6AbR~MjCl_A)`4^SPKg7OiX#>{E3K$~U<+5DmFe%rP~ z7ds&9pIizDNdM&OOGeHmyWlyAOY&JCgN!7r)z8VsG7~|HR6kK(Sbznk{MiCH)9R`w zU`_R=Etr5|MSwsN^Tu)e4&i0$Sz$pt%a-iX_?RPcbNHGfi*P;SkUT{XE)_6=MQSyG zo<2pd5+h#NS-I(-^eM@#7-2CWC*Dw<$tm?$+_`6y1alU)@j!gXM#PzWuM7`s3oR=> zd|rE)UrRnRxGH0fSs?_z?#NqOo8jG5hdcGOHoNG=0(#dCjsl{t!3U_7gvrCO#v*Kc zF|Cq#?4l&^Hb`2)(e}Eufhg=JUh$|s1?0X6H$@^t169f4Y6VuL6>1NS1ZfiQ;o+y{ z!n_!%GdYn;17!*zca4%Xt8&RwS#7C#Qq;+-Gl4OQiD=P;qBQx4U`R#l#Q;ol93AA+$M&+>yWscM+ z3#;37qxoZb@S@)%bP!4G+i^XeP;@pxOaZA=A6xzx3RQ#{$p%4=X&DozZ6;~hsU{aH z-_~jir~md^UH7V-7vj&be9Sejtjg{E^}&PwSm^08+Z*VDYkN66eT}`jn~h$(x^-`r z4i(=vm}aK7JeYpwjC!V4^Nh(=bGm%=wNw#o*hF>F)rK@~R8i}5uD4PoZ+q5xU1rkL z$h%%_e6QU39K5PLR+w8i${!abV^p#|5qTxQXDwTE5)85nBAe02BVOg^&6j5+U+Aw1 zc8JwlY4ut0E@P<3CUp}?HK#Y zs9~(kz_IX^VntJJO!rCPDa3||kzK9=mBn9PQxrDuBk@YM4Z~!Zq3LIKi*@(|%@Hej z$0uW&1GCb-2eT#3a#Q5_HsQ<_BCy~7r}gS+0R8U9($yxCkB4nKY7;4?8%zK5ZX;)Y zMxy}csNx0jw@VGty?gt1>cn_@mJRo+o3ps^9uT%M4%+aulL|@@+}Gz?is>V>zi4*G!%Z{^r=Ppv^D3B z-G5wrpX~*Dwjm}%2KSse3^dW2Haw$_VxLK3Kvpj9QyYOhW5C-Oj~6*|ypx?IQG-)X z!XlGMF>15@{5qVk{x`%!8((QEk^nL!wLeh@ug~Q3(|53E68k zZW=ZF;H>8>_6F*5)}kpOhlI8pd_@j#bE|#W2i1y(EG;K zlfBF+q#Uu>DM%2Prn39n|3hQ%^+I8xH9)?EvOSs9E*GHkf27^ZL>V#oCgGc$z(+D? zT~T*ge$iW8L230{2;L0-FhoXcnibaSdf@6nS9OlF6JT>BZkK*hOwpFanih+k%S?l5 z?%C4h_rO(;n4!b#fD0Q9qS1Bsq0{{ z$E%R26R*EzKP%H;Ju0mqZB#k`URK!1y9_0s2@S#4}fU&j`U42bayG8rE*!{R$??TxoMY0=QsvZD{=9%7az3Gr@SZk{I z_vkF3A(U!2B7r1Ln|}|WAI3R7Qf+t#zMl}&TIxzX^-7v7Z-8bD`=e)Pr}2gg6b4;~E3=Y@8~S&QC6RG?M|I5voCZhj0j9gch3f!u3jtoj4o?_=o4zc#O570g?Q zz|gNtxry<_M+(2p=- zT5-eRGE(1V7eCA5SA`nhjPsEPJ*gBDHob&7QQtL>v^~4Fm-#AXbC23X-2Ay@QI-EN14s6I6Y)#8CLC8MNid9)1@j@>K`OI({x8}y}{^dL$X%s?Zr`aJOw)#!87HC z`+M)jfbeSejiXysDA6@Dr_l-TTNdZ_M-IpAi*IoQuOf$~Tt{31ST!0Zeb|v5*)w30 zE-PMRgh&L({MHe>TQ*4m?6A(NUD+rc^o_URF*rA8X(!$-lhLq1{)pEbRgPwy9!{E| z8xnn+37juKTeVrM&z;ZQ29T#mVv(iL&y!ny{Tg`_9~wQIk59Ars!E%hX9GUGAjJ^W zbbdSfa%N;aXblca(BK~~4hI?E?oXX>HiRKuR*6#ZPD&MMvM73X(M zkDb-UT+pr+OW<=5L$Wf!&DWSzuwV3LE&Wo z7LDpZwdY@+QzqgP=hc$mv=X}URY6u7I9*y|imEdJ-xpE?4wyW3Kt4{CTjyCZ@xOzBy%-xDG zn!(S-&mYq(+$LXUK+(f0CVt_MiR!s(83)};@KHp|+hK~2_F7+OkHt)rOhw30&NXsg zyFA8{RE7;i2wQM$C(23?_Nr42nij zqk&JXD-hUzNoK48CA<)wC${?hZfs412dX*{OK~NWirThAmHImMyn!g&{mz8sYC6E)zND*m zU#FwT=wGar>}Qf$MPvC+_b`ud`yV=}kU0U&q#~`@1)H^^a|S=%G@zE%AVjZCnE*6N0)jam#x8ff&+chS%(Zrpr46HEmhnSU_`zeWP&YNv6f4z5Ro`@y8mOex9$l_qoIH zW9Tmm5g|u`x&gj@A3kKPOrBQq)Sbs4$SnUBHTqLFF8w8y*H-am@mo*V3GNzv+}EjqQQ~ z68QYMve^qlSdDCTNYfP0;n5MR@hR9eoS(T>o%Gmc{6&-RT)8L)|X4CwO7RfOy z>O#Nw6u3EgWL}#_4;qMR=TyY)zTn}Wj7KYS+VVsc+KxRNNvT&>eU^c0{iIDJG#kuj zawR#)^4|CoTa2diE-vuX8^}{5eB+LSOw71_A&wo(fN3DO*{8&vYu{(#93hH|vrwtk32>p$6GEDSH>gCG@v;jrR}}uI0x4PcR*w zdwY*4iP&1J_lRnpBDE2au+&4?;-P`6oCAvxK|9%1B*NW%J4o1P>qW*E31BcwBV>oZ zaalKWB>r?n6l6LWu_<~quA0I=J1+)8Z?aZGPZ%7HyUs3}FW>fhH9uuJ>OlWUMHP`G zBTy`r3M3>`OvV!mARljpHKS?Hk<4`$!8BIBG+RH{ z{J$y^OVWYaU5=~0oWmQ7HlwSxpFr45FaR{z8P%_-HUfv+UZmVDo3Q63{$0mgPLyX` zPP4DECn#Oh1z7X$8Hw3+5zU9nd(i~#G+Boxx>?hN5nb%-%SMO$q0R+<1 z@$?2M+1`B(=IWYH&T-liuOOCxdX@~9Fh?5^?4M4;JXXky=v7zOzv6hPs}D2*w>Idb zR|W*LQg!8(pTi@JXa)_KqO$x}&4d}vnsHhNu1F}YyFlVJ zuw*(NY}J7Q8?{hVG;Wd+JmSv3_+hCU&2kOQ||YFfR-}Vk0)QL}5#cq+ds>gBHV%|wVD@*`6HrJliN@;cre9$FFbtw@ z{;}%(6Oh)bJ*?c?Ax|~C;7N_#dOqO@YWGj#i#E=@Qzb&($VXp6x}kpW%W$-$Gjclxr)_&H}es&;O@&R%53^o(U94bBBpP3iFw{o3+u$K54%^i+N z5>w~Ofm`Xa=@)3ddRHkZszSPMYXHKYT3a8sSMeFIth(9irNMCtoHs=~)ft;rjLvye z3e1z-)3a{_`5MY4)O#ag>+f@SeN(?MHVwSB&uZs(6SPUkDEVI@3VcN^5F(v9)|a$; zcDQ4wQVrz!=E#cusNuyi3T`VmB+`2W;fQPCGWLr3w0rSy`j#_EEme z>A{M4p?EMtaij)GtK4kA9T9bWgLXLz!V7e4;RUjCmtC;H--jvaP|(>SUp*6+r5jZ( z@TT>u#0(YN+Bir0!zKkgm*4EQEQx~x`jOusgoKU_MopiCnfp~p3FG^-wL4somlci- z-2RHBexVZnS!xd6GwQDP^~1-&=W=Qrs>7k@3etl-_m9VQniO+jh_8Y4Gk;eQLkp6e zMrU`A*U%*78bdxb+#tY=f>rM0EMpuu?{{iKx5~iEVDgAvs*72eE83+3wq6PqBg-Z2 zw7|6Dfs=*bkYIuJh-%Fr7m@|kE?{N+(m5Jn>j^CZ-#Dy`*_jK@CktnVSomdNIy!-0 zPT3*BQq7dsboYc!2MjA6W#1Q=od5@q23EI7HYWmMc1}_?WncO)|71K5WIJ!8#nm4W zRiKgn>oUnj^R_-IhD(?`(_2=SFScR*!Zozv7D;^5wkp{uiwS0PkUWBM(svT7{}-K5 z$ft4i*sn_w_FL$E#eGJjz!#KT%zdXJONQulSF4BevmC3@h{U7BYI*tJ>F{`2(J~tl zVeN(mrGFRbO<)}JJsmwA+j1mF?-of)w zui_d(LVQNQpM7~1+aNbaeMG$@2l9;wbE8aR(Ww#$`K#T!ub z{O3{HLd1tRY2N=?8ez6CLeiyP`=JtyK$A>nP_D_GPVoX5Lro}ow zU|k3ce%Eq--1Ls@lYPOeQz-BLljv3Y&h(9!g8o-oNlg6e82c$gxOewJubg{9)b1oN z$afj1;SLjJ?kV%ZwDgte-9_?Cf-M$V_Z2r06(pp}rTniVx#`2)Rbz`ur$&RNjWjvoER z)o_e1uOj>I2O{~=Lcn2UBH`Z(5MLS>Y=W(N-J}u{yRiPiz04RNBE6Eofxi6c+djff z9Wk$;wJVu!3|`;iUXKrnKHVt3?JxP&>pluYKVZ(#e6S~e8^40TbZu&UF{X@;VJF3X zK_=C*UHFO3806{>-We-=@uc_#`n*6z*CKt&8~LYI9RFilYyHJYOjb)9=)}v@-+5Ql zwZW;sa>4;%a>*GHgfJ|?GoLGWWANMRucly&bDL4ehC#D%>5-CW�O4%&T5rvw%f} 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�RX=}YA@YwWP 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 z zVi%A>*5VXMhx9p0yyypNbX$_47TS9*8tuZ+Jwvw3FE z%)$(npUKbc==e^2|JaV#Dw7{E)m_{pC^D%LRx|l#9R`Jm`fzICg-aG8E@Tl3a+zNs zuo_`2eCJW__CTE%E;KU^IWxn|1ZN;;@U`}Le20futL%7b#57Jc47D8gVUL zzH29A7HmQJ7RojE=8!A-WxpzaWjnmq30BevNQFutNaEPC|ES4=uz2rr=8 zPfa1{k8szRoXJ-gk=*86hg=y8>uB5cz_yuV+tR;8$i7lITMSp4S+h=Ok^+|Uy*tH9 zsyyZm`qz+-{;SJY{|%esN~M#FZ#=YR*@mH3$P(dV{DwTB_zKZaJc9LSiZDlVqE5(( zx*{j)ik!FzI~~AyhvhQAjXCIVYu~$)k4pO_P>WF%6YFa}t z4-N~ozDigZ(@60r`YvKGaRS>&GsDB}dppq0yQaMHcA`BDABNefz1;k~vLilKpXGW` zu0_jDW+%KHTUS;^qX$L(Q7|4-=8_oezbw`x;~>9D9Ab8=&d+kfC*&qx;Ps$q+*jAVJq5Ys1rd!C=`Os z!kjX|L%T9{exTgN#cbGk!pCFd3D+&+N)vg%ifgC-m;9`>#k5hlMhbh}e?Il@=_pF~ z4;23dmy|DvbTLA@oXt$l;(9v6MuQhVh_1{wVu~B)1_pv$8%J`p#!S77v!Dqao7^Rv z_(;Yt%?U}ZODF-^-03Nj&Ls>(a12N4D6VVPhzJSEXc5V%+O(~Ub3~aSnR6Z zWNT5h1#)R#OMfVSpf(Hn#FD=;EF(BcsZ9Rl+9U_xkTO_!zo*6cYIn7npS<1|VvJgm z>M~}SZDxbPupT=Akf6#NSJu`;sy$E-{WbAC=G2WxMi8gw?@OQ*!p7S-GH%4Oc>MnO zmW^F;mW_99+(Hw#%pW~?^x!Sp`oq=xxFg(1!aZNV1?}fooSlW<8c>`YoNVr16ZqFI z#I_;lkfsvWeOY2s;-ni7{IIspH;2AuzRusm%~mlhXD0{I_~&`?0>bX?jF6ZtiD0eQ zvj1)EsdLQ}O2+CoHNt)& z9(^`2G>sMH{`URG{d05sjg)5!)tGE7qIl`qm}e_mryP4HxrrgJ$YnCY-nL${cbf3j zW1Ir12D@llii)8m*ak?WV%fq%h5Os>#Y6e|)>uR@(+kx^Z)}=~dFp(Ovn#N6uuGO> zOE)xY7TT!W$p`{b-Q2iDQVE!LAGJ_oK(L5R8qnK-qS4V7P~2H|SVU0>77ix?mu zPoQ1g)YqDk$3UqQ=n}|_OCT>UfjS-}aPT3);9xNL!+F6U4v3atK(zee^IO=1Mt^)2 zx4so!>VW7c2Jl`IYp#~i(XLwbBA{Dax#g|anr@vCiO`5A7^654(b~Yh0zbF8e|rU9 zTz5}vC--Mm7N6bWGb<+_$00_kJit-l+J=s9QrQBinncr#Jl?r|YViG!+(?EcH~Q^= zo!&hXo83;{F3-+{ul$iZ3aOX{1`#Xx%3Eaz3e*R1zl2x-_=P|GfEB4>7oTmd@I8LE zG<)=1`E9ueHTW@uxEUlEkfcF43E$Wd2GKAGp+8F@5DkGKem4lBL69(kJ3=6YHXm!u zb}kfz{&fiTq0m61JcM?QqgRMuAvC@oHOWiXLOOR%Hz9#}VcHX!IUJ$P2>(%c3b9`^ z>e!I+oFhVjq49-u@IuWo1k|q#oNl7hRy7-)$s$7%zL}q-jslV*8<#N>oImL@DjLr# zXw-4b;fq)`iiU#v6REX^JPyBEMSV`8(dt!y{_hC+O`$ewsU3QYhJtcW!e5%V-FiLw zON3@ds&$AjU041{KM47<2^0msRIhxqya5uS7ZqBhdO;6*j^#l-1mZyu4}iEI#C;&) z1xW=+QJ{YS4D^G692m?3CTItfjF{p?&t)wXe@ zGp&XpLdy{0A7)9}H(WC@0R~-4p%<=G#uwV01r)xB1zsec?aq=U6jgNaS%dc)8leTgLh7pbwpITx^~$sd#8MN(r8xt%`5X_d{?;xqXPjppscEv}nvDvb^@ zU1fkw*JvQqQRxrrhUk=Dk!mfJfE1jW<4^($#ODPGC_*Zj5xxY{Y+*~4C6%nUTZ*?3b8tcjp6 zV$&)ve_x?B2Ry!*h14|ukTqKMG=&iK_BEbF;GMMIY6KU+7mZeff>LT#jWb|ci8=-9 zY^KIM(rb+q)Gx92c$f}iPMr!5I1%k$%F>DQCP3v4P3p5tS%6! zxwO`rc3d${jEm_&)cYkPs1u}C5O9|KATh~@ND-n0O7vJ!Q_Xm16Fk$3!!)c-MRwe! zEVjFYW>R@f!%&THsF|qWAGT>|0I0W==5Wv(H7gtE7&EQ689|@IqNR4(okp5cn+$K~ z$rr6U8m);)Q|u%N^2gK#A|oIdKSMC^PFd8uCyx8A72q+Qno$j@iJ30~@~bY+l)&ko z@g{`e+~qmcBh+&?=0b;@9P_lb(}&a#7p!7>~yg^9CZeU#r7JcwJn- zRxnNu>qnM7{*XI1*Pk8l4kX9AE=n?kU zoz(`~o&!5jY7u;_Y$mJ$tucE#yy!Y$Jlt`HJ|ZQo`uaqGZcG$(R5*K@7mlMl&hYR^ zDLvJ<0(@en?IOs#O3bF(h2#|ZS%m)MZO`YNo-o52X(i*f+1w1>zO$qJzFzlV8v^ao zSf!AxrXuYDhI+HIxH+R`BhEp+0To_RUK(K&!(WZ>;ubHkqNeG!e>3Hiyv zyShhdhI*_^Kn6XladkZhW}z#S1CNv$bKrnWLnTkMi|tS9WwPEUU=&N-L%MV zZ-0{4%LQ6Ygek8bNC*n?J+6?MH7N@>3~s!>&mA1zT`JBbRVK_)<-^HpG77y;y}vyk zt>wvo5jZ$pC>EwaFjzS}or%Xmo>nU;xF*t#t@(Vgb0iY2bcHfqC~sSZ_k0k}_ZX2U zj^VoTJoJhlTJo69p7=$uqwF9&))PjfCVxDLV0xUXM}v!+lg=Yj@0&#ta9)aOAsPgX z))PEDN0EoqTmd{3JTI7fln*XCH79xJk!9WLOxuk8|{~ba%x+f`fT3QW`uF1K2vHrNP?NP{=YeQ?eW5);JrLU;6U5L>_~kt8f&1}$u<@L@6^@Ule2nI_LEl=jweTpyLZaL%4kckl!o99^+!4;sg&bVBd0rC+rNogkH}b z=kZlu##iYsALr3^phyLQfs$Rwi5&?M9|~S7!+d)#)7M1WxO#+mRP=jYmb%)W%Jt&{OZ8~go!QsGIkk)X*L#9fle?~?bz6-m^~XOb4g zK`)_$;%p+k=A^@TCbJkm;5bYlmdZ~12U>5XtHT3CIQ(khgHUt9l{c9#5?rnL5Q)k3auQhF_4f6~e5(AGYvscwMtl%)TJ z>rBgn^s?Y5@a713iwHWvz2ssR@O}NF)z<@+f4a}}t}^}z-j4fuBp23I-@Qjx0QzsV z$!(XuvE6N=4dJ$YD4cH#wZ1dyRH~IE34dKk`~9hOz%SDO21x%-Vki2B!#bh}K90Ho z!LP^?5pWLLRa$Tn^#VdQkPF@eW{DFbBZO{17!_Q8gse)kX$(+nFrcSZC8@HqEO~>< z;$>N{SwsJDB^Qk87|Z{E||uq|hC!ZI;uG*DWUDj)~vH zJC@b9?pV??2k>18LiM> zq5{_{o7Q+{crkdUZ*j0Y)xMBA?2u7ctS~IR(g*(|0y~DGqz^Cl1<&xyPgqeycon%{ z`5Fn2P{77E_xk-B-k25LU}slwB&jsHt#*$|)!r4}*qj)yNW{@TU#x9+dO8XPXa7{u zw*KT;`I>a<;lGU?`JRF|?$Sj!%=C(qcob4AEB1_unp>K{NO+B>6N^zta6uxFP}7I> z049wwVLZ*tj*wOGU4vnMUh++_V_^v|wM$dIp+Yk3%z)j(l1&sNcCz zuA6)+HGLa5y-*7$CT^b^J6MZ-!W7$(Pj5)t(DT%G>dldbnOtJxKy~EMmTYSLKrLDA z@_Re0*>t7TH;=w858fg_3%@P$3vLwR-fdb$emnLHY=j*-1=_YkKtX#JnA@AK0jiX$ z%UuIj@C#ap%Dn@0wET`%7OypVvD!N*&2MmL(@BRUfV7ci!tRb623y_%mrGWX(GKJt zR2Qc+8mrINc$-FDU6j!BsH5o#SyXH*Oy7#VgG}ewb9v+)Ksy@V|2^XUV?X(C?P((b)MUkB=3s>C*Dj zJ!y03in21+u3BkM3yKC#!P&0z&R%zDc+Ze4m(6>XCe|Es2?lk@sDqv&GN?_`Jp(m# zg+!Yg`$_@{zP#L`#xoE60DI6CjFB966DDLx>)qN*iN&zV?q9GUZdHW6aY;ZhHYBu{ z_}1swPzNSVH=$)K_yKf>XtmB{H=CgS!OAs@GaZjujUiSA?e`y=okkU{q;<}uukoej z^Q{_4I@Aia(ujIrY$U%0>hLZ~0=DHdL?768E|?8w^{$Ixd)Y_m)5l*f{HZzj#`qx2DZ2cEg*EqKbYV){5QG&PNNKg#2C&D!I*1Pf|QGtE9KO1J>} zi5v0EtzB`|-PPHAsaWPGLWq~aWazp8%S}7Im+tTjuNVs)0 z{DfAr(L$gd8tY@FG<9cYW6r5Fne-03!K$Yjiz%G&h8&J$xhpZ4VKsV#7Jg#Z(+0+n za{D7rHikR8Mj*YOrk^6(1ux>OL?n+vPif^*dbc!FD&yZkb8{Y15YcptUqMhvu#SJ z)9ELbqPO^Q_)7QjVA>s5DwH%yF|1RkRw{PQgE;aRK1i!+g#!NiAoeEyZ?WB^&{?od ze~Y}Awm~0J=p3qv2-DezRugkXL!}lR3&GP(r??5%EwqCX56}ls%iQ6nIkVgwmZfFb zWmy^WURT88FwkxLItI2BStYbEZ7xRH(--1W(o)lOf7|iW0Vb5f)Le;CFhnUJZGM?q;{u3Z7D_l@z>>Ecrd^f5Q71A@0IERDz)*TPWCa z@Mg-okj*k+Q>!*?u$55k&aAR^FBCS|C{J?1b6C1Fq5WaAr4Mf7BlYx=`bnEso+s~v zxbmhG>)*fZPwHMMk}68^c}i^!xjiAfhCB$!eU!$AUfHzNe^F2>v)ktInpNc8BzXr= zF)q8^WmHlhCdu1?+ANSsXEMsjv`?>ZJlP_ekl(dELBi?$-S0v*hYO#9zM(e2H->wl*} zQ6ZH<^CvVLz?%}ISJv~$_S0U?QG(~074xb4qCV!>^M!(w${T9Uu@}s2E>~lK( zCP0%WgHE9~XwQ(W$);D3D!s08I|)9a(!wdFvoZu;xqblt_5YFfCGc$(=e}pxawMHa z+tI$+k}TP>yvUZkNtU;Gi?_sy_a%G)?WJvKD726!aS}grDe3R= zpbMcF3Uv8Fxm=d^ac`h~uW8C+`OTaoIkrhCyc;<>+svHN%s1cn|GxR=8&U(tb!Wy# zkN)nIT?amhdj|b|f>yY=hfPzA=Mi!{5L9Qu-=d9u5*n9@dpHGBke)|UAPr!{XTe`q z0?pgxwVrvKJdneX{zcaNH$ZH%^z95FO{MJoyR=3`xFam5WIp^v+!jyH=+rWUUQjX& zOQUUOiw0ctMw8a6OHY$(9mJ3bej0t1ybeG{15zcd|2GlX5j@(HYD%F1w3d zNo(YUOwB3&w-O8>O3Biv#kvqq^#78tigigyD~~dD`Iv;SG)ye64FhYlhr~1WnfRym zDO146GB%HfQ2tWE>MVMLMM=u;A)lfFtCXvG#oKVI4%X-CY}>#Ur!=BM{Mo&Lw@p(D z9L8$><2gy~oL1lomDCpJF3lfE3p~-T?1IkpQQ}-?{bu@D=C`(z2NsvTODub0N!b%u zD7!U377YYr(O~){nOh#rE02P*pGPoMIrn$;O>!8tV;+(#`hSwSmUb3~sCo;AFg!)( zCd6xKrg-b+h2R$V&aYEltiGVn0u5iUxAHO$mFqoLi$^clC`^8bBTrB$ggl4CZ&ILF zW!FUD&!~76NdZyvSsjVRI^0Ns=_9`rK*r2{bMEY&O41sWkb)cn_rii0(lC9kC!bQI69_ zE5g183GoD-0OvrGna^b=)MS}$y34imRoMaXE_WNL)|#}OQHc@xhGCC-?w0-V^J?Qkq9`rk54=%mNoz8sNd-+ax0X!DW`d!iu(4A(L%3J_i z<{?naEudv+Bu}a%H8XeilnQMJ)ZB)^3I=}$n@N$t+r-LA8)#i3FZRU!C)b5mic z0sM#jHGp4*?jWxL?QO}lcM~Wp)7(wja?r2Y+N9S}Qdl6oEK`Xy^a@nF$L!=Oig!Z) zvH<=nc<1XFg%2P@pblvIPq>o&DWFrM_{&%l5#65Qi6A-x8Z)oXEE|^nkWlMvdXtMM zC~SyOYwdcIlPAc(su{@fv})>lHKPD8)`|PvIOa;R6U6IZqx`ct4aygs9D$>M0iwtX z-o@eMlW_Az3hE0T;x>$6^uh8Q&}l4$RU-gJNc*M8=<@^ur%_--P80O`6x`u#eqKcC z5plvd#B=Fk9{fYUFINMt^b?=m;q}@n&J5bA0jme)p2KALc7V}F?_QZC+RtaiL5$Dn!puW$g&tevG7vhlQ!%5T68S{&<^9s+4$cHigJjD>^ z7o{Ft(1%&&#x?JiDo$it7|k4_GVnCb8&oJl(Q<;(96k(>>CasjXi2AnaPl4qZO&=^ zw2ESk;$BSYv*@V>^BJux^m{gWT90J=U-Dq-xU>p<BvgC~yu7*qz35~$;2Xz#J3=<34?jgrI(P~9K>WE#})Cv#5pec}k0`&lZ*sP+HfXC6Q*Yu5EdzI$3DOLx@ZG|bY(!_*U;}7+-}2r z0F45Us-X7or!`0HR-2Plxh<5&z%oV+_1T0NoqZjs$0K4r$}%22=t~KpJ@BeCMtZ&? z&r4HvN~7vb%1F?cs|c(IcgaBm0AutKx9)vft)}p;7m?HqU`ZM73yOAMqeI2;|lX$&Hynb%Z2FBiN;Ciok-9KjoV*p;?B+7+5 z@JTdAUIqBJB%4S!E1Sp!yGS-ks48m%M%^+-;CYiqW>o53Mgi!eD1LB$A?dHh;1LRG zk9qJ8>=E%D^C-^ZZGta~pA*GBX-SCJ5XGGu=F0BzfOBXG^$FeYb6f&o#t|3D}P2Y#?mwa|lY}+T~&Y+tUMIn_?5Jj#RRthVT z#x*1DGja9N&)8Sq;9{|NIBEaipkwDdDNri6`=eB6Kls0-;1nns6g}MfacUTnQ2hDe z!qS65Q1~TJ5WpNnVM}DU?lhKX?Aka54cbJ;4d^nPYUPNtx|HZ}D4KzZ%p`6(N?pTw zYx;M!=QWn)%KWX%8eG9-Nsge@IHNt=+nkkU#b%DMdI3$4SRWg%%S#r!4a&mp&mFpY z=FW+RfI(KW`?c>iU%jeK2@T>XAydW1ZeD&SJ$rZ=?TGg6dFt)E9{c#)ZL|OC?JNn@ z7kdnfNL(n6#=W0?j-&N=AKcYnqRolr`eQjP=L%OX3k0XG-qu&nIK!^h8Vvz(Z@P3< zPhR8Dx>WJ1@9b(S?c2HUwmn;YQ!@u!I4vh*jGTsNR7#yrv-+_Q?k>IM;YYuD%i4;L zL%%+osL!kI?(K54baI}U5ATK)k)EZ#L3)s3WE@$8{92^j@utS%QDg?aA)#&@Th_c{ zbhM|+?S@;O{Q7uRxcLnFGSY)^=(&U=JpP-JrY3>yL;EIt7i>0RIdY+PLbw>5P+lls zGmZfAV8uTeDeye|{1E8H7-U_4d`Gk+!SIi!LeZ{N2#6%JO?0qn{5L6BF4Bi8@xBS0 z??MWeU0aJ>NYzdRg^Q`+M7i=p3cf-BM8anN#2{eMJPcnW1>zMKXJS$h+lk9j0k}yR z`1$C(KG!^V&tN#C%!9j7GE~+UHY5)G+c$3c#W#k^4aSn5>mJ+Ga8+Ln_A`)a6k9WP zW8F{FpFGxVYut76v&SDp(PP7T1K-%_@f+ksJbf^ZQ=H3ecd0QF_2FtE&zTc6tMD7J zL#Y3=|B0$<#;>p0_nQYg>vlf;*4f=#-TZccgz7Jq4ZLj+aQ1%i$*JqkS!rCEv0%Y96kuc* z7iSJ}(V++C>~DTMC1$k`yq#K-S6GlaDCULnAG5sAgG(Mg@GPqmxaQC1VTd*>LA2Sq zQ&;8;npO-XxCFmQp_c9Q?_{);TrE2gKq&y`#6O)-lSCWQs)6?fQ+H325bD5rqM)@THzBkt6sOvs8Gb^uP&}(CC$(Pu}u;9+x_flfX=C1crON#!I z9;UJ#3{J8tU%6}kY`#~sC*`FQ`#~yT`6bHMOr%-$PPvDBR zNmq`849_zUxo?Nb9g+raTYI43ptDMk@~ zpjn9)#A8N!1~Z>PI2ApECQn!g$YDS*v*+Oa90V>WR0%75GMy41!AY8V!-+ICBcmwE zO{zRMGeR*+sdpL;PCfl8T#*JhTSo(giUYXa!OKhvQJbd$bHAU4Xr421D(X25h)ZbK zfyi?lz?IuT`_>>kCFE(qHk>NS1s^0fgYBQDoz55-EwO|m${BDfG|0wg(28T!kmyhi z{mOt0SY*GQ2021v7CM#9L%~ePQy`b)|pU|;8!i#DxAuqYCx=T8Om*> zl2OdY)CP^5P%vs#-vp$%P}EvdGtm;Jq0WYra;|dK_TxpH&7|JMEjXU#xGd`nN^?yfu5R~Z}*TCD(EK%~F78?+{d za(SKZn%;t2TWyhCDSo*J_e??iRZgSv=fE&q}nE=6-`WwSFh zuciR*SD^nOb*=)3r^v2(i7}+tW9b6)^(J@j8*syPQm&G{0Y#+FVYRY&tpXaMV_2!d}UoL~f|Bnm4>e|yqj>@QYXX0WE?h{`#GA}1;;$g&x<@_2r~;Sy10 zTz?l#?;opxsZXXr@_d+nI+fo~8Ws{!*55bx^6@q1{rS0!!3#q^It=IHA3Vk_RtKhIo+vVhidFNNtkmn*6EaMt=b%a`T+tj8@m-s?%i|e@jsAGq!?*L)`{FR zuX+ZnpH`X8s*)M3;WVNO%|)YR4*0ppwSCDMRG*aqml`GO53PuT0RQY(l(vtA z=`V?dc^ByUCLv0e1V@%F2}6|)>-C4omdCes-!K&Sa@xX;e;8d&g+?NYbM=I{3X$Z!9S4Tq~`dQ{uY;?KqJ7%v>9` z{scuCxf!hG1Y#t)8MNwzxt|^tdD?#x1*tRu&fR!oP}MRYsyAeEOU5TR*qm}E5^oG`s%7< z_L9A`-wU-SYFy6hWOM%5#*JVE3iO*o%KapB~Xmy3V%&cWbDrV0?b_7)*Ie@f4{FZb!5l2-yQcKb=Qq0YKN<=riy`N z+g<2OJwJZ*&dDkztJT^p&?ghKni&d$-`g9uvQGmr;HrY?)H-U9G28(;?hgwt9+0g_NK%_Tr(e(T&)FjeBZ3|tf~ z-uR=GQZ1Vul&NTn0s;xuEW(bwzza^E`cSS>ko7Pc5fI*5-pnbm{}e%_krOzYI-3QN zpWmS1%#ast2fyswpjRp+pG$}&H=QcU&M~Bsb14stR`s% zsWimLosBu|{Z7A2&RMl)mm$Yv^0%gvYZTi=s94$+sTgZ3R*H%qDbrM}*iqMi>i~d?{gri7odx?>A6i$gx7!(w&Zf_? zIJ^#b&B~IpzDq#So#-piTUO?91E9!Q44jcyX>xKbmw=+Iv}+UO1x_FV|09DGhc6*T zV+JXr7XVUJx(0lf5FGgg#D72*mRuGnis@hkM&rqploANWlCO;u@&C~A_sX>{ahLho zmuR4J!B}JHc|zwbaJa$_=3ds2{w|uXLjTtioM<=d>}ElYx5-rE8fy9Hx6R|kwLl&` zDB{HH7UM*yfh;=-G!U&&b_T6P@{tMv0fGLI-@ilwVI^g40bZO2nM9y?Jmszc!r^pE z%=bmTW1+rwIiz}+u9ZKb=}Zgz1k~+#%idg z>G-tG(;S{UG8H?%{(Dmuyh%{2IWxywIJwDgawONc)QrR(s>Ps@#3Ez216tSwDXnY2%OXyTqtLnN4x-o*bM$n1~ z8jPTTTh*P~il9!==rCXaBZZef4T?d+DpWNy_h~{2E>snB;V|iy0BHRe0BCUNwP0{) z=pAw8zlcS}vtqck8i?d@#as$x*Lt&%wEinVQtGQf(r1Cd-PU!(V0A9bhdOp0*^=9q z$kza+4VBRf+FRCM0{0`r&9&{lMH>$Fd7n0x0Z`h~06=McIGz};v7v`oK6>q9P|EPM zn$c=RSjuVI_CAq;rMHb%j3jd)EWPRJ4F%z@wV=_~fH8R#P^xV)D%As2y6yy`CwYiU zh0CH+ffrG!@TI79eli|EDuU7w$ry9YZZC&X=!diSX|({7{+}yAQh$zD1f)394XEWA z5s#K5O=u?WKp6~%!l7+tFe(b1^p4DA?nJV8O0#!LvvkK8qTH( zXTz*4yd#Ev56=MfYts2eZvej-#3gg?1W)}ln2<0-Yz&$k1~P_U5G6;&G*KAYLvKUd zqhiL)O_(wI3|5CAbFZC%WP6E>&z{g_j%?;AMNvOH4JY=KFouE>mXQpDLX+7_C$p7K zW-6V8gNIYXNCL`8HCX^4dcz`!o{0_fniPy=LHtkgz%Gau495c!%=`mD9u#LP5P^Kd z*9G!f=kqTj`Dd!O9oaPTFIy`7ty>zZ1_6>^BO>{HxKO)ks@3;9TeK&VngUq9YHcdu zZdg|zAE|a6*uQrl+O}d}e<;v>O?w8*cMX=+?^+G8{FZph@QP-qh~-BD^F(L@hgxf^U5*+N&BNJ%Zos{dh-kiEva~Hm^L5j?kbMJQkWd5?01wCl3nBdi=6wm) zL*5+_v#3(e1jGO!(_&=5fOB6K+%HwBkn+zSrqoIshQ$EYGy; z`N5zgT)FPf?%r=*-3ZjG+rQTc@O`+jW1_Tbye^kE*r8Nk2gc@`OA&s#i15orgs(Zy zOach6IYw^yBEr`Igg*%pz6S8q4PPDMzZu*9pPm+s&Bol$?q#s>$%F|TstgD|Z4+^6W9gb#5c74ueK z?FpA?^{qW&T}#4gg4q`!+k?G$Tm_B3wbLo_3FLV%T*2m>U0aC0snj_IqeCx$kJYP4 zoKVU?p|wT}FE}`vAeS7t^Kdn3oFb&|O^c4c#KX+n{bazJBm1R(Zx8Dnqk^2XlsFE{oYKqcjB z`RuJ4y_zDGy!zGp)g?M(L0zb1MLej00Z=eP&Xp}6i}c>uooBAyIq*38CeJl;W?n%7 z%&51UjOthFr~2Dm?#g_@;x@}Tt4^)s)U4g6&u^WGl}_xqZPoXEFs=xow_Fjo@5|!$ z=ofH%B4Nk^_fG(5e-~ozNy8@+1%5eVPna^0{Sye+-xcBdBx(30OP-6dI{M$n>bVuE zN5;yBn~NAA_Ej_;NDft3^i|oN^&1+uL&c6zs^zKDRdKgAkSr`&-B197*TM#6%Rz%K z-_@08kF*t3jV5!@z_P2m3s|EWhWykyO#p_O3zPmpL&!vFOgcC}Zw@!)Im`0|v)fE+ zOj<_Isu{ag=cya7DPCDupv1{QvJZ@E@7(A30U`$g)NsbC8+I`>=-jlAB$2`y^oayx z@L9qai2@hPDqU-p>&0bSg?tR+^+jMk!2+ZnzL;8&RLG_UfIT}c_T^~Zj)`#n0MC3! zrgIoz%(rwtP!CC{*P^#kI!Dm%4%yY;0mF$(KZ>QliEczIUG8_XjDEY z(Hf-`+Gv-IHDR5z{|+(x*xbjs0FY2p+GicE;yN;q*()T>9-Tqiget%0eLxiX6T$*| zx&mAmGq5RV&HE`a3n?t3qf7k$GDzL~Me{BklUydsm(Z}|k=}4`U4fb+M1G<4#X3up zqY1~I2hDzugEi{RX7s;c*keMWQlz)3jbIEn^4wgQ^iGWQX_9&n>#AQw}Tofn8hUDnR4OK1^Q z*$1JJmUK80ITy8)iN9x9er8k4C8l0usO*DOCb>4}VoEznCjLGz1u}WQva#2@2w1N# zUUSc2^R}J}56cA`H{3H~udN8Oa*R^Sm9C;>VEI&&2h*3=wfI)=>GnN2w$4^vS*o{} zca@edFBZ@hZTm;cUGe^{2V0u%zIkg;SVl9fNq~!}lqzM#*zS6jfm0TC@9Z30r{D~l zH3z!f?#ktmjtb{K#Wjl&b!`SwS3^Y20gih@n4s5R22sOj08zt-mqXO0ixIU31_@4I zMQ98jlgr1E=nrNuavaZMhoBQF{s-P_GO9j*iWZ$|SsLHq&B=jtInct}3i@&b=u3#G zTal|I3vU?1L<=vrz``3ngTeTeNz4E+WHebF3HvEB__}Gb>Ge$KW*4F^HS_ASsZGJx zQ>IC>>Gk=(U9ueY%C=rf;xB}Vnf~2Sw*H&rneq*-sYC~UTsmzG+cQNPieFGhvw1})hJ zTCx;rlwuqoa{#SWJB_d`5{ILL&(rJ86&FIu4{~y3p-J;a*;1~t!2D|fX+sqkQaQ;F zQetwM`C>|TIgUXr##guDzKOu{8lQ%uFhZsz72a5TxOH<&E@p@( zn{)g2_V~i1hejKxda81{C+xA#;?nj~)A(9@byX=Ai{G;Es?`w{%hF1QSL@9hLd~hm zNB1_V!B7Zw?`&Ll^LWfrwQAd~W#hMWdpwoPgF}-_#sJ!=6SPqWXd~zcSd(2VQ3lA$ ziRlvxmE|Hgnfs3=@Gzm`EEiMUB$@k<%OFGIipa1dFnIsQhAk_qyp-k-|^iwp_ zFpsbnxCzW#e@m`t{mmy8G&TDSNyE)oY4YuNIlYR2JPehSK)>e&J5N0)15ayt6C;x` zCZ0F3GVJd+D^SK^xhAhTf2Uz5@umxjAGl_*JE#FDU%q6wr@!9N?)Cz*7|d ziUQJe1>j$)FV5$pSu5RRqT~- za&x+((9hWC3Mw~0GFCOx7@%RWE&>RBchx{`#ZWTGo}66fD9ZCdu`gh7Z#Hqqz4V~D z-amY3B#f@;JupzH(diT_&a7h$YMBm*v(m0;VPn`t5V*mK&H%9w00C#=73q&KEZDgf z(!*G0>_Vw8Ms7P61X3TLhSoSB^^pXFsG{$OLZtTskoX^Dg~Au4y*3nmA4q#r>%AaK z`VTHigRfveTO6HXeykS^-!s~>wL9u!SYO@xLu0uOHF@F#+x9ir-M(-8$`ZMXp_OW_N^52)T205s z_bxL93Rmvz3^kWpeWvk)-8s2c?NG`OgHckucs4hYna!=q%;rW;m@g~k&61Qif2ovT zFq>Noehiu3L8^h6cl%fheQfrxpl1nAgFU3?l=FiAN3=?o5%fx}g_lGqMABzd z8-1^*jFWi$jTF8_(o>fe^wgKn>9)V{T;H9e#g3YxnzGJ_CAjL~VE^83-^R@~!*R!p z{lh~8`cP|GZ?Dr5?X8To6$u-sHf==phaPezC+fmoP1P15R@;_exn^0wTR#}-JrK55 z)h|c?9B*$=*h>n7M(=o9?}-(M&BnswN_T5lXGT`lWazzDvi<-v=Z|ZUYDn!GU-Eso zTNeEwe^U5BwvgE0c`cTqba(Q7aSAv3K`MVzCVY?;;9q_6mRLG@Tf^oxY`T9uues98 zDlm$M4uP#jUE7y=P+e)fB`~t5-BmDj_gKr;73FTt4=td*qRWf)+QQao;}jN4-f{EJ z-eQG@Rhw)&69cG3T`{(|0fN}jiXDy3H;Ln5YJbrhAh~m^mir5uORS!(Pao-mun=jH zXh)9~0y1%6g~t)4c?MM;XL@qL;TYMQk>Ah1Bl)*5@ac4l>4Baf%Ht`J;7ax#{TJQ( z;=7-{@rILEN2_=L>z*6I@pzzP=l>(_JD}t!&UL%Grzdpxbex=X*xA|1o5QR&YL!+w zBY}_vVk{vL0s)o~2xFV%1Q%n!WBb_#46#O?z`oFO?SBwRd(hYxwr8u8m#_oJ@egzO+P0gDR)@(0vRc&o&{mk0VH4m{; zdxyHb(}I_GmZRmJ#4-Jf#^s&4_SlEihtMKVi?+zK953=D?ytZn8y9)bWSmt#hEpH1 z&bHT_`rcb}VVmTEv!>3?qZtOiGfnDEQs=6jz31G#vBfrW=u;=i3^LG;$sWaI5Pdd_ z&u%vZX2X}RI4_l2)ENrJgGR|~lmsfp#swbHVxmG*7C?6VwMY1z8q{;OAh_I2#OZ+HL2t2-nk zO__PNIKFeZ=FqpVW~JR#cj!BJtYFqwew5PcUH$7nH{;L;b}aq;_AZMrz?&^TTiETN z>(3_`Lgh7W$e%Bi45APxX1grN!H7GvV$Vp=g-bhFlFqMC{rTS0>1Yeaf7@p8pSgzr z-k-2x3oWc@4c9GWR(>c1oKUT_Y?-YzZi)O~MzcwE?E6iS{Ppw#P0DuA zJj8)}YimDKbsU(lul+QaO)b4|BT%>0Fw(&u&!XyT^j-18EPx1$%4&>zrzJ1ZRcXfz%JIg5^i|7=Mc8?=8uw$(E zoF2apJNgO1fJw$S+uKPJfYN!Ng>wbX(~s0sPY_x(cxpeaw+0lnQbR!{go5B4C_Uj? z%C0;E3PSfF3PLykB|dGsDcS3G^6&qg6VWzeWI!}29win-CPY|v&8H2P{l}PvbHk~> zQZGehZD=%VATQju~dRFdE%uY=(cQ5-Pui2l?g5jAOdLVmMQy z{y+55A|F|P_?tIv?`B1->~&e)q8|Hb-MvBdARnz8mth~RZ~w=o2Y#UXXmy`E5Sj7O zf;FKKDZt{IaL%E4jn*h$(0w!0+CekOcRi9u8 zCf)2-F-WulgP=I^*nWw^!;62|*vP(%jhGEQvF;j3iGCDFfsLhWz$iNEnarntaPZ2z zx23X`A6#=4JpO=pr@9wqSMKPs`TDnxwy*3-I85Z{Z~N!5b60=w-EV&7U3@%z?wxyA zwmHXd`eEgZ&tKCS893*X>xr7b8N@0rfWxg2iTFUo3nCs6c7uouM4SMHhPQ(xZXFp# z%g>^^Frx;^0s>V&k<|F&l3JA~HCB@89Di~WA|c-AKo2=s^vOz^?HL}iEn3oS z&kgBMps&D08YcL}HzgpUrI5af@Uo;h2@ExOf>uK`a*GqGsZ;?Io2Q=E49GJq3ma=o zC4I*$@GJD_J7$o|nHEd_<*stntG6+#tDJ}cnobAM&ZPHmMXqw1ryNFU^RlC2=+ z14%F9wJ1;4Tvp1!hI)ey+w^S#%yvMg>u^qOk&Z{m0|cv9A&XcnSi~j$v0)xE&1*=n zW{Ssr7611^-yD~`_g7!oA$v;W#h!EL=Qy;|LefS@*V>D^RM7XCT_?!G*+E|-WR!hY z!6x$7NZ5fv-&MCBy##|kye@N+`VvBYU_>2P*1?MQpo(4xazfA_J)-MWa~bPQ_2U(UWeiJ3ttjK91=qkOR>JNW1Ww*z;OX z;!$%eu<`h=GQ8|6V;X}lfV+j(Jyeg3PXIGUx$_=nCl~rAuwmIO54XIe0CI;yE5Nv&$r=>-lJoQ1@ z3v-C5+lxr1L`3lMJ|j8)&L zQ9J<%J$w!Y+4LzH1yZ6R;{M<#Ve+rjovL@_N$Pfp8heQkRGk`c1MyZ&B~M|U`k<;( z+cdq|hCG^B*sa9IML8BqEj{(EwHB@#aRC>RVPbO$1+k7ER;kQBm6~Ef*5W{8Yvb$ z{wJ3BJ(zS$oUA=1iYn<7eoEAy!naw(>vfrkx~E>F^a|FbA_y8B;$Fp$a8?bKST&k2 ztM;An`1*193^uvWnue&b1h-&HnZDyi*H^Q3!8KGJfPf~YjGm}5#9-<^$Kobp;m_e&424V~tM9M0Fs$>ujiRRj9 z=)E!rI&$-K7v`u`4!~g%&RGeb4-m+Jj}@8fV)y{+30-LHgO7G0JSU^aFY5xWUBg}5 zx~NDO=$a%`Wj+%H(ehh?fT8uBCNwEBYLg;u)e}3-!fpYpQ1hG3H}(zKJIX=;PL+_y z8=N&Y;pvjGK3zKNlIYo7-dbxOZ>gpI%@z~#cw-Yi%L*UE<88rB!+` z{Vtn}rv+I+`&szJ7l$;`eOaGZP=xB%xzXnsn-ADET~joPG_an6#83m}dq3TbROVDeGa%o%ktMOUc8h zHsd^8{kNvbJ8&MemNE!a4&fADOW910fi3!rVT!D!tbr*TaEgLb@EkBn{+3*bz4+=; z!zXam@cU8J@TY`*;iu@UPm3D=dtfgJ@xAA44UbXV7@mOLh zIxdNS*_9b=&JQ&y?(ASHKbVq#xZx{1I!fDb+qCYs9i6S)Z`-pi$P6B1Za|L~swqsje+|_n$D-Trgt@@5_`fT2Nml!2w_-k+eke6-;TtZl z`QoL)FU#iP`H|uF$nbEao#LI7;O(-D;K!QEHrHs=(HDHL`$(UU&OX_{&-PNtZho_oyKbhJYFL?3CR;A8#SCoBE?XxoqL0;i3s9oaMNn`xa3aa$X_s_OVwkKir2 zHnrr^;mpFe09s*XIDH^LkX*RTksHm98X2^R$QXu}uj%fI^yPwZN=Z^Q*W5K4>)qJn zUA!nURP+agK8m++`gvU~t%_Z7c+Ile#Mv#pr#O-t zJzpd#Z>|h`VDwa$JWdYIvAcu&YU{4oBD=ezMHxOc-tiS!2^uL!DJ@E(XyRjh@w~|-zb9O zk)|d(^n|pp`|*a_*tmO+eZ8r8qyjTap(iTRKDzty52=run$Uf;eVx2BGFBN~v9s*v ze8nXfFR*8t0-O=)Jfky`^|mi5I6z=s*YKup*R6b@7)vkmDUr5lyc7~z+BS_O+O~Xl zJiGPWmHkoL$ZTqq`w)6x93ba&j zHglAo(Sv_L)JBs!-YU!N^uHNRdZ_fxMskne1J%BfHrui9T#~#4ww<47Cc23O>S!4Q z-zP*O0KQ*lT&&k6!vBovN5L^TgtmcWWsfnHr--l^Cf^8y@L}sdq0`?`(wt4&!U3PyUj30X9u6r=AQHD1a~UM*gRr&^!P-J-_Wasz3MlEw zKduX&lx=aL>@Sn2%AkA%ZIXVXd7tBP!)!rs@Q_nN40)tf>kh);Zj(VBgG&vn(dP858>zko$2oNGRke8ss$-f{Rg$hr&T(GS|~uUQ$gW* z^5rKrw0g869H7HTEAZyW-DyH@4Gmv3I{$)s{@~z6^OsyycHJZfTchD(P*mW1Bno~r z7+JJ`ZN6por^n}Cy{_20{>u67t2@1(_T}w^>q}N&*K$~+xl`|f>&P!bwAx-nt4GTW zhN~ZV4$uc@VbwB&!0HDTeB-RKh3ZK4I-}&aqR6KRspq1UHwpZff$Y5%fAXG6?Hg#zeKiqOzhKUmUENt$ zX;#IRywbX#wzuNW2dCX>mbkt z6wO3h2V(8Z+T2RG;7jx*Z4al%ie3{hiB6YW79?JD1|@sMWk!s@g2L(w>2O9=1RbaF ztiTx=MKU{6JyCBy={4$H3G5SXIrSddL*9(B?D;cT_A@msd!Q`a;%vppQUKqK5URR0HZ4*)uY{_hlT4?8?@C$oSt|DAm1 z*-4jYH}bVW^cTBzP&S!BQtok1lys_wCaq3SOQj9K0!74in6UG@Hcn8<+x$0N;= zX3jkcCCfo@sL$LDCodwDk0Z%X`)$B>Z(Tj15pMS!Wa}&5U4i+NnIo0tr)k^0b$xZ# zctEjPz}7Yk*DA>c7nYm)TRcz+(0aYe9_vi|i!s~i{FV;8Bq$cJf;Dqo^}m#i*uAko z^kQ*&r{82YGj<0G_{|BN+1=#L7mb1ixD?6Z^}25az?mH-@EZJ^WE%D;goacP_-Fx5 zTo{{;fsK71tOEvhq`MLcS`2`|-B3lhgZA&8sSfI+d?I^S1?Cq5cO#wM{=E;WgZk>w z8PRO45zMAT^EP!4Ztn5==3lwql8Sjb~NFj*`LFpHu zM9k~}0WWDN_Sa>Ou+pLoj+&cqqPDVNvhpja!!uu<4%dDv#iD|Dd74x#-YL3RH}{!wrr@(Klq%QBO0qs2Igf7f}y-w*olYG}X@!L9HCXZ*Vr=K;F^ zu7(!unA3nCid+#j;H<45tzb6APq9le2A$!6vnLPQ#ywc&sP~Kxpm76@-rkE)B<1OA$U)JkLb%u+Jz5ZoD7j8<1 z{b?s-b-Jt1DL$8r=NxXoEcxtw3QBnx)>r`6SQC_Tb;jmQO@hM@5FAI8kd)hlehBC9 z@_1+@?Dxd*KylApA#X&op3b`}FncU}PbCHig?r}8I5>Scn7t-?8Y5r8KYGO)PqE3v z!5Npy5zYkC{Y?rPSk&CJykHOYZ|)n|)Z@8H^rt+oCa=Ic6F%PnIA`q8)=mS_S2 zxV4lh%#+7?JX%T^rUY<`7o`y3)Pht0PVJ;igtdmjlv7XOE%S=Dr(Q848<7YW88L|g zKmof`v#1Pa$H7I^EFqe=cq}$IOBty{G;eiVt!|Do8cikxWkj@SCL^n-47`Pf)5C4V zI^BBRV!}WOgdNTw<3xsNBl?IDVhORD*hFk6b`h5o2f#v%X?KoaP+3uFzvAlds}mRR zY2Fjqe17D7ys7{_o8s9R4nA<+ELMtcI{ZZZMpAXhBrz%%G(bp!f*7v=s6I-_pSBk+?eR9`6+a<9P)@Ne*B75cWT;0O3oK2w?= zg=e>AvqdtXWvUwB$zRZ8zbR&mE${^P77uxXe3||$sW(m#sDIx=zCeD1{v*6Tj;(*| z$fwB%={JaiI>O&iIAVy!UNkSsZOXltque=nE*YGXC&|xDB&Upfv~8cTr8a`hNtMuE z5pw?AH*%C&%`FF~Dk%SPV{)ou+*8~2+2FFEH#E-M;e;21nh=~#Hd0RGz_>Q@K?vrW z`o^0VU$eeY+<5Kc{yj~iiDykN*0rKLGu|1zc&oQ96Xis!iRGvj0WW8;+oi(!U*2@y z*D4*MFdwo6e4;@NL`QcF-S`=kSu`-5O|6R;$v1IbJVey4*Wl|(TsODCy6dO^NVqk| zKiZ7=<2Z|nu+URxv!t7HOp@0hlQ7?(wvag`PUAY^%=AO10$}0*_KIOM~QS^Uuiu^tO1}yU< z+B=*ePvG``v~~>~`1*(1_0Pyj`fu?1vHCmrt9f>A+`bI6ZraO_ zb>vSeH~l~1^;25@=gIxJ&Ys5CtKs!NeEkz#hr>|5I_ZB9Ln>qO!w_(+IUdPHa%R^g zxS?z&%tApZ*gKAOyXYhmGP_0ut9nSOUfpWk{gW!o7s{UOI9AafI8NK^bg-&3RHGYr z3@@S}8S_z^-5@@LNwDD6M!O=> zdFxu;rIrZG7;T)Lwe+T2OZIr)6B+A_QWG6(d;D$`Hqs^yNCtx_FkMAg+~?w?SZP6P zalF-I6cmQBSq6EU^_F6;nBNKSwW8?dI#_qhaNRwl)#cOV5!`k^#dYa|_kT+N8ICWV zDxRqFr3k56= z!9+d#6lD-xcDI+M4dmYx4w;WJ zm@-~6V+2Dsu#+#Jgvvp}p~hubJ~mY$^1w#HM}+891wC}!Sb!SylG6-e*oZ!td1B8?1VZIy{FzaRncEEd#$eV{V@DR94_!} z-YjnW^45EJx0`=p+pU{(x41jk46a|_zq-q(+rI6qTl28kKXNFg^KahJwq-Oi{fE%d z1z2}uT@L52DyDbEk?s~v0fjKRre27FSWK^#GhQnvZYelvt1EFS2FpprU?aiYGlh@O z6kcnj+B*bK+u&)Pp`@|mx!oGP%y78?-v?Yzn`jiAkFNgaJ-6Ja%K<4{;`r+A!hq2#!gx?tUU6pfQ{)(lq0k3WYMv zR0mS6mZ{91`s%xkR<+;&UUPpJVCIlxssgijFjE!u!10V_s*>3=Gj)+0{hJ!+CvBy0 zgB`{yX`CgsIXwA$#6D~cb&R)lZYYPM{p(wO-LAt7L&1&*SiQjO&5`!59v_Ng(XsuD zYtl=4n?yamf|WU)-D7VW+uk*>eKf-JlcA7cVR0;)>a&tVwh6|L3%|7foI5V+7H!T* zR2#M72nZ3l8p|Tgp*pcg*hv84jlBsrVc8U(dVvFH&_Wv#De=qGngBdZG{MYfE)1oB zgHmuNt%M1h8`qnq;2aKeR3X6`3f~h3LFL}AzN8o3itIy#dOle}On~XyJ@R!#;e`AR zz{2VSwR7^HwX^C=AYD6G-x-baP#ZO=y^#Rx2!;@$?#HhN@ZkAyEddsNR*7q61CF^R znkmQ3Z{y#?C<3C!g<1?5=25T~al6CX2{NJ^)somq37a{ISNtA6Jx3!6tU6}L;@}Kb zSX=T#B%^Q;fWL2cx!e(%uD(yJhHQgTa9d!h>38*<#bdX-IGvH528bQ&53~^lY0`r& z)&ExOY2>^0+I$GiM+sO;MRWBh)f)tk(6k6dM}$kYmmD(y^qL}JgM|lEW~?^gtDV4a z1{05)0aOyIZb0uN%_st_88ik!JFwEV1;<+icdgj;E7O<4o-JuT|94vPa5*q4Bf3-% zf@5hX66SE0!7?2#A+^+EXDMF-o%t@UvGJ;`#&GD#izn6UFP$mpEFR-}&DZ&h!^%u+ zsQTHiV15#npyV|~Nvybe!(V|3swvUNo4~&VU=STv#7FH@hV22TsDGAv$sk*u@))CV zCh|Yv%fUZb>E-DkQpo91r`N&rr|Rjyc3I(9NYihTX4xg^X-+bu*bOQkC3;kg#xb@q z30B?TldwDrR>EPr9X5>6;tV0_a?X*zm$fQ5EzevDtl^`07~(_e^mq4B_Cl;UBbwx2 zOb{!^WVgd1yeLK#pd$@D?8gq?;FH=dZmWg;mf&$YB?vYImsLdl`vVlp#US||;IrPr z=Hk*sbv=!!h;>GqeAQvq^G>Duq6Y%BbYZ{`4%cKBj=dTJCj=r~8+%1R0rho4V(Z(GomUbMBXXFED>!#DxY4hRpC)Y>beM?FX)yl{YG z2q`k9*F*JcMJSbPoJXCk&7<@X55hcFsDo>{X3e8ed(CYlT_b+jA00VwXoZn?S&?FO zN%y+5{UaIYE#6exws>Kz5R!G%y<3Lj)qm7Q?^UNo$H&^oO3{MDQ2oFfEy8!vW;R4C zF-UwCkGCy-L>nAvCz75%384#zr=@R-kN_cxQb2lLdPAZm$=*8^K$2$Hq!FWx-3SoE zQRd~78XokvNPTdSnf0uRf=>r}rz$hgW6lJ1(Ak}847C%7vzpWD0Zn=|q-eL}wO2IJ z(Lmxp9cPn8uiLC2W9;50PdgfVtgwdM!hOD^kQvQ6q-cBC;`cbr!zTJCp*ZJrjw}o2 z0s{G(Dvpft5l=R(R3EEX-0vJR1&pE6U^3p9jc`VHB zI6C3hx>#SWi#=Mqb)0tByBJm~+G@wlSf=%^1{HFIY+Af~q`$JTSuc95G8_%;sjgVO zD`}@Cmtyh2Dc0Mg7cYrN$99c^ztz-1wY#{e=yK&3=E1Xd6@e@j>MV@tCKjPLc$8>^ zC4*Szcs9&Zb3hMN`+d0dACkvW%QW*Qa7bt%x35hj3w3JyLVZR_t)p1QYqR7UyWI~jUeE!-=X81@=(&@+mDKZ4OF9HS`E}}ciWYo!#7#<(e=;%1!p)dKwMy2` z$yd?DjntV8)6bCYD5@fI;GBM%>_#MXlu_h0e(a<4x1pwyRc_D+B_nqYEvuyAD#z?` zm{68$RN=MPi?u15nF)X%l9fFczn5O3Ph=f_QKze})U7i>84^U`vj{p9&r~~5jnDky zJ${&a(Y}^LVrxKHP3^`C{Lc)^tD|*?Uk=@+5EL#-R&2B{h|#A#>2T) zdxzH_7?0#uU5?7y23pB>T?G!8_6N*%H^r(2p>RR+nF1T(>mxRUK= zwmQrRJbUCJo5*m_8(q$z?RM4-wm2;or^`xizJRm%?N-BnIICc$JFW0nqo9Lapt~I6 za{q)#g%n&1Au8SY<7kS}`0KNr3ea^81FB91C;q(5BF?5FHB9-2!c?HQ|f6=8$Snbs+Ur z*UQMCqwcgCtMh}-*#@q?nXR@di=3ZczIQA+(jGN1v}_C&hSTSqx8t(qtR%AIO+y8b z7%IhL^9m6oYl3f^>>N#Aaiz1lFPdA@>LnfR>&p?dVlfykp0wgn#`{MWD=vp(i?@Yb z>5#?dw8<{JjWOCR{PuI>1Eq+O)CCJeNLGCyO)l462uJJy5t(qwYyiEwsX}>eENieC zCQ&33#cfpyz! zz3*?m@4NPPxD+j*n^L6Ch=pG+-x0)tuZ$rd`yP5mdh{LiwKsGQt+O;P&e!O)T7y2< zQd@qL*A*&SnV)9PNaOF!&c1j&t7>+Wx2Z^2T+`c7WK2#`sk3rZGgDGiHg0cj)u(0i zE$JBx7yeoh=B(NbhS`YsO^EjexJ#XPtYjh8yre{(nol)PRj-JT{CLgTcg{rqQ~a9W z$GK_l+JW_*UTd}~Z*iM%-O3HdB(2`4$t+r0xMs`p9IG}>IExqoSTVk zal@L@G-1UG$NB|T{fE02?{aOaDNfVsQpulxHs~rg?yAl#Dza`_T~s|kGjC?ArzSVA zVh!1iS^RvVQ`N)G0(ccDLIM%a7L=CJZDb&U;9%{^hau*$<4}|l}>(#VLCrYxDotjai!c6ZoXBYtuHAl zD-#ud;vywyM0S2Leeao9{&4%U;^J$4$7FE{{YE?T#_Ej^J$UdlPUqH51+{$*^*w85 zZ`#`Hyno$>md4cLRb}^OZRy_J(skpOPC@J2-PgB%=M5#Uy0Z1l^Jgz=D6Q?CZ*lS4 zm#kS`nKi$taEA5bvE>`)6}2r}Ra?VRKPaMpFb~gd70+eOT0tFQ)+}{Vxy?W=C=y=d z)ZC01Z(w(}D-?Gqj`ia!-zAR!e#cFD8^;0*Thr4_2-WP8WyQAb)w6`TuG+?)s_Z#y zJ?p!?)|}mZN>Od4#afbTE?R9_u}wJF^4NjS6eNSJoEZkAp`y*bBE6u{x@GAy>Ld5p zR`oXDkXNy~ps;$uOo`aFn)?P0{+;wZlW?BN#-s>mVa#0Fn4fX%0plYNwUSxYH`mr| zugb}(-ceVxqbjE_t+29aer0}ATH&&y1(o?mA*pr$jf={+?(b+FAzw$fHt(#-D{XXC zHM_~z9`bv;xaS3}=)##c>zHZgapCpnV$QXnlI*+&=UUN6oNHR6?&1->$)q3qY+91m z_!Z5}^x0{9b;gN|)U zHaLXf4#C}>;K3niAi*sR!6CT2yUXD2?i$?T8*u)ge#)s>u4YGK{>q!ib%3Eo`#<(jz6w(@E1gjQ!eZA&hUZ zSYwZwC9PC$2EXHa}f z7K4xKQBDJ&iLDc+GOP&gBrWn{wAI$Cy%b$NNl!tlHH}C`VLIIQm2(HGamaNc%rcGU zDlb*A`_r8*jW~=*sjWn_HD~MJnT{AOiBwh23k2hzzRo8P+33nzG&Q z^wW;=){(|@*k)+BFa;7PLongGZU{=Ypf~Bs_$0?4C&MpLZZ;iAphT(D%v^q%)={Y9 zF81)00o|Z_zigKL+^)fH}{lomUVXi;p`9K|Ckj}2kL6c&WGB;mCPavr0 zv--3L%k#WyFYW6mY1omZO+Nf_EghW%3+mD&O$Hj(dxu2U}fSUv58d zkQ8fLs}v*phq1#ChLx0@A2aGjq}80rHF~G8Qp`SE`sU;ZLiTMHMDf zr?s=qaEBv=3bG8O2Um-eO{GXv7nckvxaBs(GQ|r`OpKpbF{{u%H|~A&Ij3bw19>UR zbNOc2q!T&?-$6$Z8x9>Ll+Wn55G!wI_s_+r< zvS8q=FZoe!@(HwyIOwZ;{gCu!4+spi2u>!L79XXw%tfeWL@nQ6z`12sJ*U$=KdFbg zadRO}3VznBbh4g}EsM%hpXDmnJ|dig#7 zfM&dLpVL5uU8wc8Pj-+~;NHJVj)0Q$HUH8pZ+w$Clt6@MFGUKB?8E?%jqyog-tzrs6qi`PgW+1VTpa7SYe5^&T^HXkl z!I^5(jKfx;@cpko1j2qn!YD#UKQh{TN%Zp-vzC_&8~d_{lZfR7PCS;*gt5d7V3#&sW5kOLUJNMr0x zwf7apAodlX6=^cb5ukL)YfI9=r!q`a#-wr=jgqG#8@?m|>JVZ8EbkjI{AFgJrqL!) zO+)#bu8tGyXA#%BXA{RMyqB+>bnSJTQcY*6wEHzy=0#y@Kw#2uSR1gn(pZk`t93;) zz+;l@p*#pRP^CpbGvMso26%mx$MtC(R@x2`14`l08q^1Tx-NZ-35`?fwP4BTsJ z-!B%eObs3;bJb$pN4kCyHweR7Qm8YW224lHE!wo}-__blt&GO5=#B?yLh}Wv%BC(Gt+!+x)Taq~C$5>3oo6MZnif^=#zQp{?{$ z_vZR0|CsD*d85F^r`y`KZI{8Vb-6kF)?;nC4fbpJWBOtFsqjhq&dcs-QCh~@{iA-p z2d;M;w-J#Q;oW9O{3^#;&Y9=ydj9D<-XKum=fJ(dvk+f=FTShzaaJ*h;L-1SaQ7nJ z>k*xL+F@|aLGEbjD=RgRPcdKiONBBPzu0&@{?V1U*Y*OX)ju8164^gbu9mg3uFd)^ zDcQ5OJ;Of|-qfBhRgJYd?6s}8wLYFMyT7)5za?3@J^J=!3i1U>$?m+&JigAos6LK? z*Kq7;ElCE7VktsN9ZBxUWxyoT`D#{Ew~N#RNvpdD80&A;)D-XT$r#I*&xZm^WAe|2 zg9SY`JN0!b%9qo;ZpE@WDWGHKP*3^pCWS6fJ^3l#$w-T0#>KokU8H<_@}r6WxBrhH zv+dQLTevf!uLT?9Sz@oZZBdVsX9Di8!04F%Grz4raovV|Px+O3m3w`@-Z?J=bA>IU zJ81vg#XsJ^QE!_L7-C+m>FdZ&4 zovnH$zblxOJLK@N?wW))WS%}X>Z8Vjl*)aSs)yTHQsTZ{#b6PU%xO-vQ$?Gn4^p=r z`w8M_p}NFqEZG}gIB{O+sF&y?YJ^=7a$e{$H(R4ijIS}d*>dJfD*oAqtl)7mhY$>? zHDuu&Eg9ym=GYn@D*DA9!O8g9WRbv9!y;8X$;raJFDc=l4j(!0v(!J+uBxd&=R_n}dB>a<5;eVV#;Xmw`kom~qzNaI1=QKf12#~( z&7ZUTGyV!0CKb>Zi@RNnBp57li=g^~lFj{1<;STQ`ptFbaTY)9dnA)`qKro~728?# z+R)O2TwK0_JcB0Lm{V1(l>~ztbU)%8m>?H}#1=ez8!S_d90QD=61N4z!KnKkH}eF@ z;jJv6rz)U94f449LaK-?LlLC*gp!?cWmbiGlXt-!y3&54P@)x=f2CUq*>5h^mCwE9 z1e|qwiP2RjSyb7C{W{_WCs}js#qL@5S(QZ1DKsv1ko?_jJ8bWzteG5oA6u&E zupSrMUnW@tspo@RvB_IPZ#~}w_CWNH-bh5$s)-DjleYqCM2|z8+}qgq{6Yw z*Y7QD!4`=hnly9vhJ4grgJ)9A#*_uyF{_yZ^;V|DTomZ8#jA$O21v!JE{6mc=pJi@ zIg&kCmYi7onhVaJ=C*akD7Rj^&6X{!HrHjXe~!dI(%3U!Ba+Q9!JKzjgDAw*m;j(Y z?@ifIo7KCJ#j$rAMQD;!xG@FTPmKmbM}7e zjxyVla!iU!fZ)`>tbR4+vj^mhFG&}_%$2JXY3%;=zTexGV1+<{ zS%7cny21E2KfUL63*>g076_j?ly&q{2zQ5xC zd!(N)t?UvI6XH+C^{Rd950Ctfx!u9LRo4 zY1^KJ*RWlyHG4DkXdr2aI*=djY}k1k{;>U3Md>SMdt#yfqgx(fS2P+;i4|ye9Gq<=qQFmWRn}t|IVmWu; zQE-!%d4FJeP|J=;|InPE4_v{%Ni;mkQi44N9cx^Ltp-VC(|Tdjdu#R4D_L&S%NI7A z2=*vtv%xZ1br&9>fy5--1l?_>Uy~K zrjleMyi;qg-UkF(sT`GKmP35(`ii0L4ANgCe9%bVBIFI7m9Z1*t2bhCwiBukE>n(P;NKr`eOxgDl_p9=SX08{% zvW?-YRhBff;IL!{*yM3dE(Vv|;m?W8)hnkY)iFPuQ6rq}-9V*8)T*~B2@?-WAICwV^#&}eaOY+m8bvQz6N&d5P@x0=U%4Y=i zu1wS&lshdV<2glPPW?qwi*U>Oq#G$I_D9=`JssJygxPuf=}8^B6~;+j+B0*3+N}$9 z9#y51{A}Cl&8Q#W0iVvy7a3OvXRRV9zLiSdaBJZ87UzEMK}eA}IE!lyPTP{*poCCImyeyq z5Px`e^w*<^O=85A>)i%baTKncp5Mwvx|MhD%?HoAw)vJ%^X?aM4#}Fv1p0uEgZXC#|q>1 zBK&f?vGoASVPasA5Jj{c;$21A(h__w8(^ETBf)?U0;Z+x<2WT(aE?Ku5CGp1HrF3X zqd`oo8-po65ZcYrb^iH%yc`^y5Jf$isuw)G9%KY^lc-Bz<~G`01(CS!@ag$oNRDqu z!ZNgPGZl4XtICgx5Q_#FZm&vUx#pqM?L_E;D8*blI*Z$xvo`g@a9k$9=oVEjO2n3a zDrNl=%DDqo7wVLp;;;%$I>@&Q+2UACZu~1!$afz$D<1Yi7Gr3*d7U0l;^!L(>@ToP zCuMCS(L(6w#SG>L44Y_jJdhX*fwG|A5>ESKkj+zEMrg;BZsW|69u{Oj9%ZV#;V)b5 zHOD6f_utpT?-}Fe)j2bRnUx8!a^`>Jx!e|4Kt$gkCn2 z|1-g%yTF4ffT-)YeR(%0!dkS=*=3ii?8>Eg*okrWwr8Fe>i2x=NF zp|OZQK!ry`L_S6hlRS3o3dK|CLo;W3dRkVXWhb#M89j2y(*Tqr9(#PmfxG9^xp-{i zdb2I>0yI$L+Xv*^w1J3pJgjrc#OnSZa&Zo0>2Ys z#Vwq5TvO3z2j8Amrt{!jkl7y1r(=LJ zqp#bu272&uXXe;O9oDPk1F^LBYE0UWYCXJ}>|lh`tSpIhp06G0%z#Wa#nN}{{s}?3 zWYgtRc{iTlt&=BC-AW6KW@Qipg%waJlqSXmgFB}N7c&w8cksraDl*`h@=gh;JBg?x zs}ei9obgFrVzEyyo3$ldi;9@mE2)tPlK|=_1#3KxC`2;&$Z##6`XuNaA7aD`Sp@W> zVm6JGg+nd{RsesBeuXc2`!wsb!OJmn}t!D>W~!X)DYvlP_AEoHbaRps1~rQy^MQPC1;IomN>|R-c=$(kSY5WiI8N zOF<9)Ra31_i8Q3jHRB#L$UR*@$Nk%;*xJVaa9M|z3*ZX=`4bUap@L0ytvmOO8`sie zZe7_;-E5Q>li_!3-DDlY#Y)-dkO!b5aU-);{2@;kr7Hj&>p-QB#cECQy4cQcX>qlt zu2R*;)~>8r%2YuJP(1^ftIjo2v#Tz(7E4mITr$$tRVugXWjb;BRkE_%=e79l+V)O! zX<>R%bhyCI?!Z>67FnatU6N&Gd0N?!c40AvA0Z~>Mnhi7aWhPV|6SSVLd$COX_e(D zBZNYC*J&x&!s2=^(=t?Nr(+|z$!p@Qs}?5rCa;r*FO~B_FG8U_ESL^@KFD=o;lZ0D;M-f)dZ>xPYCsV4Mpz{z z&3rP4y+G8uuRTrNfsH*3kq7?L#e0=G)%lz=$EAk&WrgKp>HYSe0%3B3_OW0O9M(Sz zK8S_`DfhuXsO@oMTPb%cZSf9UCr{j~ptE&{9fw^hPqbI`v#s_Xw2QHe=KHhr`t$tz zuTRl;K~F?atxtR}=&z8%v;}u#Nc2zj!P-v^pN2EgaWC?N311|Pq5UN1``VcsdRzmg zjxj@eN4k8S!X2fTSp>1X{DEd?dP-?9yvx0daa8ot^3e1VZy@*8 zOr=Q2qB)P=MA^*fVK{GT&`8A==oJokJGYx)Y@=FbXk&~DI}6RgSi>X3%kQ!5LF;ko zL~A1(QxQDpsq%qhiVoO8GP>u`N{0ol8BZ@6dA?&(Fw%wqnj2}u0>S^th6M5i&y~Jd~f&dk%D8S23XL>E2PG>5uRRo}Y z1#-YnsgWl-Q?&n1w$VMW)&~^eSkMlyRvRJ^%ZQKu1GV#J_isfXaX`?HU_}WGNTeLgLV+>@b{sk{>_$Tm9`4Op2KEAXOe*x?fhir6u)qu`5Stb$ z6i5nuyS(BFufhj|$qx?L4h?d@Us-ocVGCNL+rET{Me-}JKx9hkbVkzR@8p00)(7nf z8QsHH_#iSx2kp>T_z*C?qG`3g1MYQR2zOq@;iIeeF7+mDeqciipV{=SBmk#o&Z_m$ zaY0(~#H97YspX5r}`kTfE_ubdwwm&z#W=XS~i!9>Q2n;dz*@5 z7!c$e55z1?iO*`HJ4dNafD0=w94Q>{1wZ{K!MH+ z?h0aP&{)9EmeD;l`Xf)p6OC3nG^qVYJVVf(rFz|6U6Gm(c$r}$>Zn3uN;5iu2elgU z5sppTMjP`XG2!`}b7_^qgHDVZk(kb)K>ZyT_*&@@AhLiRK6|0^9q!974R%kI6(x`$ zw~C$-W z4&ED4iQz$-ofnBl_wW@@{$zMuPw$-I{B)Rh46ze0EPK3O>?-y3=l7b=3Fh*NxEb>}1$@Tjwj>}>*(R`_5tDFy5(bzU%6_+%9C zO?5g`Xw~`ej2JcIF`Yrbk^L-S2Ry%`l`zCtnauw1b?JRT^DI*@kte5eBIq;L%(pzMQW^AEHjw`&?vjPEp~d6E$pH6)%z|Z`WG?JU^>MbSd zVq=h>hEJ42OhS@IjT7kyh?pxd%-?Wr8k~Uk$dU?9A9Tcj?Q%+BBdKd)A@;rcxZv%CDEOUtO^#dhNP!}8ufOunMfc~1};DZe?lO1gp^qiMDax5BN~JVR1{ldFwlep1}Lobq>tkHe${g~g1$B=MsI2NCc& z(3AW}{6~^Muz_8KT;&srhc^*XlQT7+?0=SIDW4P8X1qVjKjG(q3EKB~-B;snk;>n6 zDMCETNoZk{&R*c;o+Y{A%=>k)kT^ht{H~vA4ynbUh5`KMSYCMq5|VJS{E2hIZuggK zasw9$?t~Uz1K-x|rypN{kZv$}w6T-I(9?IBKExC;>cbr{GyPJSoB7Mr3Hh z2o(01WIZ|t`Gy8Ofq1|lJtuTHJ$avD*dxOoZLvRVVNapzQ%A^1-Of`Vd~)*ocJAU- zB7YMbP@;M61ye;l=tb(3>G%XAmXwoY+0Tk(o*Y~<)nBzsSXmODqSEB6niza?S>ZX3GwK0&Zb3|KS&D=oY*YkM7)(~<{b*XGlQ5HT? zDOAf6+vmrgwDDkWoN7QvJ>x3i4dRc3F2OIHIi-0d=<^qH`qG6wq!i`jj7#u4l-%~y zC0rbbSteXMkGS^tS}%jo547$fdGfSsD4rG)xzI!4UAHER1dpeks*nqZLOQ6y4?YhS zQpgWc@42RoU{Ti>;#4#2U%BvWDgBCVkXrwYk~*tpSz0}ch9%RhzA_Ve$Sc zZB*Er_FO2G$@n9X?N6WxA1MTsR8l5oZ0U|Ca|xX%CDWglOvNW*_G|Z)S4wIZ3NJlc_Hfma_YWlz*<4l_MgOV%>L< z<)!r8-`0*1(t60GV*NB_>}@9GmlI8c4it%C0E(!kDhmau)9t9#dv;~+ArFvG5Lcm1 zh^Bo45nTa}rOO(O#>;V`4<9Wv zi8!><)8Ga6R>smQ!%7?KXDzCu)6jGQ@9oxE1sjRcoVeN!)$Dgk-}L~6KL_be0gjSE zp>o+O5S1af!Ii08wp=!z*~HlZ90J#Zy#)gMVxj116jk?1Gl26P_O*Ci#I`MVsiBcb z=3ZoAD-Nk*Ss2a$ zvCoz(D&;m@uoJ;P2=Ym?n;6vmg8e}x(r*JQEWj}haRisq3G@SlnTWG#1p z!kM~&H$$!|(}EW}_)?g<-gQAD#Ha39upTj?RjMjKwc|oiM_IAXuFi8}S`@c8PsKH8 zEA7%Zzkxu%lLXa?lP+4s8LMWw39Gv8Cde{(;1M7g`z4V^0P944)|s}H{QZIAsGH5T zIARLV?&%Q21hq&`vNAFDo2dV;YW8UohPyHq#9Vo{EAJ6oT3ot*sK zUS`KH_Q1;seqQboPo{&3k4BHbZ6lQpC%9=JpCxqGzCfh>ru1ahk=n!pzYSoJF7N89 ztEmY(G3MAx7~}(WLgxy6_ka}Ywo?3w?Dz6k9cW(IrGPzCUOE|V<%U}_%sA}={= zCchiksI7(@f)~=jO5gfT4d}Y)y7Bl9`|)I+q3l}m?HUI9CP0_nzKki4689IUPOl!mzuYAE zTCkft8f5&ld%4hCmC`?a**)G~sJ2wh_#lHj)r;Ilt-MVMCR`>7Tn{Gsov4xFtFcP#WN**dM8sS8yrJJktLc^ijJX8N#DLl&~@V0 ze*5y$Q0|Son>yy1UhMOzZ;8D7Nw5!hynrEJ)LWiBq}1(ggtY7na(q`WY^ziQXkYM8=j zo>0Tzk!G`Xw*1-b5U4R?)c^Uj$OK<;g~>-(6(<*$R3|-TkAf%s0-jnahQJPiKwrDx zMPWFQmJ;e}9Y%6uCa|@bu)G>2nQWcfm7jj&VsC3nnVOz#>N7&&qV-p`ACN-WyrL5v zJ>>S`YTN@Py_^K`1u^QxJIfoIUPl6XqL3Y-jhM58 zvhz7~bZrT?ajpOmUhDf%LBA>S?>l~&L;I1Nf1zliYos0AD~`Y*35{A0LjdVXWEY~V zTh%Z;ot@DHV)(Q3vwx?LC4+Znzt(=M`61#)XFs?<)#Q7^ZAde}S9Z)K-vhqG$3d1Z73!+c;{F8@ z0l$6Yg^!X4y?Erq1_vk6HzN}BGn&Z&1p@{jvq0b8iL`{IdY~`&!vsEwZcAXSoAP%r zcIZ*bg>mmo0(r=+B$O$X$|{p%OF}aT9^2kqgPu;qZ%3pKx4kugUV^W<-YWQw98*Qt3V4TN%CKCanv;eu6CNq(8t*UjhX6*>Vy`SK7zYK#mMAtt00IfAnh9%CgZLL_GQkpn(S8H`q<7t$z&Q3r)2Pb}~~GNiG!A}vJfr;sH7 zYPZF9Q1{ZxSbxeeWQB-0EmV9`N^xRzJ)<_ndeD1bs9T46-}qn%OtmO#^h6M|V9RpO z$a8AT4PvsDH3U?#_F$MlN2a)jN+tuuQYVwE1TF&olcrY)yyGW6B*;SJ5(!-BS>|n+ zmRi9ZQ328VU!Rd|Qi$xRRcjJ*b|54?ttB{;L=E77Fd_dqtB2+=oYzDe-{@i_K$hx` zap4s}&e=kD;UxwZN<1VtYz&x!Hvp}~^b-HEn#QG@`n_sa8qV_MWtl_j>+kmqYoz(e zQo{G(-6TeNzH9K?#RgFN(suyJb-C-8a9ahcTW2?0TjWO3BN=(EmSL0Tp8_Jym>hrl zx#=P+f_It|AifvJ()1lTslFKW>U7O(EV*y#`wD&l6OBmgQg3&#`CL9Fev3;pNtN!X z27V(mCc?hDrObY5bRj+k1ZOMMd~Ixob_LHK_bcAr|!sQ16l_aQKOloMBM@1TpPcik)XRJS^idlU%eX&n%BSTxz_JUi?*@ z*8hpZ7Xuq({oO8RY=)~h zyVHB~#{~l=v>y!34Om|7$8q=+^c>$17;=$4-WdfM!<}G8S_F10!*y_fytO3#C|>Zi z^TI6&ZQu5qZ6WLraqUimsM6WX5IfvHPlY*&>B#_sYu8W6R!aU5E0F&j!gq#!XW??g z`MrbTaz0^w)R&$fa`uPJxtM$Rl{mI-{)bU{3s)+%)8&$K`WRx1N1&#<>3miq1Aer9 zJ6pl7`kz&6%Eox16wA^Jd2^$ML0h5#en>RiZCY5Hj%k!HD8Y`|ZvE-ahCe(n*LuXD z4d`LR0Om77t->Y_TxEt$rEVYfxln3j-%nq@49=M8-6d)t$W>Wtt-4|Gq9Mz?_ls(2 zFkh>FC!gVc4!II{$XMrq=!cxlb0NgrS=g>b8$%*TuuHk!>bw z?*8>xW>s7rBH=L53G0Y*DWmpS4((#y!(eIJzZiNSpZAAJ5aXv3FE%e)wjMLb^Z=6? z#>PIV-&*7CfjFBT53t#ErA+RwSb$qc%i|z8SR@jE5exq$%#X0KP!QQqP`{WhA=~|O z{la$!+TXwG0>b!xHEY5SrtjAwP8+YIzO*T;RL5&#W@Ea9l>>OiLH0l6F?hFxy{S{g zzptU%t}{!_9{H5Wq`!o0lA-mFAbICUHy6+TzF(^GdK^0^wh5&V_3I&K;iZhp{o}dTZ7=-m<$RXM@ z5q_?YTeQm*Uu6qz$@`bqo%(npsnzE3YF|6mx^NQ7~w~-2NG99a{3Ia#4@fIWsUG17iM3Kw>)-}l)BRJ z^{RiP?m%YP6%WvIab?U@uz=OV)k7K@pYMraLi?1-luRxY3k|^`F&T_FAi&tbCj(*> z0Lg(=w+klK_$0z=7}W#hzx@7$y=~3n=l@aPVeSLg73ahCjI3-|eQVVr8u{om7t9N8 zme0+pWhQw6OD1WM4l)B}|G(Yaci+pJf)p!^RBfbRvJvdD=>}7ue&U zrpeU_>~+ZClz;q;)iee#o-pZbkmw_>6^30LcK6w1CG{S8i8R9}wH(8{>|SsUms}ud zZ{oSsO*QUMX9?q^@9{-fA-eb;pIH8xTQh2 zp=PYAGD%O`ACEp|ZG38ZtxXdP@3-q<&t~Ig2n=vmO=>w!a+)wYZGnMf3QT)j-tPGx z-|`siyx+Yb_^}(h@+f0GiX{|tgfcc${&xClkYq|N<`<>qiUg`qgwK`Q+GO%bOhfH5nxVfV(1X z6N42gPmtlV7oRL3h~6sB``K{O52x)OQMZk3n7)~RQEYVIcY=u*UDyQD#w zKM$v)vH58EE5wh(JsKF@;Tkb#r^y z$s;U)2zzJ<(-F|g@&IGcD;@wzA%iqe>`aKjhcVpi7IfOMAj?$gKw_-;8{X1)^yYcS zC9zoXwaIIe56andvOd>*oA9_k$&7NK0g@I;Q3MU*`BSn+vgEf1;S4-h95HxGkx!$J z2)K;Ifh?KOw%Qx$1+N)=>;Tl#V4c?uAN*}Dsm=2uk^$y02Y81aQm++kBO3(PnDZse zyX{A|VFb)O+Cc|so?D&7?S<66qmA!U%kR(0qOD0+VP2;n z*RfIc-9_u&hf^O*ofMZJ1F)J6VKi_0qfO1aV}mTI#e;8sA31JUg|$OmlMCG)=qKLq z4x!g=D8Y((sTMx?k2dlEhL0xwltpe@O zpPVbqRO*!vJ>hBQjat8z6?ETF6i<9k8>GJ``Z^@q^Td{#fr^-5n5h}2y-Yt}N|@$5 zegJgm-_W_gE;TLoX(P)&rhl3+*TG}F_@x2tB5NGN$zn*e^gcZG&T3n_zhtF6RMPBlYf9KajA>_q z7XAH#^F9xvBT&Ttjt;J|g_1nTK1dc4`zKy%2ql#qT;{P~n@JYc%dr4@%-Ki(Ht3qh z)Jknb)DKC^sAoqmsABhzTkf{sRJi73Jy7j=8h!D^b|el~gf)WkJc_rqn~Q?XBOcfY z;tlhkphhKTeQ-wz*9i%*&)zrDoyD#8cIpf0HnaS~+srAtFtCtYMefxcCik z4KMs@c(y!_WWbo)Q>P|(zAak^&Xe47PCRI?r;p@7FrNRmxv-3Jh!nzPI$@3 zZC9TT>nNNAlE8}yPKzuD16AmUCdu=SqO$<};JECQbEd;>QDm=|fPkcA&FHr_K|K#% zlM}hxK&?l#i9X|&t%It%GbM+(HhN1{)smZ_ixPxFoln2;q)==W-T{+2s`#mLD#~OR zmac!@KZhSTeirW{q&=geQj`~n;7Up8?~?**Al#RJArD)##>UDolT%sEyStJWSyuQE zJ8ZjHfo1I;-Cz(Vrgp~vXes(&V=+@-IwKKl${gTU#VWpfQftXG!>0y-KB8|8$P{QP zTW4X=eOy-Y`^cB}^^s7hdRxFs8}x7e9sWVCY_$6l!|&<%+|$q;UliR? zmU4GTT1WD)HE2VKNv(+{$i|mqWYF7zp3_1NuMO4hVp+CY&DXsoJKuYHg`+*xLo?#| zYqbX(s_1;=T)1X4cRfRZC2Nh=X9RvCMD&5JTaA}Cea^<^7ug!_1{}%q1FSPLOYzf- zE4Vn#+X7M_*Z9D{oUA_<^lN6(u6BXOg9^s$=o}^xXsR_L^t&qda~@*U6l|L$!q}eD zxosGi6cS5{9$==Nxahcn-GdVn;Zo$3pNbxT^b@**Ji)Ee8P`h0r9t&ig%0j={34*) zz{lAE!=|&b3wTXRc_h1jgrq3^vjE*DXB694*Aq_z4bQZxUiz?;MSEioA?H#3rE!M>pX&A zJThM(HQNh)KHns~i=JcI=|Ut3y|FjWkM7(5rRBE16;*R_c&Sie)%S~Q&+pbJzmK|l zL$v*HF=DU&9<7)07PaZa>hD9c_Z%X;UMDq%`=Ns&*9at`-~0Jw%Pg|b@g&_wPUH9z zX|q^1th4t-ySzLclw>`~__dvEM5U^}*sFd?>MFQxO8M$(LN($*2i}pk7b_llK~1|a zDSJs;9oytgE7B!?C0EyLs6l7BdvQ7CYcQ+f7pWwhrBC#aJs#0G@?j$`vUb>4(hN0` zt2-z0+Q*u;1d)w!iRhZy#aPJJOgIuDszUiu=l70eGoym@_1ax0vI(t8U&L|R!%a-Y z=ZZskc2O<$1E`Eo>w$WuZR763>PM;By8oIAj zr}j9Uly9`G^ffu_hkj}47Ly%>6o0<2qm0#uf4H>RGx<;jgXU>FlmadJ368G03Du)9 zRoPCal7oWPgKDx=Mb!&N~8(3#|+60xk; za?FXJHgPp|AA9G#FdLH{8SFXK((1!=plq>vd?cUZvpe`% zjra*VS_gGrQ7eDVLz%`PU#nC=bycv>^hesTXDRQ<#wf+i=8K;3jR3qmp5^1|bgBpF z2Gl%bzQqCyyMJaFKTEz7ec`^1cMSkpIvq;RvLBWzx~JKH@Y{{|2BMRsc@QTuMKx7*!uK9o z+}r3?P6sJKu&E&N*;Y`63t48e-B>7EJtB>@{G9ZPQ0&qM7Cxjsa;u(IUFHyu z8=6Q9BkU%*-Vi3`^+n%>#e66ume^)ta7<~OIt~V6*t;xCTgO7?ds@j8h?X(*KGyji zrL!vWso(Uh3RKXTM%Y|&KxO>ycJmW>KEisd#pi%HfhFzb#L~>UW_}2ApWT&O zkzuOw5n-+R9K(uy<44%7XNrPoZg2L*#o650?yu-zVuOOn$-zO+M*dgSC1=wm=VIg0 zCnx9BCFkJaCgrV9XDa&U2gCGI!Z9BgkA2UzzX32ep7#YN5y;0B-P;R0K6zv=S6#bbX z@aBmR>=PUTEU~kJPXc(~F0-?}MFPCpu(N~Bxwv`AdHLRgaB#h4^f!AB9`?7;T;QO8 z)8_@p2Y26;c)7t!d~XBb-~)@CY;R{dIp5CmybXjC02cqzho0ALd@L!Sp zZ(4uNxZlS5j{*-EJ{~^4|4e!RCh!+lUhowzj=v(`U-7Rg-&^kB48cLb{sC_T0Kuf0+2jJ~r?N?DcQU_7?U3N$BkgID2rP`)xpP z>Hpuv`>XQ?!khg+AMgO)SpFZs-HpaL#^b*c*udC>vjHFfGWLzDZ!87-0WfDr&w;Xe+%760GZ|BdqhpY1=G+-*xRjHvOmj zKP`Bn0IP9;7Y=Y8|36s!KNkNZaf8{%#r;;bx0MfEvwwN>rty!*|8%)|{$Vp0H<&3r z;Nx$FxWG01Pvd{LfHzKZ@_=VQ@86c|Z5pz3gDw9#&jEPz2H*up0ZY8>U>%6|z_Wn+-wr!DI~X%Iwhtdr5dZrw@kl*RL(==H{&1IZ*>*PEp=T6wkZ|C>ym+>n2XZSXCPjIj0@6p1l0s##{fXxHj2h)Xu)y^RT8HVh<0hU>f|` zeFac(_77|a;c&6$h_!(G=}Ja|J)D&*6ii6E_r@k)KkhOHlH(<*f4``X1<%;S%ZQza zQ(pfKqRzO{JkBHGE{Hv2n!~-5vRSZ-@G=9cX4+t$zq-+K36uy;)J{fzHn6-aVMi}D zOrW(I_%hpAjR!buKPg4>KPm2d3U2?LF7OC@()ZCwvkfXHZDE$*FMtP5W8K65v3?|F z`{vIOy5R!5go)pP-<6GLC!i78;AM5&uAX{ka7|SOvXF~ z(MvGIWiVk6Adt^b19Idl7Cx@JjffZHIQmA(PQ#Dr2aX^P zgFrn(MdTk;5aI))ZbMolrk>q@eDhPyku$CZK=ox5$>#>mKwoas1zqN2IbDuDz6-US zoo%N&T%D>fW;`9EyEV~j3L&@DQidB(PlJ$sBjwr$(S9^1BU+qP}(v28u$ z`+n!1+??E;UtQ_$bXIk$lj=^_T2#aPa|%wh{P*1RKL^%Vf#LdE>J|LB%|EU=LK-B! zAW8C?uHZY$;37IKoPJy=cm^SVp;@z+cL>HV;YRc9;HGA%R@4;<_SY*eE3580=W;q_ zJmGZs*KPwyU-0e4rT9n?{}Z8~G<5^Vf&P> zUD$Ww{zk(qxKJ_8EKw){_|v)|rxe*g=Xc_AUdq&xR0mQ&FCk-K!zeCFgD=(~yHGx_ zaL-QLE9BsA?c4Lc;daxj4m)O<;fn14xy-DdAu?m~K|;`FNd8~h*Y4*phcI)bsBs(6cEy{^0KT}L6aP;v9|=^XA&k&{qy zDLC8n=~oBRi`)I&+j9gkP5CzCV8{R?@8|VJd0&zm8F9#@03SACDEQO>+Y8btguDM2 ze#nFkASYpvP=+CRVlm|GgY3eP`rtX4x&M<9dmz?;x0-BA{8H8(rh4$}=X>MRPtida z{9~`}CPe@90IM$^=5p_FDK!V00cjF1?sh2)lUtm~QqH|Jy$5i8vZu>Q=b%qafuK9a;YhrExo%ji;Wc8( zEC2HY>7ZTh;b%s47bYwE3z21+Wt?&h{*Ar|mK*)Wigzk5gW`O!sCtA*NDjWZzd^s; z^JRc%N9Idt$NUv^Hqg+kvY7vfr8WGY{|!)QBW(<#Vn0ZK{txiaR#ILzccga;($GN7 zTkia_mtJ$vvHJeMS^tNbwkx-8+vkGxKS2Jk z;{&A4g6vkjm1r&aY>+LuEqm%+qxjS!wju;Eo|u*3Er>2hb89brK^C zn>KLZbJcbepg$`ik~g}j&u!FZfT(=XLfk-MK@Ck+E-;u3ib?{0r2vw`2xVo!vphu3 ziS*Ba!}hIF~#YK`7C$<#H!>VFTZfoL1<46XOEI)=C7t!<3$-1dys>%t*~#XQcU z(~TI7|9Btw*WDx|se8AB?eTtppg+0gWcR|Le`r)jw-T0q$qWPa5BGjv%@ld0yD`X& z1CbexKW!LsE@zFv;LOA@XAU%It4xzNR9s1{O|NZ8v?puL)*3H2u5GwChY%%bCFw1T zL1+{frMOaOuWVT9Ojh#Ec4^e#Z-)B>LOcduUn?Pimj6izk0nuUmwav$BKIM8jrc|A zM}`g84cEzU%=X_qIs&gg?Y$O$^tEunm^89P5vgfwKy`aj~QRTf1xhs1r)2 z?spnq&5a#}Zc#BsRw9!DB?+jt2HiCMu^NYUqgp#1R_k9C))Zr}94^}o9d_-k4A2}c z0!o*3r?N@goL?>JGyswoBaJc;P$*x`wsf5Zo+(}JH3db&r1<&r^?Vu2shZ!;*2%5a zr}unAY^$@;yaa2mIEG@%oxZ6&Rd3l)ZR^n~T*HyEu_<=So!qj&-OA|S#-oLEuV>?@ z=(f(8+0}Rpe!!+{q}V4{V~6~6(z^PvZ7g3jmnTMt`jfoFzYGT-dRYy2>%%yEgCTa( ztUI$A!C7vOT@aGn2BWc&I0?>U>eADBGd>yAK>!q8`P)5yTfG<&z|Aiy~8)?bZ`Ep@sewwJE8UI%pSfaiFu zrq^`DL&tOz-Gnn|qic(b4^{uU0hXp~w)358;2EKA&5FV67i}?iCCnw-{4FEspQ4~v zSFze(m%F=hJ|SBpht|Lg#%@TM!^Evl0g|M}_Jfhhr6nG-XmJhx>o>}uL#R7=+^Z10 zHV~8fU3DNzTBoIkku;w!@PMWpdH*b#a)pRJpNfL;-D-U_!<}qaldj8`9~6YE z`o?u;eZBmJ?*7XgYZMpMo2%+Qa@eHXd4bY^B{E{JaN{CW%Q}ch+b-D=;g2;QaNWH+ z<*g={T76B{PQh%mP3i*rxV$^w$xfpGpf_3})ViLTx71!M<09PtJWn?pougY4U6yIpg4V{u*0C;MQPI-*l|_|>70&2p z{MhtGJQaI%xZ*okfuZFzs&55yx!KBdNd`{)YqIO4jjC>0QcWgjhhZ5?e`jUy02yOJ zbwzUn3t$S@Rm;&{y&9~|iEK{8Beabblm#@>Z(5EgH7D--u^1`>rc1vs-M^Bby-7|V@Wu*S{$ zc%#HFM`!YyVoOiRm95R%!LS}CbYS00Njxd~1O0b7RJdU?y68@E%hY9!y~H}!(ssJP z^fmtS1j0@K->nbT3G;$oi&|L=!fQRgri@o`9fa;$N{{JjF`ZT)gu*FoH{w?0Giy*@ z+7vGDKSm`PoE)41QeVgEjtusHIZ7X+*t6Hlf0-BIRUR2~UN4tUjxrosT)`wbCwrmU zL)tz_#R^>E$=DD}!<*e3#h{bN5PI<`j}~UgsztX#uuvT+mG!9L38!wfQ%JRLL|Pep zhxCV0P+r1ox#bh!4cq6gZoJV~NUgH6E1jlnN#%j-ZJw4rZ2J1|U38ZhmzyNlD}Wa>Yv=V?8{Pe|E7*fcv0@zT*`-wKitZWb;1qjP6R; z***3V(932NU}iD#<-7|4Fmb;9QBLZyA%Ibr$hP?`(~DnSy@{58wr6kdy@j7m8nU`h0*@0fJ)4``z0JyDxp3+;q4 zdc5YT%T#VuP#ab!6UQZgMW!2ieeH!CU}hN6i3U5P!iYd1^!Lgjl{Z> zcO*|SwB!7jIBZicj*+aA%kWBH31Mgin_T1@Olwr9JRkN8PN7bu2jIeg(N+$+{w!j{ zgj6?PUyIRGb7nh&S)(x&$yS|@>H9RSdC(P1#N&7#e#`5K6MhR52G~{F;7I<+yu;W> z-j^Qi8*j?GgT&#d@)qNi04Co7_KgSm0Yn}LU?@aNH{gRGgwikv{$r>i?sLYD#5)w- z!a(SKTPKewCqJrgN%x>Tu6_I9ui!P9I@E6|_mDg0eTs`=zQL$qESR|^(;uN+KS~~P z_tZOhLxz3%;4*+b$_sLCF?${{kKE{Xux{`e3^zbGSRB9&vkBOQ(FPC-l~J)n?^D{` z51)_{lJLl^%dCq4i>TP~?veKeD_=qOeFuGly#TMs>`KpF06dsWfE&sU`Iew;9od%L ziapt9fCJq==HQIVE#;urU`#L`%o^G%a&1wmy7IF%U=5iIMjcH}F(f4zBe)7i9o1L9 zeGn}vtUbFvyFS_h$B<@UX^tqR6(VMISytPqA^4tkfbI-M-xL8Lk>j?MTz7& zAr&Dpq%QD}mmeoPLUn@K2>u00`j~#5?i{}$H%@MXya*76u?$ubf*lZ(co9JqCr2@n zC)b~k$Q?HfhhWwM+y`?8h9FCalZc=d!k7t>lLR8mslyb}1t&5E8<1iH27-wL1M;cP zV6=pYTW|#C;}vBUP{;!%kYS=hVAIp)rO!z4$?z%gNj@cj0e3x4nlCxbq^{}FyQsY+ z-m<_*hwwX!ef?m&L9F08KpqMrDj$Wn(Avj38VT9AByb!p04~}`0@#nH81A0u@Lv<^ zK8L0l>z;OpxKETD4m-S=8!k1h9o&buQ(U@B+$|UL6@$Ae?;dkU%l4vP`3k#lIw&3N z6O095Q0O_WIPXLLmdWvpz5Atmiz6>WW5l2eMAJR9ym(e#UMCz(3Z{aILvuxQMIkII zbyHf>U4ANBenK2{9c1sER|^cAmrQd(Yegn3C?%q_p|m0WOt_1u!hh9$$*1y0KL8#4 z%DuxK_Q}0-4EN&QKSX(TAEY8?_Z-X#@0u_L@2I9q>l#0nqwNafSyQ}medvz4gRcCa zSd(|BKQOEGMKh$|7rR(QIP&22s3p-k1=I;wQ_lUbkmE5#2(RKbj0soGt#?MI<26)9 zq2n<$C#ii1mKD^IH0`6BqZ>bVI>kIH*oy=*1XUg&osEs~$GoFo5H3@>BpvXU=akzm z)0fBP^F?>!xS(ASDG~|!AU}gHe<D1b1RSi!I|R)FIhK=m&WcTv#nzD~dzHjs=r30uDlo#xcXqr+5lJUAw2z2Gdr- z2EF4V7;64^%n#neI0LXye-mfRV+&&6Fgd}Kp`*Y8gaMGj-a>>VY4L}ElS|gDcu^RV zbQm!qMv`!YyS?JSOuT~P^Qd3|P>7hZ{xYrW?7&YfD~=1S^1LG7P*3EtN8V*O#a+QK z=!?yA`+{$RvSZn04uw1cAAFbpc%+xd6mEwr+QD0*=*uJ+?$d#Z`Z5EWBJJt*@$+)j zWXVeSVkp_cs6tGJ7`EVsV5>pRV5VT&K?@;@fk zl^}1ZC;BtYMI7e9W7)rELDQK7H@JKyXL-!hh> zzJL$mGefzbm=EH!=CZlMYvDJb1@2if`<|eDQ?aeUPE>cyT>q>9n}I?{igV6*P@H5{ zh%;@FIgBxjF^VyXF=$@Kf>ee|hD?ScTR2@PUB-f(6?v9YhO`~#83KAhu3+~6ckD|$ zBuU31Fa$}%Ap-i(Vj)h&im_U-o|WORF3bIdx8vS%FRIG@M13HiO_$Rc=eZT@P?HYp z(68_N%wK?Xm8o67cbm6bs;w$68)c<+J4=Sr)EF>aq>Yi&er-2DU6)))SEaW9-e?}C zpa*D^T41T`UTHO-8>QVCmFjD(+*I2Clz(lyGFA8V`lx*bzGVG-EfRFL|7d;bxi(63 zi(@J7ad1C=c)8pRVf=-ap9AUaEY$V8+(~eSXYEt=QD?Ec+hg#~{&ZkswblF>=_ht>e@o;)rA?rF534MH7BK zeq*?8Lzq#BDbp`bPtB)H3npxSi1+ZwI4!gmJ}c>DS`EqY_tyAh5}_>14#{!mKeBb{ zi0R~vwv2!Q>%cW=djRGbv^>%`^E%!yTY#B%U@pAp9|?RSR^DF%L2ZhPU*uOg=@s}oCC9}tqHWZvL?Gm z?Vd@5+6iS`E}X8~h9rRL^9|#7lM994%EgKSO^vHICA<4D0^YBZn3bDjp6kD~|5dnw zce0ksXYKO&eFr|hodW~7Z27b>n-AN-Li5I7AiGTlyam#pmSA4f|Eu`ooUzZ_iM2HV z%{-+u%grin&#sO6QT=l*@y!wZm5TNAqYZ+^tiSRI{ad6L+aYI`L%vL(dwvUYzRR`W z9#1D$->si=9Wib|`HrU>YL}6obwKrw+#4ouV9f#jRvQ7%yy4e1ykEy5eDQxb><$Cu zSASem&~EW=XfL7%!r^NY3x8Ak6H}~^g?)bU=9$P^yAI(OGslA`)yyuVd^;o$9=KFtuET53-qi}bmS3zle$NDM{ zGJPSZdI5cdRqd-UL%Vw}?%>~u_CsBFg!ukQ4l6#6N^eLN6g(f`S zi8$}?f@I&y=6a$_LjO1o5PUN*d`N~;;MI2F^t|mP&%?%HlXD%aIUkWWK7!hs-Hhk#9HFbs8H_{%`=eN%xle)-DlHuXDrY_jq@R3CaIe3FxDLJo zO}+XcYuW{~gI)(d7B$+@^S}z+dV%aW>!cR>FjfZm%ePSAU1)93hF2lB$H$-r&V9UXs0gnV;l<=|1#we<$(jhHy7-bHNCrsm?~5aA*dkB;FaI@b)WusI1@HA}%NL{);wN(ok6bpor0 z)0$6`HKZdoqnd|Fy>itc3Es3Y{yy1Me4g3uFBOI!kUtv*$tgfWZDrtMge%@mTp+_%I#b*lw6qb>nVi@jUPDYAU)}e6T#93|~P(M$vM! z=s7n0z*EF-{`q#*lYGz|uICnARD3!%y`Z_!vnFnqdcW&UaQmgRSY^^(R#$rFVMOu; z*#83q#$p``QU4}pdC2bp$f0&=n20+urxBhx;Lmh~k~T6k6#RR58iJ0#x2PEQapUOw8WuJJ;1Teal=M`riJ{I|)bm}rY+GjEdY)BNJZTCRl|O{~|V_NRl84Kta2Cb3OEdC(OV%Y8VL~ z{%3R;Dsp-Jx1;#$JJkb8Cp|CT3W2fgao6Ou$_A;n5ji|eEpjmlnYMa}fL*H{1#I97 zuc#wxBPT%6g=zB62soFLU3o|sus|5bv4f+QuSy25#a0PwZ8Enk?z^@15!fg+%J;eA zljMn1BH!n6ud1%^zBFyK??Iyn%#vN&E@K|FN$_vXL7EDt^xk# z)9N;j#789C#WQmKgr#3xM3(D}ID%LLNaAO+bJm-a#6{PWGD=h_?FXLC7}9|Ud2n&o zyD@pCl+BIE>Wd35ij@rSuhv~|S49mE^sGOp-F2C?yoPh49j1WAy&seSu2Jor z#IS!Mn=ceYHQ~l++8Y?Ni4jl|8Ji22zs@7dgoTP#bag|w7KUlz*dXIo-54pi{z1De zOs+u}Kf}}KirdgrPC#WWJ72SI^&>!tR^IK{z>>tzM>Jj@SA&K+SCR7U<>R9oNyRho zr)GDqYG(R9Q+?Z`ZY>uRB^|T+JbE6@)q=}koW-K_S5cT+?aGYjdXS{Xo*!zz^jfaQ z5iEyb8fE4-u*T=D*Ro`GK8Ik|j(vEc1>ycrYjQTHaN=sYYSq24XDfrKy0U&S3k%pz ze$^kB(CTW5Fkx$stfH=9&CSHdXHR-c!jR&?PU@c7?kLkhw5uKA&FDr(_O2r#adno!Z24upqyv>|k}!LKoO z1y9VpEK^nIrctF?hs!W1-A0Q=5MUaP&%~jU)Ku;>VtC&T`@SBw0u4GW#v2F|5O7k_ z@q=4{h?7&?TfJa_^S)pZ8+DZtk=Ky zHStds40EVzhKoN_6Svpf>TvEi462rJ{xr@pq7oswa-v<3ew=V;<{~eqK*xM>dV81t zN8E_pSDpZRNg>)C)#yEFONfF)^`6U3N=8PikxM^fcF8Sg1$Gd63_sCuRsy+Su`x@6 z=G~T07?*b6QNnbXnrkcXActo-F(ZSJgI9g+^HNOnLrxR8Q8>7i{m2b<7lB^wSe8VMj6$VjX*-{a*M#UaqJyOe@{4U%Z)SI zKilhLoa}J(n9H)dyeotzv2bva$wl-P3-9Z} z>32sw(p)KXW966kCLi$XE~GL~IX3yDNw!rR#fax{!r@N!8W&GK(9(#`SJxY3Sm*M8 z2>4yz*9?SqeJb%e^Jt*&?Syq|W9*-Lx?27!SdU!3E&Q@=E*3qHbA4qfR`5~Dq_C4n zjwNDUe}(BLyB$lS1dP7r>XN{=eP-H9D!!LX`0`z5hn52YW~$-0a@RjJ!fh?o z#CXk%c7h{>h1wSEy0jRy>%$ zxjoG_oRfsS`Vb|jM_o8KK04fESn(eWi^t$;x`NjP;_B|-HmfnsBvpJ_Ok(Fpgj_ir zr5i)8qJO&zmYwiWpKtKDXusX{uuwcU5b#eFFZH~HuR&-zRh1sK@%I*1o?P(4EmFn) zj$Ww(g9m*tHbjez%o3w0jm^-_R##3hT-%$P@3GWO)o^xrtHe^T^?ddV|3KX1tYw*r zMeFo(n(d%E1%(RY1d)(2W(4<#U;zXIq7x;gWC|@LlSOFPQ*9xkH~1_GCiU$9#DmbR zCm$2n`m~nt=2fSx_O{rpT}V--d6-Uhu4qw)zUsY_izp?()|SGuU?Y}(`0VEW{P6N| zQFE-u>(qosl)PFwW_v?P(niKdaV&K)P{_Kk4ZoKXfKxj+Toc=nRyS+s2pUwN; z9|EUhFEwiuU)_as2zfwCMy&I9Kp1|R{U@bSA%VbWkuwW6B^A*1N__529uCL%Q=L*uAHE_4rkJi&0Z)u! zm*I57ET9|8;UgOUeW>~eYo=$&!xz6SxpH#1fUdtLfxNrr6x%D(RM{13t6Q~X*l!-S zN&zYla>weJPYQ?~!awF&ba%t9^TBIK#U=P3>xpR_U9^K04uCp$EEm*hE2t6$^*(0~I~nz-qT9N057t;zd=k_CtxdOF_6wiBVinyNNzGbYksNMJqug+|Zg?PD6r* zUa2I^9uJqRg(*eDt#I$GNe2}?85Gaxsd&3&$!pbS3zzp}PCmBw?TTS8`DQB_GW5B5 z$lf0;d;RZirOT^r__#@5;a|O`jjALlofN|)`Cm(PC0k_t+&({3aVczSS?pS-A@kr~ zc;d{bJn;CZ?CzEVv#drivdk=JH69gf+;gL_1-`<`5bC8`@lF1(Rtx}MWBCtaf|Nsl z>~9S6ap>HIus3z$S|^1-1I4p4Ixp+GdydPu3(Y5!YnSJp1@Zo#OJs!U3O;^W8mhN0 z5kul83B+fZ@m-+wl+E2@>?q`YTQM^=3iEl3bvTOm?ctF+6XqL~f(yzhuJyx5-JX@L z#P?=6w3i1L?n+xp-q;OT16a&<)ENrwhpJxa8F-SNmT8X43d+>I|9`bi>IcZZqcv{} zq5@T^&>q~eg|7HN>KR3B$kUvv2a{27^>E>Wd_z#oh&UvwleB%}O{ikgkC%fKQaJB+ zqVT3U`iDP>uu2Ry$@7oVLPGHZ+T>C>qPlNFBbAJm$KeL1^=|!KF%EMHP*Q;!>;Ms7 zx7fXFKt1^}{%lSf||cwrjDH`i(fGb>qHg5Dvf{u*?@N4ciVf{X%I>YH&%L2^s&%2p(we=Qj?y)6*MaM zsnU?4GhG6RynsPfNFc0S28IJ$s3`}8kK z#)9t_I(u;@_!L}WJGW)>mQ(AMs3iO z2p#qT_BxdO6tn1rZyR4_KlfLYf_L5*Az|&4o2fSw1B*9=Q6*k$29EMOksY(&2MtQ6 zUq4^>OZ-0~9UtFVdAL1p&ZOLqR>%LK*~gmDUWNJ)o}M*{b=i@9DCQapr3J)Q?@ngP zX!i(BmB}Z7drfv&OGi$66=SOFg&U+B*`x<^uK3>%1RowXGMnkxQDR^e_Pcts`ftk2 zrGShVB3U;m*7Zv?qAUrOTzfH9@=_MEk2TXU406p5gV<-{6)#`3EoWR{L9ab{&_m04 zF?01~|FyVH7;L7wwFYG1P(>`FFyhuHBsF`Wl1@e1>6^*TiW&EzKKXM^SftRwW;n{O zN%r-E!zj(zlv5VN4c%%g^g#++64Bx)5KR6Fo)6r@)A7D`6M?Hrk@)FnR=9 za^hQ?K&-0zO$EbiSM}Nq0lw9?iiM)mi$&T`ni}2?cP)&29%Ks{d zBkVZg5L}47t-4LeEab>g4BLYX(%lWU+v<2tV4i9=>PtE18&1iJ8eG6>O45fNndnP| zb&CM%|EdsQ>i%O4X9#zN_p|WPv23is;0oJ8VN_CU6Fm>t*p}?0i~oIfMMsE(FyTU3 zvbD#ap{o@!V56Y*<>?ma@}V4Z4T1s}A7U$jnH_$JF9edtQ=*PMiNnfmx*>WGrY+5F zXtO+AYc8kMAzRW7wVlInnWUREPE5uOh?T_NBlexg?0FZ;DfwM+3jN{Y>+l8bZwKu^ z0!y}YicIASYw_P^zJiU&(NfVPwA^IWts=xJsGd=Fp`Y=6&urR%z2E;HO?`L^_-Q;9 zGiq>JmD)tJVYDk+Fpu?pNqu>`DU&n)u>LlBp)`~HS* z?_+Iz`7<2F8k8{ZD%enyl52t)cdWSdj}zm_k|SBW z?f0y+HGh$2$m> zkjj6c2KhrEs9O99;AwQc;P^xPpy=r@>eQr*p$sfIM)fPx6x$2({#(JsRM0d7VTWVKS&MY^uoySv*8kF?T&K?nV1`&3dj%*R0 zgPYabRPD?V5bI`)*C5t%w;$+QIIgXx+RXBQx>itTsnv0xsuZwM5p{4lMkaZ|Fmb2$fs6`&JeEKvm8|>fEFJd$oh&Z zJMPqJTl@}b@54llQ1#>`LL|u`Alk$y_+9<9SQ@{L!m1cezyC;K6YVtu`@8-z;W=PZ zU$x-7nI^%mrOn1(vNqgmfgj)R`&XIKX3*vv7i&qrBof6_X?f&mj>EY4tQ^72wSG== zmo|8cpQfTj%nelM6e$1IpgyGJt@-7b{mg4aRHK7hUr^7;aXFMF$$mq+#`+9Df{lrTi za4}Y(qfeB9!m&na#H@Wew&&#UpBx-3V^bwD8SkkpCR+I4P0T+9=Va#k?QPn2&6gNr zaTUCX!#B!tj%^q|h^vB{Kr1={DVcbx_@Z$FWiLv#>#$O?1lQ)XZ^?OO7 zRtz?VB5TG#xQNeSm8`pEVqVbmp6e-QkiejYpj!8lF2HiKmH8X;EdC0 zce!)_Q*1mwXy!7G2kB~nd=SL}Yb&ulIbOmpf-oW7Cz6^dktQH!YW zV$?0Pxsb=(mkTGW9xWQ{5i(nEy@*%~lp0o3j=E-~JdSx;M;U*|0|omSg!OA6PLwew zn>d75R;teA#Af_3Y8sE~0s8LoFb=P|gg7Xqp^$kh@^@t18=M!+@;=6#<8S+_@GC$gT{+N=9Q+(P;W z6{-w)xPI*+b%>kq>uzIoW6os0{*Cc`$F(d!(gWaAvNhOsl8u>GBSI8831AT#8F?=!>u7#M={>F)>KOj+_hfQE97t+{9Y zqm^Z9mU#MBU{=XFMP+I`bN8eQ@0i+xWl)ak0Eo%F1)}&gFOm5P)z8T@w;tgufM3qp zwES%giE+YD$xIYva2VM6PSG(4LoR|=FP525SzUlNdP+$cG5UK@EkTZQXr*uNAW1u! zMYw}cF|0&GmI7wo<1N5YPvMcv6H%UE9$!|L=YFuq5?=yWMoAfo=QgMg%?9l?_ypfd z&p^)=1wC+xKE5=kWAn%Bw!*x94s@`TpV`6Ulx95r;+I=>b6sf&!=9T%Vh-n{Pfl@6VO0rXhHDHFa+B z5o?9AUn6Fs>TiGbUbBk(l(<+iC>i*9(F~z#_Ri*OnkV(g@L?IUETRL;wDB{@=G$t( zBBB;39g#phAqr^9sH%;)!?lp07PX2`7U4g9a6dTotyFjr9DIB_nASKTLVV8k_{q7@ z0Pjf%G|31yZ**Tdn_Y``%+Vqf06jrAgvkz~_YCLm>`*{0cgArbv1QmnLKp->*c}H} zAoJE<1*0?I8@h0I#XSp%0HSQ_bn$PgA4&+ecUfeBXGAwSkfhc7uWGwNAqHxoI~Aw^ zilZ?H0;N0=(6@t$c#jqr0`p1DWbH3kPR_DWSI30iZ5c^_n^@D{xlzYFe+3hbpc-dS z8z<9VSgLb%{B@Y8L`p}kQZkEbQhex4FwMBMWdSq@(}_=;{W^yN zKWOD)8wAq$FZ#RWkG_%{IIWluv|d{9CeJ@Qp=Dk)Uc(vAG(N--f$_ z)We{E9j|Grl4DjyOfb|#ao05+#6TXGY54LYN60J@)6T?;ebn2ri>Q?wc<2WWM zKh5>~5xXEP&Qe-joU}rF%;xOaHqH|!wXFt>m&ul?_cSGBWbYRJa#51eYLVz%RkaiW zyccWvwCweeo}D$8rv;%cT;HKQPP1IU)30P(ULG;)`j) zwuQM8X*PjNJ8;atQS16u*k3=xm$99HD0MIoP4_4<9m(MSAR|oZY$z~ZCQj*Y7*Jn= z;j6UdGy4!^=ufDL?i?+iTgMHCm_8CT|BHMR(2kdGF3l2b+_#<(J z<7eqLknYS3cpl@5gxLyUeP*O1Kl0y zICL&fgeVfy8q(4QP4ZXUE8mMLt;aSyHOajA+mQvw#Ho4u z#9lwYt1e1zAh=#6j~;i$W(}|yylspM4+W^2#dSEVU+*>5$LI;-^ueZi{paV6&u^FA z{Gr7`J0IX1JBN7%lH%ZZ5aJw~WOwyA`>z8S*x~<<{*fSV%Dkj&N%qdJB$QfCsVytR zm1Et)$hWT@(z41vFZEeGs9bjldpr_#qB3DkceNBrS+kmi!7lLzE8@6H^mgV=+=F%o z+cz6PDntb!Q*l;MDpTikGBsN(w%Sk9O=PaLcAqEAFr6Xcl%61ArLYT1-SLC*5{kZ; z5g^WiKnjm5CP7C^{w5&8ofinXrg6Uz?1&(=8;(HftkE3&{>b?*7yCg$MgU zYDqUYOC+ENpp!s5eGtVaU`!%JO3cVMfnqO4u~>VOGINKbKdOju%9VD$zJ8}R8P%dD zg|9xl{G$k{cmVakJxB3I$UkB>5z)=U)5APIxzIv5y~KQ5sG~10O^K~}K=L?3#mC$g zp-q|sX^ShU3fUSTU8a3sn6(nsms!Mh>t2DSdtc|4UfzU|-_gnaU@8gLMoC$Yt7`eU z9}v6NtH~GrFPB?6lZOZ%`4#^YM@E!;bHk1_6nG5zlS<#HeZ(lo5|@74O>|J3v`xzr z6!t?%j`OlRu|2r$DDK1|;%RG`4*q-4m4w@&PxK~??LUzLT1#mpFs<2$s*(SgH}%+r zE>WDaN+~Blk4pI#{0`dPlkUDb6FFBX{h&hH2d~vTEssNW?DD{FbE$0^U4hR zGhUAg;f$^GNezfpWtnxSJM)yO;yrX?!a_7Zs)+S==)WKxX~B_W=mP#Yujf zz_ub1jxj!4&(m8hfFg)IOXiX(ShBSq`dOR^$xi4!eP=92y7sE5DPNDKy`Nz?$szkx z85&-_&!sy&ByKtm6WQyA0lIvuen$|w)*r30>!<%NT;Gb@-enl8>f6_! zr+YnT%eY3W10Y>u%W}O;E#9l{zmV`DCHjSWI0lM3S_fh5+=v^e8N@9ig}QaF<8Sbvq|R6Tr-s#QnaL;Z1-b`C0Upj1s^l~h@ld6IY3jC$+z#+pCQ1y^T%%c|EYhu!%) z$7*4qEglM)8R?dZ-$$leR9%}}N#Ck196D4xu`Mhoz93mk{w^lpQ->{zR!s^G0%A_i zO2i6O3ttOu+iZ>#b?BV8^~b^~AvJZ+bwNbtyQ-ePqD1Y#6wA#%+7gGhhmU`^Pz}pd zMTX9Rmu4xehKzMB<{0dT`Vp9ntQH+Hvg zB{}a73N5g~eL7A0xVPD~GS?kiRhp&Vt31#uRpEx?0oJz#L=<5t1P4Oz*4(Mj>#xXk zc_>QZ;60Z@JH`0ucHgRxDWf|_kU!05h^`3Hmie^x%AYQ2JC6-}QZaDZl|7ZregMWi!PYgkJcvtI zGI(HxIM4b>g@wwTx#|N?q1%#)!8})frSpWj)FNtuDg-vJR-9^G}#hTiLE4frLQ^*uX z3XPb06AFnQ8+nx!U#mY35UX8kb^F`*@4zBDt6jAx5-Cl+X3_Yr`s+?$J$`VYtCy67 zRp*yOB0~suR`bQDLc`lp26KK{+d40@Enal0%uGK=>+&g(Ao&g%m$;kgsH?W9OPZ#s zmTO%r>a-*p!%nbafmS|>p|d1~p&2Y)m1JQgDuC4kY??g$bdLxOWBmTI3Rx0gC%@DfcN7N zJtozoYjpVv7vV~4{D`1hxcCGV7LF{5Eq!;4XeV8ES$B?d74&0z-NohrUjYPrGeGpH zwnr2hB+A2_6aUz)9Y4n_H0Te5D*B~3vqqK}e;VhIVF!PE01G}$;p5S??pU8oan0pX zlUojOmB2PdQ`f4x41rVD$4S=BPPPii=kn#0koIMp*ZJz@mQUlV$Lr+p?!ZdJ-uM8R zdn{BK(xAu2WD*3}>N*d@rB#X5W21R$RvLjytoOXf#-+FDWA_#569XFqTwqAe_fD;x zxh|rNU@yZZ5iViWV-N6EW#BuR25@THW|~Mx#`QFLf17iR9-Cg&SYnnKzGf}dz%Y;T z{{T`zt-sWk&z?V?+qXKYfL+;N^$(_2?G`i!yTs3t-&WNaRsmZ_3}RML4k}LJGMs`l zF+ljK8FVa9<-q!EO2P(vUgRg>tj*=Bu29$g_`K1O#gv0bM}%D>Br-~(HQCj= zP!y=hJk{`Yx3yVicBhdh2@D_d#>^DVKfIlh*;f`S$H7!DtH8xliqXN7Z3eHsg}n{d zK8U>8IH4j|KcQkp9(Ye8hQ{8=0w+SfsmkV|1;{$H7|x$7q3A?A;XyDK{%nai;JFe- zkoL>a5~4?yg#PWCL;!TEhf9p}8+<0l!%Em{8J}}-Mc($>o4AKzJwVFW1Neesy0Hrj zp54ON%3iq)^f?}f+gF6?%GaTFPzoWNXzAfeY(Ap8Wf^E1kzJw~Kzek8R z^@2ccxN=2QuVY)C(Kd4?xCnn;%d_9VkMog)wx7-4wmQ~4(b*^o00}T$`vdkUaSmxm zJ|Sr7vnrLWBZzolSMIz)7Ok1(C@iaaIGe2Yh79s+;F54~HZK;m16bylc&C=0OS+KB+Tscy*a(dYF7Zs{? zF<2RcH8FtH40nDVcPM3Bl$f|C=1(OROM=F&6zQ2&2T9kDs{b zaVHW$MthN-^YLCKtWbvS_OJquUEnR@UQQW?g4NN&X#w6-zOt0B{r0?c1)e)5jHm)^ z`KF>?cQfGq&ycHL89dko5T*7m36R%)^{b1+5Y;UWgCJ!R;&;FlkAv01dhGe|@CGPp zdRd>$3LZ#Hcnvbl^>Q57u|W>ke!hiMLml#!w=~MHypX+=;tQ{rVa>Zfyv}1Wr`oDt zFh#o<4%aEAk`h|uiDfOYY+X6s1QSk*mG0Q$K%w_EG?edAG?&3oMq*kyQ^l$YLaR%! zkja+<@!i@PNbfFT@x)I7Eq)Yv@cfP={Se=+r~Oc<`i}M~%@Ak1uZ7j?*_OUl zB(itwZFk*v*Iqczo2MQsoaT;j{eJUS2>f2I0D<371~e2dbe8!kT|vWz>UU4|^be@% zf|F}1epjXPdUL#s3+fGvuWR8;Li`l0R>Ly3-XfTR>LhSg%5QCAfzo&vW0g|-uFEO< zI5ayx&aaT-*PA77R*{Ilt|B+6IStYq-4Vg2h@R(d%Culp$Yjl?h`t82Y(KK+yrX-B zZ!+yq?U(N#AKx#>EyGYO`jW8MblztfgRLg{t}<8Z=8{}nTX+PqK=OSY0o6@cjcx>G z<6BL_APUbnPjsB`HNAhjZopolUuw44^Wv3Hi}9W9Oe(&nzY z^#qW=6Yl=Ne}trvebtD z*s7)qqW;=@_!L-mq<;FE(&d=J9+=j-L@v(^HlC-Eyely1qRoSJsd4(6+4$?`)7R#G zpqg}u>qlKSmDFn+yzLl1h2kVpd52W_`&(Q3Sru7%MvoP zZl>_3Nx4cdzxqpf?i$JHl(=8(l#5`$mz1iQ*~2Ci_Ay2!B?(Fa*5w52`Y2de962Mb z>p8@YJ%Sh!FBZy6V@B{m3^X%?ZO`+Eb>n(Ej(9vYHG^Hq%aJ@C9Q4pC+n}mZ_}@XM_0^I9jtiJ%HBEcon|8dPk)YQ0L^SJA5MTZ>A-82h zk&F?QzWat0HRqC%7Q38$`oG|eIqHwJ7*P843;>11r7{Zbs=PqSq&O+ptI%iBsv z5iXKZl~>V_gaOf&+@!4>;7{DEJc&;OY`n-$0h^1cR4PZzAp7l`_L?cPaR$31ugJ^I zjzJTp8Kj1Y5oD-VMx1x{9y|aZE}U8PvtZ>eT#)UohGqRIn`zn~4|5;AR*c<$i*&Rc zNEk8kahZ;+yd*Q`;^CB4E`AyRzDN_vhI1B4<+4dHRvJ}kSY(pp8IMmV!5Ncb_8+kA zW|c&u_n8n3X~mwyCP_OI1$jgFd9kj22K~k~0(IET0M-&OS*U z!S6tNs)voi;wsSJmul@HR4Du}v1z=KuQl%($0pfu)Z^ON6&r4M1xAjIv{1&7Gtd=v zP-?xh|3IGG)9ZM?#hrA>0&Zv0g#A`7V-&1AVEDhZeFu~r)s=R=>aOap&|O^}s&mdc zP4{$9?8&1%L2;x}mXMHyW;7@vizHz%Mj(L!vtXk&!DKX}k!V21`qu*6*mC&I@!8#D zv%$NI0n2O5k68oi`QNMVo+OdInxiRo&8X_V`|i8nckg}gKIl^=JEJ0cMs(M>ZA|iMasQx}J_$*ehAP+4` zw+!TsKcVzqizV%`Wo%}zfswq|J<=Cp1h*lhR7vHGOrj!bQX+xhN^iKGiN0-}wrtqw z2;b}R7(+Es6La|Ya1&v{5?E%;fO(7HbU{h$zWsAlaqnSnSn^1uIB^!`^CE%AWmk*& zycxCj#5#hLgE1|TL6%2E>=bU25OUY@{E<7OJwt7pkl!mXkg(GRrH8nK2vp$xh zq(G8U8+k@&`R46CdlvYhiR2hwuU1+N9BEQ7=;@iKcPjJ_lzFOyV{t#pz&Vt`Qe%`c zgT?~GqF}tB;_W+(lqB$!Fr0dtou*^c_5oHl4}7+rd{D9Ocf}2Mtt`5(p?xrKau(J$ z$L4!cu{x_yp#H&@wVMM5hSK{j=A0YCWy#bC%*y#j1S$QaArMVuTDU>za zYC~pMxZ0On;jHmuF|1`Y2D!tDaWl`GeMRt8L64c0N=kaKU0kcU!yT zj3ixS4w#g<+YsRuut2@9e zI3XiQr<&Ju}hG>H>uwMGR&%hgtW+!hKtOIOGk z56*@Uo+h zJ(D8_`QL@tFXWpmRsYI#P$fpT#BwH|y8a-0$?^mES9a<01Cp$K!gni~28MDMR^{{| zrJS~!Zq6*qm;wuTFPy)v!x8nHtzMha=51Y7YfTGh80DLhfX=3+BYvG-OWS?!^(MY1 z8ox#Yvy9zDWhC2=NXR23EU8D@B}+ER-G^7^tPGUq{Y>!*EYuDb85^aY5%4> zpwL-4w~y7COB)3NNOcyKQBSM&2n`4Dm+|A!swS}bXh4mou?1tG>TsBa59pPn;bGSf z{RlBqUVAuYPiGVl@_ljw96t`{s?`EDBoH=b>=3Q27N0;*nbUZEUs}L_H>n-*T-M_% zJzo7h-H^Imo~9*vG;bF{jSoW`gtFg`GmypnH*7ivPCQ53|J$e<5}W+`B?ZhT8&^9$ zwQZwxWfg`d9bR>mBGyuf#+zHBQ?0_aavCxe87+Sy6AYwlf`O|1jzRg=VD(UAli*2I zSrAH5z}(;kh{QDbJ)&4Bt2|`c!B-_&5oEc-;52BGTt&YPqNMkx5_f6R^NOmGkw` z9MY;CV!J{7vZ4f*+3lE;+SI!$(vtGf)^=ir(X1Oy-&g}*R=Q5`Y(YyaM_Yy+qxs>6 zY%nzx9MMmcSEU?X{6aYm{0Zte`!gEia^_K}=5M7urSn;kO8NuFl)XCq-k>Qpsh{q6 z!j)K;>0W9uCgUk%LvK>|@j5#DGpYM0fbg{mZDKcTZzokKJ2K~&4t;w#TI8#K(8a!=y!#D;7`e@Z{22eq)p zk6qGYv8_0khq!nKwp9a>(RBvXg3~CA3ONcz8z1C`-4B&n*2k3yl+8$gLTVaWynkW; z-i4lE-+}%`dlveC#8_f(d)&q`=9s&_Me<(fNM9^4e`rqUuHHys{?7UC`iM~#t(q^@E2i=5Cg0ovnOaIK%K|{wU~}h#O+c7kwEj1YWH*!sJ}c3oT0{(GQ5-o zHm_+khJ285SM)-zvFj7=_{PS<%A83gf#$5smVuH+Byi41Z-nAa{GU(?0WC_z-;lv+ z03{ns#Cx}QAr9yY-sAC>IUt&AuZx`BchY6TI5;N?tcm_V{$UrVvkmD+u!{17_{DST z{LHY_rFu{mO^E|k7EQxWRn zf1so?x!M6+*#LEcfURuCI-bY!;LcNyh$F%pi{OcIj1AqM6i?I@jNQrXQDdI)4%0_@ z;V25|?l&zXl!e}fbY_6P!enhyoCtKR&AXbCb{4i)PExi|t=k>(H+0ko zJcSimdoE&yA|~YoX%3{VK4+-0yD=y^5bsJD870SBZ5o4;;CQ9MqBrUE!Io^KHL900 z3dUmB=oL~{#agrmlTHYbSy}VX ziz~{{T|D>OX=FSzi!ec2?CtGqj( zNO+q1^I##;dI|hi`oFa~j|(iTeim2y&Eoci8gu+T70o7QY8C$`FusO7pJdV!gii9&Zh2*%5VDx^Q&9A2= z+ojSgB(&fqw785?8H7>CkkM1AhCfyS4tl%P`t{4oJ1?>j;QUBu@O8E8pgAL^Lh8`c5hF#a|J z9T#-e+q2J-6x1cTf&t18Xig@@NlNzZ2T6*6HScY^IH$?4{?7^BZEzl@V>q@Mnc3N;}s-7V@LKYfaK>;V`{)(1p z!d{o(z>>rG2AmQCE>}43BNy1QWCUf{q^$|f-;TSfg{yLilq_hPb+H@OHZQbNPXY{@z~UJeknd@`4+O6M|}-CD}Pnj;QJ#7vjAQ(Cvl?9$1B9-x~oNy+Wi&^`Em zHJo2+nR!pAgRNUQ@uqY@+Bj9kc~o5Ec0#P;+&adsg0{46lvwk*syGj{9e(+STmRue zuI;9C;i4 zD%E%DqzPzE?4x?7h(CQ2<5{K%u0Ls6Nvwu)yLeu#l|6m!uZ$$i{&cOkLecTMN{M;p zF9a(uL#7G{5b%6IPaP3Yh{r zMlwoMKX_oynxpHJruN+fqu`Hdgs-#)OpM$R_P7%s3-^QA{6gMrO}e#ahZ&Ux*IES? z?{Er%MI&<(Yd7y|`#OXJRFAndA$b7ycmUh-JeJ0PTTt{Y3G}oEdU^t_5>%J@y)jHl zy$JR}t?2@LPd94dmmyaKyT|4&i4}qNl*>iTTV*JMJ)^|Ba(QOxYpG^cXfEf^pxM9h zG1~~ly3~_l z#jsioe$v~>OsY?H(KwGRkQ+Fqt%CYV)|T+01s@mxpfajt1glko2T4n!J)WNvCs&iuG)6n-o-L_CgEEMmrgijF!XS+(M$UnlX$FWw@ajfqK)N_}t^K;~YH zdrk#X0db|@Z^kgzQG~Ogu8znS!Tzzx091|r7>@~+;TH=eRtv0GnY;J$Yq=&9152S0FoT-K3v>cx3xb9c^SpZ8DI07w%n?M+tj#Wjx`kt>8wV(3-6N%Z3$Ry1^1FeVTJ=2>@&P|)7gv8>rAN^j$mDT3xP&5G6{XsMdWseZ<%N4KPv z>bNs@ugPYuVy&1@$%oDRpSfz_Ya3ewDn8b8?dZNhZ%0x?Bg;km>lY<^M&@{czP@u& zWb>V?!==A!Bkc)mU2RflOw3Is=Ohi_yK5ib+ZJ4K)ve!IIseh)$95FtO0~x4w*~Yx z%Q1~xZ=S2PXcgJb$9Cp=Y7Dg6sJ!yXQn$OY7y0Y3@4udo2+xX$@T`akyUU2M=W`;0 zvOotET^nMz6Ogjp?QiFL4JI+8FLtiuq4lPBhjM_ifLjy2xVSZ(2LLpbu zq{7s_@tVT=V`~$p&b@=Dz@kqY1qT%*!t(OB>pc2#ln8y!h&z%LSI3mgm&UD5HmU;mpEBpFJuu^%;}FHsBk!l zIjcl4nQ1X5AtU}tXp#MbU~zix;o^?gt5?+X5G+(GIyrxHOYP!%tGi=s*N{TZLc+we z!*v6V5GvYZHLK>NS-Ds;l~Oei9-O=S*oL&NZdty4`@Fzi>+ZQCt2NtrwKZr-c+GZ; zIoTeF&Ph)Kg*nv~an>QAu#;M!-RKlJ-sdq-0R^2|v=~CLpnx!u{^Bqpxu8>zu-2p(Efl#p!9l%+t{nv)lA0oIv6}9%W`r}8w&JC4 zf-7gjgfSLy#QknH{(DM6NzuKJeqM$Ns0V8&&X6*kYQTN4stVp9bsYTO;Z ztq<+2JG1qXT@Ae6pi~=uCUo|#(P}W&^gy7fF|$@bo}PjU37%YYJ3{uw&{qBe;zSMB zjs1Id9sJyhv(It(0&Fe_Hy80I$61So&Afo$fMKW(JNgNf6UG8g!q!!n%GM!7NhAng zWs}YH`jE{9O0%L}TmsWx1ck8zw7rID_1e*j+%>BQUmFZhqRwF0diQ#en)PMpBzlKB9YDypEsU(c zZAGY5QU_Y&mTXNzXNY&jV;wOAII;e_`#Yw?8KqP!R2qxc9@Ntc729ydE%QY{+j#p> zdO^mF0BzeHi`}lKel$wUp^sykj%W{wi1v_(XxZ{fHQCR5QjMkInisxudj@tWrk zUVmz5y7U)&ZBHWGle5@zi&B~1S_^JE{L5qWy1xF?!(aX7(Rp3Bp1*y|Eq%_&vct=- z_*$ur?->~sJGU7Lj>NK76=gN|ve`Zh#YsqNoh=(&D* z)RgLuA}1WwE#ngoGae18_1MgAHL3Gv>`5STvnY; z;8ixO*44JDJ=xb1XC-8~uo%uU&%}q&?uW4mmcSau5>Bp&Zyom&1QsuXe?KYs&50u5 z3$!%qglOyBM3>M1h^zAmwWi}2_;mcT;Ua*Y&~i60)`T0a*DG~#S|tgUoCO_>HP#xh z=?L*R$P^S=+K8842OiLrOuR&wkHDc{A`MZWIpA^$prkf&G6K$!i}z7_FRm!%(0o`k z@ix>FAJ&RaB+BE$B#J#+&|=D_KdKxj9QcsqIJ`)p7C_gxek`&PvY3>JXJv(`;@RNv zXE>3_cd6rprch<0o20Yznuk_rR?SH$Wf0P249R-)i!!wfY7AHHG)IG8wMlET&bVCsbMdFo_+<8g|}0(06cElSicrcJF*(i@U2KqM}d;nsFx!{+7W;8_*;h+C0my zUlRIg?mQtL4XV(ozy3PE2CQBF^|fht%gW)ybDM8Hyl)@_sXg!V*!_ZBPRqmdHqTGf0i`o4rMlx;$b? zKh_7@65sgks}}5C(d6Uf8^5)4~aO2O8&Ud%0yXLON zhkka)`~^pUa?AGH`kdkAhn87|PTjKj`3dHXgb_j7D7q*Pe85LVl2{ zYM&8+oD-+lCpkg2Gn}9TK`Uez??&?n{p$zM>C6ySpxED#Ypr3MFJh2A2FW6^#_U0B z9Xw{UPoVLU4Kxs9Ucn)735PxsYX5+T3Zq%+%afAxs4($$8HXUWm^HDJZ! zo7bilY7L_@cq~SjTE^?t8h=9&B8yfkl^UJkpP~6MAoF2leuCrvg}c#Mc2wpMvL212 z;d%rHhz3LJu^3tpXfKr~V=+iZfwF8l*y?2Z6ss|la?Z@OPtLR4mTwI99b8fGQYd^K zJMQ1+>&^#QnG|-NrR1)fwm|F3Iy3IMX3^sP3q9}f?wmKZ)Ts+J`u%l2HQ2oD>l?G4 zmQ}-t<}}@M)4r8ixkAOTYLnXG*U4yxj?Ukh6+Dsty=#4Wuhyi6R>Ne9HCAKkgcs9d z0c16F_}{^Q+VT4!&oqI>V_ZM9luJg5rJuwzb(aaI-}J-7x18OdYrW}*H+}8<`*Wpt z9L+21TUR$)o#m?qzxn>ZK0UbniT`=#-&Wi_z9W_&eqtBAMsvF!uSU}e z17w<(=P@UKXMxi549i&1Y2VFawB&sH!j}o9yBTy)InA+>w|1dWy4UR1bMkQsAq7bC zST&XoCDeq?Lp<{jQ#|vJBG0_yG@r|tspeLZYW5?lxnh)DJe_Ky%a;nLiy;wbHJtu$ zt$krmA88I|m$yb)bWSQRqcu%~dpkDWyD@2;chio0!T&>Hk!{wXiIM9gZfD%<*8Qn- zWKEC9SsyXlJa)z$cMA>!ul9LO>6Hh&o3Fj&iS75J(1>`x;hT~NV6T^>czP25;U%2& zjWXw4CUVZzr}-+|Tv85_NW~yYKV+IqE86p^@$@fGGaqO;aOT?fT}yK)Lc*z-#N5r3 z!SpK?8k9EV*=>`-^ntFVQYO+&xzIGYyM4`F8zzJ4U{CMS9nD&cjZ<49&Zyh$Fq;w` z;c#clA`|>}t5+*Gr#eF}C`!B6F4y|32B%&n#?lw>pI5)RC#RGUiJnR<{R63&(26M0 zSVoCG)fkDof)Y!{r4S;*MX>3lvyWar1NSqy&XZ zD1YmkmQRSO^A3kogQDu-yW1WeZcqt=f-?r}W}lwXoAsuezFcCS7+5#^@l*gsOl%F= z(ghp`AhqTQ!u?8Y9VaDcF{~PIhOrf*2(!sNpLp z2cT$xYXOcPZ!UhZ=a%c?z^7iWf`@dPNta4~ofXlEv|G?jUC|)05b!1C-Se@VX#PF@BwuOzU`5UjT zM#Tv|oDnB0^?MXl5KsXi_XD5?3GuW*D7``gNU&fLzw@Nc!0^S1*H6KlJR*$;3zWMr z$f*EBsEQywR)7Y#QV*d_Aj9X+rO|PtYX-yEAV7703Wi_+1mSC@y$QYGGdvDOlLpI= z85~^kzZ;mB%$*F(E9EFKFJjS$ze0ieN?ab{5v0py$tk4~APobm4p4c(6p9r+EC8X1 z|FH^JFCe&@c&n_E4AdDWgaE6GU6<<5)`FsfX4R4>D<*{!F5_A_Jc(?gdQPGnlsMEZ zfJCmD(Ky&BPVzT=aXH9WdD)833#zm74FB5J7vpuorcnLLj+g>+N&-3q#1yJvGoW3j2U=Aad2Q_QA#TQJ(4o<|sNv$nH)>DqGy?~z+(<9kzg#t}i`Hf?dUaAPzKc_K>vN23kbaXr@svRZL zB9spaPg0}m9MgodAXEz~EfMYKmw3xed-?J7>(diewY>auB&xu}TOS#2;PiT~lBq&V z8Vs2p$h>MyC{s1XyWW=K$ujGzWU3(RdKE*T8}S$LcZvVRWl{oS;N9?!6@MArOZ*GG zLssrI;XlC-ioYYP+{wZJH7wqdSMIp+m+@DLe}Z?Y%AGd&J3EQj;2pYhXCA!sjQGD8 zbO+AO#tAR}F5V+%WW+rIZ-{#W-avZ-p5gYppCP_7-AVS&B2=}j1Tz&7Ax%}3qG+Fi_e7~vK4yB;Q0bAddPpW>?00TGBKiyOngEn2HZ;t0da-!K3>NXI7w4a zL3hD!w7S*O@#@-Tys1u(D{MxM5hCCgT#5q;AtO*5nkKUNK`5ClR{K1r#T!mVolz&2 zF5&|PHRXPM$a1{}x9I;Vu%E4YR&q@_z*pYMdA_3T1k$k2wmd+<4=T8li8m-o*hcQK zJ7%O3F?&tWPLVXU1KL>2!f^YhcBeAFVqP~0vFfjcJcP<-GB_;;)s604GOYE*)H=0X z>oi-PTBE?(^F48QNB^ewHdIq52gi9B_GTfr6moj-PC?N*$J3efbar}j5~Z<-*A*<7 zvhmSOL2K;JB%W%S8~S^jjcD0Vo#2J1krGTT1(;m>|A{LBva_)(J1w?830x$?Eqpk$ z@<3;7Ud~C$q&UOMtkDKph-gxWA7DxBI zKzrO|Eetl=7!^k;G!CQPqU4pasNglSBySaTCXP(UJRy~!viW%fN3#YUXRVnV=~}PG zCAN4Y@_pPB3H(*OecH+}FkX#$-d5lQzajQ?CE&S_KJak?&yP#_Yi8JbNg98ZW7pAo zpSXvk^a?cC1a#MB?@QFKv?q{ra_bmX=_T;P9~r#98>*^$1EF?V^=^wv0d7MD`O&_C zQo#?_lzvo>ZFupWcr&!~{m)~y;7B!70{&2-F=gE&M_tEVxC`3+ld*I+x)yk?z8e|b z???Ai&uR=$RYw`&SvWlWg|q*i@X8e`mgP+vt(hlTPQjXk79(`{WNJNFXBOld zyAbx@h@11v%jcYW@n@iJ$FKsH8THo|!Rc|@V4&k@|22ovHIIfugzGVWf5T%HYc@N! zInAtHk`d8eHnxdB6Yd#qU%jv0$XIIn_x2joVY^a>vbdDd9kaw+Lt69Vn$|T9)*sP& zui2IR|LlDUcw5z(_PO_J-!049Y)jX+EXlSk%a(U1@gnb$m&kTDl7KA9wumeVNlpku zNT4lDSz5}3t^K($~{>t?=~2gr^_op4~c7^)=yj z7ys-Qn16lMXnJxc)n8UQlHRl}-Df_fFgi<3c9TM7wwucB1{pOnabSB>)3&QOZrs1a z+q&bb(Y7&xPN?B7B!t}$0PaFC{UxNQ?9QmY5;te~i(RBJ9NQN~N1 zRh7l%c9m8w)>;jvCQV7PqO@_a*1E2DxTXj5a}~sQ7%*%?doVx0*P|RBvkiCJhKFsP zi~{)C+0%p+EiE<3qw&x>&z(M0L+NX7v#QlPWYt*dj`yt8gI3CF75WaG(7mXmb$5}J z*om3yiqx*1B-eNC#J}VT_jB{N-~uNft*afha_RvLKJ1>#4Au;_JGBzIOj=sgS!;Eb zDpi$jHQh3$n7mf8zh^^jQ+acpMFK8^vwxAicEhB5{myP{QKh%Cw!21mvT3}fOsXo< z+N`WjsZlD5&1!AAP9{{Dii?d(K}}U@wYo?xR2hraB`S%mM61x(^*GC#oEC||qE}xLe96f;ox%s% zlPt}CL4Dvv`-|;#`|VkzILCKpfu60Mba}irZr;AjvP&D- ztlvy`ZV+vd)w)&gJ=er{ZQkH^Z`iyme$5`SeQvhWjv8KQc%g`YgB$+sTZXXV}9akZuT6)ix0ew-bNcP zEw?qn=YDTvqn8fgOw`?h@QP&*HbW74t9LuyFqZ)9!FHd2iilBair#Ifi?1Y}y;V zdF$v-i&`fa;K@|3v^tus-q8kqaF?ywUZ#|5#cHiUu2ZWk>pLCWZwWOE0+-yKSYJ^j zRqI)khlQh1omN@hx4mWQTBTMe5lL8&i8ZLDQmtCrJa;>XlhG5LkL7S*LDr8F+*i^s z(wl_8M5V}mSg1NmeWypMlS+|J`E8-FNbrF17=SIJ&+vD<@ITwldzDO8-Wyr+$(G(! ztorcx@}eU7?;Ra&HLQ_3sMZQ^ud6sz>9jkSUsS1;D*Aio(n`*v=c#rQnd7{L&kHJv zg(u1S4E;3Y7yb^`pUG~ge@3>SA_zJma^ny=AL@Iw?q09r8(J-%OW=IKi{}!Rx_H>D z^=b|6f4|-=v_tTY82$lbc!s;<*};Xeu8zNcnSC(M&8#~4%S|r%|KF4xf(q#Ix{dSe z+3q&CQmK(La)q?AdC=Xtu5o1ZNTbUiYA;>a><|k?0!plsSlykK7P~>(IJ#xDkvX9S5($j+dF1@J7zk{Br2^;q$o1!>=sS2Mx{3?D(k9jtyACy z3wYr+;)Umk7x?@}RjB)t_5%-k@gti7UBFQPsrlqYi-B+ z2K>Y?VCSBNEm{5eGVcZhb=&=nR9DS5+C{?O3gm{GO1s;v5WFW8I$A271_{I5OS4j? zgpuon2Ic7qg-T4*VzrWfP+<_2NV&fWrE_-LfTeqS4An}NN^e)l<&4ejsJ0(hI;;wX z$ogF{u^0@6AbE3Vr_}leuh;lO69kPc@WaV^J{S&11sPT3)i?Yxje+qx==XE>d6t*! z0fF6`Mc}Lg1ajd|{yxAI=WP7kjX4bTVS+)TQZA33#_s^)IRoYx7S$mCLnYdB`**3I zAsI4KuRf&J$|{ahulHz>tfc(d!RlM9>FR26*)bJPIr}j&pK{!LnL7A+o%`37WHiC4 zL{)YS@nO*G9WbBcQPx_VEznQ5*18slUo=)$8lSoCme%_2z`L#8b)V0qRV^m=j{R#im)I7Z(V`|A96u}MF;{E)Y~^_0GKo6pm*9fW-d8=*?H?y$~!lzO#CCpM~$Y9!VjKWMqtLR&0?;^T5` zll8b@l?P#_J*Dxbpq17%&uz}Rwn&M*3@;h&7wL+;<`W989)iRd) z3eG}nLp^)QT5qrvi4IqA{7BddDUsnxSbr6XkPMQOA(WW^AU6Mw3##4O-r;bzw>#;# z)kQ^W`ZZNik&5pL^BSsyyq8uYRwb#Z(2H>XAf%yw_L#mxtY+j6GX`7C$O%}lx7$lz z5W){sua_ICyh`%+K0AIbk7y+}*>@IVYXp_H_7?k7Vu!b>R`|HRwYA#8USX-T=%ru$ zinOHEX397#c{>%Sf2UQb)wKHb@5%Z@l~r=R&A1$(?l)B# zFy2VL@sOnW6)tmL5uPh^vhNsM^CBw7-xU19uH%ox^3uni`2O@x&w#5Wa4B92LbG4m z-SO;;m)*U){Ti+!lf5{90W3U-*e8{G$kR7FdaRi~-qtwrjR5WUE z9u?_rjmJ)^UsAuJX4L9p&v7&66d@|+IEDNb+&lb#R`NFB*UIOSzr$`{HKlP0Pe!Bx z3Jl47G8lg*Dyg+uY&t13XlSZ0b9A;lDvdv})M-fb$O1!a}R;v=;5A0mToUz_Ic>sWir+BRZ68=e%%elTAA`rd8MtkBqdi;SF$D( zTVYzmP%DK0C=y>f| zY5t|(*4*o_ve#A`%*&IS5{>y&zUG$pa*w@KELF%ga=Ukft#fl{c~PCeD?_!()zo#p z=DPYe^R50!jk`k&bBV3YqLh{t$t^9Tb@rjjOV?k?Vk`TpD%u6{=|lFzJ*7t(-$PYZ z!kQ<+#11gFgoLRjcO@`CjdPPXf4L+3?w6)>Kp@#&qSw=|`tj&`+XfFSl89weacNDn zb;v)tvmK7+WSs+JP3x>)N4Z2Mld2WA#_pPhCJw5Z9ubV83j7YI!$5hA?@>#o8D>rM zF@Pq<5y;K{BnVX{{F^^3_;=m$hb%Y;7*L@Jd^OtuE=NMK}ZxyPteIjCu+My*=@z|df5 z+ul=2d)9@9>=LdUICERWDkdB-htP`cE&{t-^2YLNySZzFJiD#>3t0V{O9`De-=*s&BON-a(KQqq^tMYh3WY+b zDXS@O?01z=6_7G|j*jqWC+j1@Z9b<`Ako9YuUIOn z8`{yNx9{8E*JIH6wza@hv8;bS#9}x4_@}v(?x-6w>NmUADH03H;-P{u3x%p1TP`_+t9PLf(fB=WIm!) z=$`=XW+Vsw0-_(N=!NX1)*KhDr6Pq~v3!eCp_2dAL7Pl*tE{5ZsaupQ{;j-3Ushg1 z9UIWCHyI^cMIxE>^ecLtb3^Dk+R7}VdW>2N+E~zA2j6rKb@d7XGnwU*Y~%wnlrrY;E$v<2EqH8sQSamr~r)2^>}xb=UYh8!i3A{%y^2wOZQVH|psuZ^Wc3ld23m z{Ijv~!EL*!gWidjQkhyK6zj@#WlFWOt)Zz^S86Km@Kk%@)JaorG)vVLn>KZCD-uX& z@I46h1l`75%5#s!2G|~DD$Q~^=ALfgo}Q1*J#G4KYqh;>`F)72P%eK?q%t|IUCwTq z;%C&$|3Y2al#$8hvW!4sEU|lZ)JBC`$`omq6GrO5^4;9?au3itW=ocP+&uTVfqOV# z6HkA9?y1UhkIp_A>9MyujADsIDv=l~>&pkn`e#br2Cb@^>Q}&N`JeUmx|YrBS?V_L z^tuYMOfC?b%5?^*LfW>jsY9aGQ)LcQdAaFJG;L}e#w@-bMy(Taqz1Kd+~elC#|_-m z4cxObdOs2Ow9?MXp6wlDm$ep447L5iK2M884QGr(O{t@_p|?gySugQKwjXG2uj)3d zEw1veHtMS_Th>>2HfQ=BGgJPKO1VI+HM2TMDBHU6x?*LwMAcv~V88rJ56Uxs7{te1ITt+D>;Wwl157J19<{dFcY{`>7S$He#3gOWx#uaq3d z2?<9zOhrk>Abs=cjHL0?2!Fo93AORO@-}@|hxjcwastS`20TN`6zZfx5ddt=*r`}^H{tL}Yu>;3m?=1ldpW~Qsosp>gh-8l3j z4|HvhB4pP42Nzgq@diql9d%N_k5Xr(KkLZm6$~x~!aFIy9qn6@UDYJUH;@@Zy{uy? z<6`BFCllxDrnriAk409nD%R{AlsiYZ(#$Ad*Y=WFovlB8qs z>Ck*!%Q}g>Kvj9-dRHrplFMk;cPH(cY}R{=PQ6sykgP?=siAPV&!t_iL*n$#;AtZc z`X=^iBwpdJ*^|foINLTvO5#LBJ$-^zp1FI#_4AKk`QuiTibeUG#qyJ$pdS50p0n%> ztt|a~FMwi(yw*F6f7>#JYnZ?g)LwtGyrq*My7eo|JNpXcS7e5{KT$nYUB7hIlp44( z|9I%%{X2U73_&HKC*WL{@|VX8dm8e9fBEEx`2KDj%8z9I;hM_!EyMJkgUE-{2QE7Y z+h@I&x;HEZuXFyn+`Ol)l{Y`biYs3QpRR7^m&+U94#Ul_P;hAGbVMJ|S?=e3rNvpz z@XG^J507U}a>e*hk3HMZi%)F>w>S3BkI%D@yr=DhuUGBc#|-cD$D7leGwO`UlE(dg z3U<6zicQS*`-xsAgG0!%-tJ!4z-)+c2t%gPF9NoQ9DmL4**{qIxh`@pv%0fJe|fgy z?V~1sahPP(2Ni!)NeIF$CV_tW((>cJ8<=7w(X{=fHrU!Tl?@oZ&}x=xuA!F_{&(#E za?$=DpvP*@!;Ni}?OQW{<7UIhT6EH{mb`A$`=k*!C0@644>Cmq%3GuVn{b=QDlOxv zzdPxSz~VwGT#qYc&$OYaHSTRG29~zTsO~3aQ2Gm7@J0~qO9L1l^snaz)N#S12{M{5 z0z>Q~ei1Cgw0xaiTOaKxts5dAZ3%zIU$SwW(ZmN62x|1o*JdR$6jlclbeIdZ12f6H zD3o*l$;_%!Addv*1t}oi;RGUE2C5-8NvQO6dZ-fTwHaDU<#PkBYbO44161m9&p>*K zlu7$f=83YgpG-Uz?D|9LSY?CvNZnPK?4>3?+MznD)V=5kJyz*U2!d1TJc7<<(=&RR zckG&n?~|$j-_uk&@;C49$(I-12yyw*V0>lXlwl>zP$dLPC49dlC74qmC7A*WZI}Wo zgc5G2fiwe5NF!yi)5AFkkZf`joR4Jw!*{K)f)aEjQ7dd~GE3&)839{lvm<~tNg0M) z(V4gWZOTGcm=aH8_-{S%mW?QnQ>Q>@PVWSq9&gH)r7%4)e^f6i5nb$i7-5u4@({N> zTS+5ZaO;~T$~xwp0d}MZ0XN`5x%P^5R8YcU%($`Yjg=X;0VQ^bj z?oa*Qv?`5I)%}Au41bst+F1b*oJLn-V}6c*mzf&;Lw-l(i_b=O5mL#fwa~1mQ9f9q zFVL(c#cm-Wck)AOh#AcQJo+SO#o&`HktI?6aEwrlMh`7R2JtQI*uuja9dqrI z!=xLg^>?Nb4x1?!!GkE}dD_j^WvnZ&UtaVPv5oWPBsm%PMQf5u1QJ>d>lE{RrU6N znP{z`q=h6T$8_TR@kWP9X;4I%;U!S)`$3KxklFQjR$%WKntMQmpVWn?4OFZ%XjZ)Xxa~wVGzn)cf67-KdB5 z_k}Rt2j>RdE`7g|EUzPZu+}k`z14v1-7Def1kNavMtD@4OZI$J!qaw;?ftvnXYq7J z=7f=hJ|>0(yLiSkU|>dS<9YwS-N|c-Y$wB&`9?J&=9lveh&di0BcT%$LuFH(6p-2|s$KHlW!dT;CT+7`I_+w_ki0r`+n{tc|+s>R3f|w0B9C zq56KF%wMw;mwNcZZE=?|QAy!XIA|r6U~)s!mpPR}qLX>Be7ou|#NhND0sVZ%UOD${ z;9U#pW@OvZ*yi&m9;M{5RZ@0m>`^>p$}f$XJJgFTKH|{3Y5d!f0r97BjcJ#L>X|9K z8jka{hmW-`lYKeTb{O}inpBgze<`NfFw9JjMON84eazGJ2hd10SA{b_JBXz+JrND+7B z98@PZ&CN3-cFO>lOu5wdH+`Z&oW}lgR4*W&=MV)0Y89{687msLUJbcf={AL zJxfw$8@S3QWG#^&2aS!?n>JOqgwph(v=@M_`tAlB`3IW~1xd66k8Q-!7YfLOe6|iZ zf<%^9wbv9o>qq$7|Aw4jEj9vn&nd10BeiX!bQXRE-c7VM0L#H%7dIgq0?p&QSBK+{ z%-TN_`Lkp}Y32~MrrA2ga#DvA#s>V@KVy6Cn{Rx=XWfU^7YS|r(K+Eh;{~NaKmVS9 zFEBB$YIhCqIXA>jRm`8cZ&I6Afd#SO4S52r9?Zt=POHsrMKJq?ky~O#KyVbH!r*VP zk?~a2m(TUTFo(U*aNrprlavZL;}_%-_-#dccnD# z4&Ja2g5Q5=UUSzSeN5FL>^AT_AO(`ghh~-lL6d+vp(QVM4G62RnbeXoyTqg>wGq0R=4N|Yvl>a=udx#l1 zG(2T+Ie2dfyhiDc8rA>jXzvA6wBPE2l7H3b5JiWnM7kI=4ZNb4o04HoieWf%trJAo z2OhtRP))&*ok&?LQk-ibOPZ@DcAbl{q33O-$JBl9bPuY8#Zn#?k#eR;UCQqAYi%@+ zOsw5#W=A7InT$cZapR&;igXmX0qRjL!qfY$sw})nv&>CiJ|-zuK!z@y*htVO47F%$ z6hgGw3JfJ8XxP~uTp3YyvNsMCL+03I=PRRtv-mKw8<*l}c}X&msUs&kvSdFfrqXO6 z(S-&}-q=G-k~;}r!o;eD88>>mv`|YjL0?WNJf9j@QIxs-n2;AoFJ}0$-n%FhnzIX# z9Vxz|25~R3cL&4-Oo?F|&3NDvCPYc9SaIl0wiaCC8f=&XO-hM@0fL-hYp#d~Eo(qsQ5vff&XH0!*9N z)%LNiK(h=BYZ}Mp#7-y2@rY-RrsA#ewDbNo_soa`bl}EZnTX1ws!ZFRcXM;|U_mjI zTjF~I(Dh8yleCcTxluSyj@4)RlEH+$S&B)%fotu%?C!%eLa73^C=RA6)hslq*V7|H zxq@x#&U82B<$ZklYYY!Q<>+wZ7+_R8Sh3NU^xUR{my=t6q=4ZJ7A5{(@4<9}S>QmG zcB4s^GR0=gG_?>N*y{4$j9&fNnC&EOWX{Y`giikUhA)!YCdQY1m_3{((g!H-z0gQ0 zNlzNn!c2m-cWzuqm)&XdJx4EAhM{Jt8J>m{_FzZDA&4tYP8ifvN-n1XAqgkL`M{E< zB>pi5BnMuaKcT6ura-w1Us9;7_7g7c{2<`n7xAD?aokPWfP8De7SM)9E$aFuQ#e=MxP{-TaviHzN)d{Hy!y7)@-#Wta;lx5B}aYb<0pxLH|_-r|!(FwL22 zjFt>ULMUB`R02fYk^h7Pw;f^^j#DjSy^g_nYDHk=9cp}tw}}up>W|PPoL-G{V62&z z<-*CcTX{V{)WW9{OoeX2(@tJaq#NQ5NOknz{di}e_Z%kAt=gNQugf9MK zPmoiFQ?`3-OMtxgAovdaMFsP#O zXMr4J4>!!-*yjgWC6f?d#`HzInW=T}&?AgQX`LtxB*rYi8}&J>@Q=WcVc1rKy2@2` zv_L8kUvq2VP}*mpf#5wysQa}2xrV_crp)0)n1d-3oFwxl@Q0__?xFbZ;n2vn?Z44~ zW9l2;3*$!bbDk$;aJ0cLmBjz*!#bSI8>3pjfC6I(i>I4>d1aI(YZ#;cXd!!@Zr_=mV}j#pfJJYLCn3-dD7NsUwSLxoeb zL)+7%N!~y98SdpM|3Ya*4*7K^Iu&&@x96A+A=`sr5*}HJ=S)!387u4O(%+%$KFEP@ zv_Nl+x~^|4pNK2P0aIWr72w%8bq^5DV8C_w6>P9|bRaL>iX8;V9lY5aY#lP-!m-y4 zq3#2!t_x2)RSI{67@MesF3+Ud*+JFnqfD2#q6p2a1YV+oKi9>~mnf2ev zp5b=TppO7XuoWgq(7(-c06Wm?h#)|Q;Gk{2SozL`@F}R3p8?fKbx07+cuvF(#0elV zF34tku;%cBL%gyVG~gQ&@GW2-jEWuDprjs94PNI8+3fglD|L(z%^v|5*u9S&G@Gz1 zaS+W%VC(VV>t_KMM7@t_u2I-3GjrkrvCyFJy-VOLUSR8Rz;%R`L-6(Qy^nakZg6#* zkSlRu&D7xQf)LH=nkLD%qXQZUE2m((IKXwpl|!(9jBfnEw;w=W&<;fp5qg`6>wK|isL^lmB3CT+ zEV4Vy?G(s@9#Hc9zx(BWDUpexE8o6R@7{eBi^WhRq2vid6Z=hsQ!Dn*jH%O8Qv#A$ zs9)m6q9_`EA$P;y_Vwj`_qo_X5t5SB%p=RIbbd7e57qX)(zoiQk8FwfJl_@gYRRCF z4|jU|nqhwnivo-(C^uVF6)7c=MJ7DP@M|XnD28cDej9{x{w0<`@!dQMx#P*Z^O-*KnSQ%_`N=-RXS6AV!o`FmEF~5pc533J ztJAtd1R-qrt@Tw3DncwqbR>3QEz=Tb7XFNQ8RE~L3Y;+l`0l;q>^C^dL=_#Kzfc=# z0^-t)YJ_6Y$pOWU33a`20dJe{QkW59Z})Ir6f#EcvLlc<72&^|Q0|9CDMTvwB_b=T z9i`|qNvJR=@TJX{*vbH99wS52m5xFb;#*N*AC4@c0g;eV=-0-C-$zk*98i&IB1Q%< zjg5>721_$0u_NUZTUGuPi@;OIkBM>5b3lm^s+xOodS7nvktWmXZVFH()7GPF8kcgD zS(iu$NhedG-JqtD%;pT*q%OKZudp?)Dl01&uIV7aYXo4)I8-VRRkqOx3ujXX1Y;RN ze^FKe5k6+>f@uE;YxRA>X_Up~3o0c|{o_rAQXVTq&d@+;?Z-ugA%`|AP5=uS-H<2{ zN)VxpDu?1cvKW0;(As;NEkq}!3rNG%Rmnxv14M{@4clOjB5?i`i*hk_aHPFm0;jEc z^$Wob1yhb7#2cRdj79(W`fj2|D3=O6|3xCY2&>Qfv@e657>(wXVDu9N1DP+U;D8qc zlIG$WRf1S?1SSmhAr3$$d3J26mG#t8Yx~4p##$6RK zXw(qoN_axl3p6tZc6w>9%fv{K!D>0;kP^aog~Irt76=zPa2E&`iF05xp%RrbzynHV zrC4IgV5h+{|9Px)tpdmSc+u|BDsyEyfjs>DJ?_&5BLE}Er9@H zut{(^RZgmWhf3u@OEhf+?^-^;mNnOM51sp<=WuRcsDzD3e zuhBT#(~6)Kgir^T0TcR#qLk(EWGLw)3e<*^`!NS-b4dO@Gy}96qB>T92niFRwS28W z^if$z=tge5Qsqz*kwQT-QW+IOmAs;=qjF>bf?N^2xGPQTDHx7EA87>`O9d+V7#n)T zt6!5PVn*o({xWP$c!_0O-p!V0tbOhB2Yrhgw0qo#l9 zniCoK=V?%5$*|c=aAFbW{CaB<`;OtkMiaH-U{X#x}VS%4xD7 zhMAN|^3{{Y^?|9C1FCX^Xj4U!TcW=gxfe36u;mBr34p_%3^>RoSx=amK(HtSH83OO zz!OO)`vPBx;;`1hUGJ2S_bR*XLHq@`L#Ou<`SN{a+VyXph2Zn!jRNXx?EgP zdi}w`y$E@|lo&NQex*qd)b=VuNh+{ihQ1?pbL3)x(}(NUZhv#K(qxJC1duVE0atRf zhWXk8KktD-+7{F#Vq|Npj>U-(^{7!ph2Z`J+66C!7Zv(2YU}%`Xf)R0NSPoz3FzAZ zmU%FcA;vhtC=7yAJf5v=NMdoq61sGTFOB^rJn?1ovt?*Qck#_I0`>h zFOUU`Au8xP9T%c_HjUIUzzsJb-SnGXh@BXNCCYdLZw=Y4#UzO zqDp@U22x#Oo25$>7yHE-U{?k6I@?Kp2fhQ9fk`WeL5o>8BQh7)uitPY0?B<1*-i$_ z4FMT$lCVGic?>T$iGiCz4HOnSgfALz zbTMj(0)1E#4Q2y;ujscZf+T*2O0R%^B#Ase2{KJVhndTf9F>SnQjW6$VK6c)?sx(l z_kCgLkjc$FlodoA*!v!fB}*_<*q}-s{U4zm;ZQsPQGgmU%A}3~H;MeQ&~XkT+LECo z?HsQ-Y8d<MdYn`;WK9a4r_7Hj8Ag4%w4piZ>beup+SD*Ka!M%<+$F+KqST6mkS(GgiiZJW zKrIBfpHNxs#discp~5Cku(uSIjMyef=)__5F$^<4gUP3vVdvSBpQUu1VwInr);d{&wv_F@&Bha!0Lg zhpgZ(p^D+zQdB1Siij4Pn22btMNqAYs1kiHEK_QEMIeulRISeeiqkGaZz zJ-45>zfKd*G`KXeH;RC&r$E{avP+hOLTsc{c?zSNxBM<4C};HexKtt@0#y)!ZuoI1 z14{ML)9D-aw98a^Kmzq^_JvJxga%GCC5&Ur6bbR3BtU$6c-^_m3wiK8v$MRO0hXrzj>H zl=B(?3MVz+ln)`Z+mb2CBkN@wNu_1^IwNXdzTGoWquU{*!upHiB>D~4UQF@!MG{h0 z+@I~v*^be#u92aWrW_2SZ}5AWUbYup$cGC{ey`TeGsXlTW9*9s^z9?7J-RIx;|(1j z#c|ip^c!>)D3jhkI)4t<%RD_7l;X{hp~=fF1jQKy@Zzcr)Eos}p4M)DS_gTC4JB!Q zfGBgU+S$7e@TaQ`pLQ-U%*4ylL@yUPIc87M1mIzmt7J)|)ZNXHD1LdnN7mD5R9kX5 zq=>0}rD_?)#3XWe#gPe8s4a7m5qjH$F)+N&<9_>Bg%6HE3;_z$Mw*3yA~D2YT#%Od z3+KHjR^p87Cs!4j{pye`J`>>p+Hft`$Lp@poyOQ+jiywbVRk zM9d$h&U7?SGE-R%)xWZ2+cv#n7dxi7g_=(? ze%(us=f0-j8CHF)bjpfb-0ePckke(?;#l^%`nO_L+O>=?IyVxwTDKDa@LhfKl9*h9 zKCxeA?fi`TuKsGH4fqQlT`biKY z*jB2#&BBrR9{JsIZ{D}BgSqJ4+xLvT6zxir>z)ti zka-1-CB>G3q`ji~Qbxz0_58UgYPoe4=7%$D$-^DUPpr;7W=S_uy{kC#-} zW&dwzV)-gAY*40+CWmUH*wjMmDOV z+1rOqr*HOO;>8WSs}DMTM``Q^0P1*Uyq1Ng6}ADZUkij!sW94w4WzCFKWGLl7BeO- z80!q%??(F`5_w}yw$<}ayZ3(-vRazIY753%W#1u-e>0A;hK+GK^>&S)pV;D$v!$r&}?qT+OC?~c5TW2Jjr!={ci~KpBzX$Q@_m8ug8!wg*u1E9wm*j?kV5Y?7R;~#;vKCXZ z>S)0w-(%fAj97DTqtPZyY8goxiPf=aSf;A>wuLX??M9f_L5GDO1EO=St zJ#zG<*`2r*(xnKjiTPoKdf2|rq|ihSIGIm(-Q%9y6=A%ZM^ ze2XoBJB{!gHRmFXOoK*W+zXEdd)XE{apR?j8PP{SdE045|C03V9}bdDc}~+@Yez9> zOAuU^ufOXGBuob4_M5jUOBA=i%;axot*q7j`m(lG_0T$HC$bx`@q^?p_@Dj&t;L%% z4TU2)mou9h9G@ED@p>?!|4v)erosze2_SKuct1z>pjOtL&YRtQaMww(7Lvtti$S4$ z(hT0^T{6vGSC@#8fW4cMiAt$iDc~X(F`_2rQb$gm=qBFF^Kl$t_)Jsy7j4ANRrEXB z0=9|n)=;pai4otIcgKj6TvWO&y><(d+0$k|gfuu%#5*aa`-s3j%VtYvd7S?WZsSa> z9)BCOq!~dE$`cWB5G^HB#YBgA`)Z_?INBvkd_{R0=v@+Z;!b1``+!7&QvUl>{I^ungT)w%u$jMIII#TbR^i*unioROooK_ONT&FhT<=WOe zVSn-55I>yk$|kqE;hn}=y@Kbe%q-a;`t4BYwI#6`IWvZzW{9u7fT0~nb#woE$t`)K zlXcoy`MY<@7iBu$gWuUiCpLEMFQle{p`LtR=V`8e=N7@f7c`g4E`$e^y!^}bm9-}^ zk>9s$T|4u+7c*P)J%%q$?>(nNg_W7sC)$&7R&%G>m6kX6_$I3AKXC1bWkl5jS4GR2 z8XGROSI_f}ujkRhlIWo6nJR5_7LXj-W*@cp>U%kpHO|C@EdRjSH>zk)X|GP-fy6q^ zw#g%`9b&F2Auw}PmSoby%ArIZ(didV~{#Oq-_387m=u)EF6sP*D zQ?-EGw9Y%Ofw?kn0APqug7C@udWzkxxkbLjBE#hIGsv98wlfOfS-B@LB7bF8f@W97%(ag5E-Z z(}g`^bd0VUG2RP2F8Zigb$$41#d5sZrKzZlw*MiFGg2E9c;eTW#oqR8UVj2i{jS*G zRZdnN`;!FAd!&D4iQ3VRZm9hlgJ(YH`SY)DqtAGoIOF2sGuBA@J(t*1yrEX{r_pJs zhTCXl1}eejZa)yKu_M_J&*LVg%EjMkp7g0cM<)H7x~9RjqtDw#=-4~ykKE7Ux8yzD z@L0j4?$(l)Wi#F30rg*+W^rD}YH3}^>S@dPu}|XIcWW&QEWBnMEr&moM{n(Tw(8Ga z#@yUabGrBz;@Ll1PF7=T8sg!l@4D(F5B8;kIgp5%cG$Umk&inLoGE!NHpK%C`j5d% zZ)#&DhR^3b9~W%xOH*tGORSW909DjV7FOByZ(9KmGm^~hl}Ee#s=jX1Vxm6V7yHoI zPe=xXj4GKNu4XS_f81`M;)t)MSUTV5%e));e_TYXwIgmYv&|?}0-cl)6DK%$z-%axTFw^tfK!(9W6 z;&?;$Lpyy6)PB;^(&u{oof_WL($)7yH6rSA{ii?W1|t_=3x@HZ1_lv0NA9Nz{0g`bWg2?+4GfX z2)$P+z`R$*Zk<%n^V4Jvvk_8z_{?i69~y(Tp5G=#J*)ks@ekc~(fc3V7u=C;zis6T zdLEtfO2<^E7Jwg?DnP2=v=p(6rBino>gPF_t<6Dxpv4E(9tnW?pPk04c3HHr zH2>O|yPiFF&*+>x(l{YbWd1pNXyV@ELg;$DrCpuM^ElHXQX}uUPepKFStHQNL29xP z9>&^QzE@+1tKxV~lUU#3KDJDG$cr!{Pl&^_%&!%WkH#)&Z{a-*+n4rPPNf)%VW;2V zNx=T9CK;)GRZaadPWdw2=9xPlcmI@9Wu8MPdwAE4-&hL$Hr=|uU~Q#oqnLZj{c$~a z{m`g))WDdIXH}f)%YyG={lkEZ?CQR=ijuW{=m@=n3QanE*Kt_kJ+dO#$VIsAXr!6Z zDyx1#vjdyjO%5N&E8jX%QOP`2qt4duuyOkhcB>NSg3Y?ak>+VBTfA?Y89U*r%9*U1 zVv{PhdRDoE5Z9ym%JG7x|G;9}b$r-9H%#Y#-;YkGwGrByDa*^s!2go8B78l;CwH3B z5+uKRDT<-5X}$huYqh6`gh%_UaveEmZ@U!lTHunP72R{1{ORQkOD{IpuH&7eG`zKK z12`6yPH7lQV7TD9iH0E)BE@Vpd}uMFA@(n@qqA$-zjPUEi|~W&Qc1RJzh(M&L*#ZG z;Jcoh_HVzZpJt!zn|jd6wHFF{LVIoEpNVQpp0q!_PB`)oDrCmCxU_skX#1&u_V%$P zb?@~k=m~ytJ6x|y8F_Kw`xKLu{?$etf@Kzp7LJ-$k-%&lKnw08fM-BmYse)Wr?s_~ za+6+pDc{NF-m$%t!lDq{#fF(6zM&@^VgEegz3}t@tSyTgzDE3-Z~WN*`W0}A(w5m9 zPD<27NPIQ~e;=(2f%52b_3Z^$=+F0_@Yaffr!d#kkQFX{cttOH&ExyHtE#+RgCko< zrR~N@J}c=_6Vf8dO@YcqWg`DzcM5Q6Ez(if@BXekQcqc*Q8EuX>pM59myBy$*ED-$ zi|&ch$v^GAQXSK=_Xxk;#}hrr-mjLOOGQ&smRwJ@oP-s;O*2H*8UCwzUSRQFQ51gd zn7#CSjcZM?toxyWPyJ;F;xd?BwA6=S)7~h55-@UNl(gIun*OvwCO`f2oYVST-NI9JJ>kgzSE+W$r zsy5vU?1)B0PDyG>b<^UzAZd~*$IGI|2y!3fSF{GtZq1KhWO1O6-O&(ZGp`s`)8io4 zFz6$j&Y6L3O(OF&16CiV4YbYQg^TQb(^EEfGaT`CX5L;npy#qZ-AYsOJzMxQ!%mRP zY|6_*OXzES_x-f=T{q8-T2k;BQF6=M#2%S`(zB9TMP}sqH9V0d8l^M+x7xe$O2xdT zAdc!Fh9J$ulBqtTXrAp(N77Hf9OWrcKaR<5W+ybc)ne^MQ#tvBd?P>kZ5lRVy$y?W zn|49bRIy$5^n6v@+gWQzmwbB%ucGx8%L0y{-%7SMD!(F!^~ufa+)LKLhaG4I&ADin zL*S@BSW@RLKB+o>VX{(wNo4j5 zoJp~K0|~**&eYk($;`<1zo5ObH4*|l8z%`1$$vpz5;iVweUks3#`V9^{>#Yn5AlC% zY#jgYoBn@p03PmtD{!y^{*3@u&i_IHuK$Jm51x(vKYIXhaQqkI;$i(S4+ksz|CC|} zu#>QJ^N_H!bNml!04E6-E60Ci09^m)$^WDFzgFSnW0tT2xtKXIOMr}A%*4!0>`l#> z<;?6XTr5f0Sy^~k{^x|1gqwqfgj3n%}bgIW}XUW^7lG(2>!xQfwiLAFAc8lqsJkCotykLZ2xHqK1mZG*Fg*_S{ z`_4N)f-p+*c4ax5IJRCVExn#FN`0+BBgd0R*=>E4-itwz%(`;HN#%`7`>9jZHT5PyL=?n{)wj!ywMsR$U(Y zhrrh#3|A7qj`BytONQHAo>&f{)EWLb%{3={*RMzeV0lcC8ES2I7h$mj60P`ejnOBy zy4!7+HdiRd4KF-k3lzY5CAHstUM@CD! z!T6bQXS6`L*5EAu5o+RPV;%?he%yJ(NtgKp2Nc`_Sg0zi5aU)DA$FwogL<_D=+`lys`kVFpE#}f;AR`O0zYw@ z1Qi5ro@>VdUy~jkBG|d^79=l_dk60*JB179c0cspBy`Q^Ro`zXPE59!eew7u`Wfrw z1;Ds+>dy&)9}RA}H$4GYG9Ji$qx0|l*Eu2Yq@P49Q%!wcDxcYP;kw}7rguP;FZ%r! zr6=2!$?;Z2RznC)C*rwWEs zLWgDTiG7x%o{=K|m=KHs`p*;Fv;o7AIfPr0iWL#(l- zURA>;l>g9FQvR#ze}Ny0C4anK|KHeuYthQg^>8}6`z(Gh{vS&JBlsbkl&~ZB%5~>} z>zwgd5C*R^&{HrXLj@>6qPivC*{guralfvr)9+ym6PmBam+GlUv6xLwFtOpXf8} zpU$V?Ts+kX1$c+X{uEgBua9zoZx8fS$wMnKAdfrYIvjo^Y)${H?R>RJxZXBOIeRta zjwi)!d##8iSTg)=cM)pi#l-FJ`czRf-JD9F#;n^;fsV|mvogQ&8~E9FcQ~ENZ)0vE z>Z^aj)0c&}Q29$;T|+KM#XwI@E8*zrz{`09IeILkblLh3U5N-2h6geNerK#Q>tXz` zsozzVb|}M@t+?0v7Zmmp>SNX9DDaQv8c?*@oe-#4evJltBgf@-s|vAK*|E$RKCBcIb! zqpGR}_JPkx)szu+;JN(Z?8(ke+jqpF_HdU!-)L?UR9nzQzVwICuFTz&4^0}zHK{tI zkf}5U6j_-$Yf41c|!hl>@4OWRep}i1D9=JiVK0CNVXE%o)taM z8yWCvvm=4C&4_&945wul$)-o{`zu5-EU7)_Jce!)k$O)hD^VfY^_^1QQnxrKab zoeCQpcwbVB(xb&R4CVj3x+~kr#v-q!JNIuh4dJ&X6S9@8V;fO_Y1Y#giF%AmZQQJZ zdgH71j3HfF1RB&;+$sayvPy;wOVZ7v^l+IzTPuP{8lGe%< zp}xH0yycT#HTUI%ELZ4cpx;U)oPP&&bz`9=2$^UnBz`yRAUZQiRT$C3Bc*mE7cX%<{H) zN^9X?3^Hf~m?RIdQlbN4qm%Kvk&l2Ty{Uv6w1TSR@un6zDtx@!=VpEn53cvYJ0_~D zi!;*jo|~?TD?vho1UBD1_$O!jgZ!|L`JxM5TQvwAJMK7}y~K-FR+fLTY^*OW6C*xW z+eEl&?zSJ_Ok^w(g6OnRmZHfw-3`VUs2~Scm0KFs&$# z34R36HI=X)W#+&foKSiTh>;1Bw#6G)qd23y=nQE_kd3L@hu>MnO2R^afc)m5M2=Ds zbebQxe21$-6;-qk|3}@qPI2UfM^kVOlsE{fXW#SVc#T=xTH5llkSh5hZgkeUlyexh zS&|4P_L1Z_MW-UHrJ+}$1S9#+&^WuFq8_<`2qMs@ZM4giI63GEj9^;*-HCOY7t*-X z9mcC_b_lRFy_T`0JF(9pXCUeXolNg|=*)=>n{C_ftITXS*lOIr^VhN(ezKUGg|Cz5 zoM#_D#>0V;QPcoEt{l>%b!7!{$hU1t0I5w2#USXeESNVN#s zwI9M7Amh5?H6U}ry{yxvf5Xqkfaix+u~hc#!oj-s2yRGiTo`#nj)w5XyQEw-9|4` z1h|RrqtiuI$|Mr}Y-VMPw(h(yU`8P_E!$>;jm`mk*lIsJhFvMTYHF8*tUOIIEhYs#ue9n105!e z_}17o4IqDJUOZhNdpOA<`e>aZ-AFl_oN#|dw|G+mygiOtO|cf(bEtJQ$F!eUQ4c#m{587@};&Ax0)!wn9g?4Ok;m7cOBz}W_VMT4d(7b*F#!ql(jU<=8Z3w})B z!y<-yVDIAc(M7a0eKT6>TqiNk1_q%3+RYwgFwe4o zSJ^ip-!+1w_f~a67@@NFR@LFM;W(4V!#o}VArCj_)*;bwOK4TG7K)Os2|y(EW71ZV zTvz1&7pTfT?IyU*o2nln>QMSnIZ#AU7itBubidKX%0ZNUQ6A=y{Z2tn1A;06ayK^RbCg9F9rhcHJUAc!s~6e`uUF$hS9mo1{Cz>*0{LrYQVl7^y$8iEps z3N@_?sDLfo5~G`-9wpBZ%JPFCRv)FjR_P*~zekOLvI_zQRe22igvdc?@|l2(zyv1u z3Y)n>5WrVMVMDN|mSAK^Sr+Tz2L^_CK@bI|35n*%@n)l{Ia;s>B?$?WP$wit3Gw6x zkb}Xu8U>LCC96PRLLGccIQ-lZg#VPe#tE9)iwlLzLwo1B)C#$#4l;p~gcqPpC5H-^ z=9apa3{r&q6r%eQzV;5=n9=r?wY9L302)AAp`|=L(ze_uM6r4^_+A?-r?Ub z+puffAp4=}3pn?oY9cuI;p!YX_rYp?xDL2(X$RguTc~Z4*3_LdM;rQnM$j>5oTu88npoicB>dN`l z-fDvGxOED`DuS-K~z630K4|I}nz~EmtBe zi(9TjSQ9w~6E}qs zf^ky>p(buxf-r+%dfdcjYc;_%f+~W_xG8{85jPbeOpTi=5vCB7$4#uE$<$C8L22B? zA~=blByM7XEG8%-UkV8d$fW?eG?5^mT*@PuKu-7xd<3}!UaF8onjUgVBq!X|UN%7% zX=W0*sCov0lfXfmb^;qYXeF?apJr+(oxnu(j09-}1_C{)=qRU+8HyS>bP+w zf{H*%pdgTwri?TN67mEb0R)E;hf!|`@g(vI5c68RlO{d=2?kAis?K zQ{I>X2pzHvqpVzN(2Zx{2pYMKFzuNtbzT5pYmOQ1O zMSfVj z!~GrYCGLl`Tip*LKA_#^zF)iDeILs2MZO1l5Ats0yOF<*{4M0WknhwMy6-^VrFqEx zP0a)D+YxU={s!``$Y0lVyKm84;l5dOm-{Box7{~tcDrvt`Sr+G2|oANgbMeST!s6J zP;cn+y}hB!Lfb<-_HGYpw{zO}57r!%D9ooEiQ%JVSvT5Tc;m@16y_>lDOAtmiZX!_Vzo@5*jO3~pPmH#S}rS{quocWvmxt~H_a(ZSUft3us- zSB1JNIzpX$J3{RhZK2kRXlP}{^3aOC%R|d5mV}n>T@s2^ghPu_|GbJtq0rt%p@kLA zp_aYPp#>H5L-SF7ZpGZtyuEWnb1G(qX78O9npx2pYQWAzrZH2@6pYM)`I+bmxVYL9 zSJ3r=>r~ z%t3p8Q6t!lHqjJ5uE^3sprk-$8xzty;&FgPWvvO%xx0P==V&$#|ffG57{gzYY z1QqH$!dcyo!c!dkjhY-d?&khQ3j=|<1Ipo+xiMAK(ipch=3B^~!R93~#m*RnmMjhT zbKH#)>8Fh`3;S`gl)vhR8~SZrEo9Zsjb$wi$Avw6vT7r9W4$aL3`*%?mIhRbfRyRC zL2V?kV#B5lfpBn!3QQlEJ~au}XN|8J`Lr}HEp0fB52j&v(hP0`&mO}DA!wL1wJ}Za z*7NK!tQTxSJxW-QC+M0MHKu9ZT0T^xU7+QI+M2q?pti82aeU9E76Ths;A6#xjREP4 zxfKy^6Uzsfn0+^F#60_KlJXGvyF_XTD>oo*ObR#t{aXKHiTkP@_!lR~O8SpuD(?mu zx^>*|rJLY<*Z{rwxf*VOTj5#w6|}*Xn7RY@z=QBG#Nc`O3B3Ie|8oBC(9l--8qf)k zg96L|!^ejQhaN;8kQ>HGZpEBgCXPymjl+jeksThob=WvGphyReR9DZxfzm&5Cx?&o zH7q|oh2{BcFr6mVII6sR=!ZiOjdN!X%!5S`g7aW8L|_5TM{a^D{yv}sI-v_z zK{u?%cwGQJum&zf?t-RUD z$5HVJrA9t%QSbx zQ}8s-sTbiHoNdoy>HzG=^Z|GuK7fzmckp}o4=%t>;by`y_%pnQ(eJ{jvzV`wo~!Y> zY9!)YFt*9a?!btRkHh9f8O8GoDNf0Z*Z>hwwDl(faPleWgji}i{1XjDc$ zymdq}+VAnTNN;S+#z*i@Nix3l)X0ua-*eWI```iO`|-)f;nZ9*^&MQ{jK2$e;d_{( z=V(5e`ab*seu#TPKkS1?;W2m|21fFaU~aTLE=iI)XO=$!PfD}kS$Iww{}zcXddL_RIYTkYC-R1ASdkFCmSN!ha zTZ6`vZw;nbRu&ge!Yh^`Spl_!sP3rAzzPZdl1UNH&#QdBI}0QlsGIDupV)sy?TFMODVoqk>Ya)QC1)hCwb<>QrjcX?7Z9 zLydC7@ndqs-|A#NfBS|oY4WO;De_$!6)#gLo^siJ(;7X_fM`xL8+8V`*_N(Qn$xxZ z>2pqAr?O|*l^TswXVj=24x37?QRs{(EAWojGJITd5TjlNgDl!l@Z0$v5Du`bTqqo@ zE$~?MMMdU9&{!>Ep+;jAZz|+U3c0jGPAe1^Ru${;(mA=gs8DYPjZG}nSuF*{o+^XO z-|Pw*L-J5wz)^#gZm%?z)o{gSfrDIWX{EDx<%;FYmzx5Wj$#vzjEO5VmEjj3Y>2YH zw8cp!kuOqDb}2Ag3rE>!5Tt=MdpS06{t1FtNQ!V!+4$MbWn3bul>eO9SUgULm@el( zGUdh6p?$`N__IyF@zyTID8=Lw?{DcV}C5x8dKV>RMYrwAbavtGYK}h#| z+&M-$H*qM~E7v=Gnb}^QQpe{h(lYYg-U6qFyNMtAgzK)x*)5YPwW`5S)EEW1A=4`S zNNZ3Eg36%l9n!GB0$n})sql=f1owkGSpWBlBA5sG`k=bVoL8Pd?TFGhz|}pLrNoaz z$A11$-sNCF*2!NzrU!#HgC@54!HAtVr3Wgx;=zNJ(q5opW|Y&8^kgwZkM~H1%9*7{ zddj=1{sS9ZVNK2C7Wm4L|LiLYB3}?1R2IhCOjj^6dJu! zCzdr$uU&IqZNMs4pEqTCq-J88RwdWy&E@l>lf&1wm5agX<@dGu>St8s7=!_ZCBtPk zWO_5p7OvfT$&{MtIXNydQ?J)}eI9dWM*5`ITUO4$|J!}5tJRpbu)nRH2OzWH?aT%~ zSjpnHAEh`+>{;0cz1^T!WgRnhWFJ$l8XqK_5g3|7Wu=NeJbL8=7gof?#-8Z) zcVFLid3!^lg}-;sw{E|>bDF~7Gzs^6vdY?SJioHF(SPD_(Sp?**`MLE|A&vT342rk z+og3Nsx4NP)vEIQbPk;ZeCkjA`96z9R2|LlupSjp>sT?)^g*upAR9U3q0%zr_G=Cv zWSz8I)SvcH-F(&2p8O8cdbCG8t*fklV5GN#r_?$=k?g;x)Fy1=;Hvg1 zm262U9 zx38z^=)Ye>w!;`My?0DN?JF${`ai}Vp7XGB5lwzojyE~btm~qcw z%&ah5idh<1wHmEe12Va>bG-lPIamB*sdT1m&#HnQn|exjj`12>j>E~0)iF-nPxozj z7)G3%6OxE$3cRrP)PihR3XwspR@JqjqTZ zklAQes`M&$X;kv2lSfn(CY5k(WH8IQpQ2Pi4cb@v8!<|mu$b-_4yOV14uf7$nLC|q z_c-N{kVf>-i)E!O2I_>OifQgU^@O02^^NY2BU821#^1=vR62Cot7V(v^PJWu;uxD1 zT%230Q?HSkof%exv;)49^!&u-CiJ**__+KnJPE4cF3IC^&{S!4lk_E%N{SrCcBd~R z*O%+CYc*3k?D~vc4HTC+9Xf5%Bwv-$o!8;+K5dO9hFPNI2#=*zmbYy9n!Qe&@| ziF0z~dTCS2b)4FY0dV6O_wy%zEod#-HmfUL#XZ9J^JB`%mIp|Y%Y%d zbb8MUdSQB5p~2!VQ2O=R%8JfxixLV8^lpFIbgeU|!`Urcb%xbZe6ZA1hV$WIG0h3v zm#fHPgxkM#@h%c3cnyMbe0*$nbGBeFn<0$Oo1Nunun z8C96t*nWF^=_46cOV4S!bm{b5qpNCJ?SidKr~6F&({;Od-?pK#c=@$UX5D}9tryjm zM*F&_E;}c;I(q5$ErE)q=j2qaym-eJ);qRS?#316hC>Y-2Q(n4U(e3KR#3_dd9^D`Am;VIgl+V zC;KP({dAw?h255dnO)Z|zI`^YwRxO&(JbemS4 zm*6RgE^C>dJ9G;hX90IaHqHvACT~V_u%uommk+I(G;c*B0=qB*lVAosB&~(?%B<`P z{N&qJHl0omd8*O@jENiMmG9)ejstF2+p_a?N^gEaR+hKoNI{3U+cbVF7?kcpIM-o$ zV356X6c;CskQYa91Ho*0R^>ZA%X_yNCZYMp!5FY|)RCMB=b9joig#RKKhyplq$ zu$2AE*gbZ&oP3i-Gy&{bPTuSB?M`}cVb+whe%Yg}(;e%n>nhBZPNzaQGqta0oUOn? ziJ6u0msTEEogxufS#m`tegGsZr>mAsF!Bn8TC33JPMKL!IA?N}cgoB;jZ<@KF1llB z`SRJNW+lD~;Jd9Zzh=qwDd$adSA{yxtDM?((_-(enn`Av@QTXju$i0!IbCK`n!@UESag}5O!wq^Ut!JU()#5Mbz8!dbrz>34P)DjGj}h} z+#Gt(3u-~7vZ&1ti&R#lRc@vnRQH@&J#cXJ z&1d8SDqZDe(hJXCL7~JKo1qW)2^zX;D)@avAL-PBQmxe~_}}4M4$e1+)2usj#mJt! z!(=eH99Dyhz29ud9X5<-Q9i7Z`eDxpH=cl6O>Sqt8zI{UD!e*6*&Zujed>(_k0E@g zWA|+~{>Jfj8Co& zSYIF4*lb|8YaLJWDwJ7yMNp&7>a?AHQ)d0d<0QS(SzMO5nW)dAIC=${Ao%IMz-p$S z)YxnaC7-THbLP2o@@;DFPWBTU(UE0RT)}e(V(&};McbEv$8ptp)_wO;eRuVJ-)i-tZne(RX{jYy zc6?iQEFXyzyKGB|6UX}noFNGbamEQr*g!}ii6H@YfPn;JFt7^Q;Bl?ZgH)%4fB!-+NW{d%yqvukzU+sy?^si78&#wJlT+LCp(W z0Y)P%*a2K8#68}aoq>zU(sMZPiUDF{0zeh6dD z0jJx?;f#tHsb!J>xTxW@6r!N_BeR{uP)fu6@$(3}k=9VM>rMahc?8|SfWIhE0xUla zB>A5KmO*Hzf~8=CAP#0Z)^h_3bC69FvWVX}vV$5!WI?ve#$fz45;nyA!2cwXPr>j6uCauizNnVg!yj8(mS*^a$fTUk12%wK z%D}HEafi-sk^PIcmln{Uqd$hiP$%>~HOG7mxobJc`~vNw+^66#zX29)dGB8vMbW4wH1{@j(NN+@c1hqlm zXo9oT3Gp(du4w++J}G+D#Y4(1eVSFac~Uz;oHi*7Bv!Yn`ef zY{m2MN_d)iM@pCN-ghK>$aFyh6KeQY>~O`esU?mq4awB-axQfvsWoz1cV?_Z+&$Xr z)@Su}_^A8%_Mpq$8X6{*a(c22PzIN)ufr-pGo?vX_ zYtJ1y5u!D_mtK(VY_FP>)2sdsVB11gW_I>WR{!b`bFaUC7MN_{IBMtA{}gdA z-qSHJ)t!7=IeSo=o*M7JAc0dKn7SY>pZv($bJCF`O!&OiZ~=*2I-y>GlEu@{DO^uv zRRc*@6s3u%57DZHu-Y+&_+XetbxEoIe zfuv@DBJ$d8ZV(qA!YR&~@U$JA9^==@RTrDx1H!s@I4`sA08p1eaiIjoYH5wTWmS8P z7GeU>0;e>zzH7C@i_Ez6&{liOz%qPnaPNcHM@EVv3_}p~n?j+j)eso#jfeWS=7WQQ zi!TGC2V57HLXtwC&D9z(^&EI?!_sW^F!oafX&u=dO$}N|JqKJItC4jDT$izo;#HbG z{K)+`_mZSB<@B#vQ!WK?iotP)ta9$30OyWD|DwiVGw>^-C)<8tWBbPT-Eo~;@6th9 z7;;1IW1eH4cno&M#$@`1cgIunp4c%ocw|-Yy54nzt1nDX1joThy$dI7nsTp16NBLW+63`{$M^f`r{mG_RUyvG3w{P&AwBm$wS=HaF zR8DH#f@{pWLWb-wz^Nnf)09aF$kvSF?Mp{t4MS1pfZ*_%7;NdEcLOTuj*hygfaiF?s_}`W^3WI>L{0lRP#1BCypx>wr8U_sVviymA z?uPDOKfQC^&UMhvy9ZMp_w%U~e?NM6$Du=;{W66@9nkbW^Cv8EOFZN_r|nyRVniN_ zP3&DfIzh}&42Lch>$UZQQd9vuItRFnzpmYZU^sf?5stw*qvj5bvBvqb*gCR4oEk8b zI*t!}%~wH{U@o|Ja-`_H>rQLlwceto%@zyKEHUOhpG(sW&FVBBw~YjDD`Cq`6gZdH ztA#IUjM|XbqIz#w2|oZOq26ZRo5=W5y?*c|?Jvqy63qT28W{!$X$m5=t>>NPj+LI5 zyp2lOF7rjMk!V$8X20sGidW%m818I6FFDKFj;5|#W!h!l+j3-Ytp)qPXrKs1F0 z<7PpRBVNUO>)g~CGLx3pv3y3HxL!)I+$HN~zzQ5n-Yq7&iq(-j)YsibchDI{i?VCN=vU6|OzDG96KJx_dS1Uyo;t1P0Nk5UofDc+QQQOo8+%L?fD^0P&q-G4AGhF8f-%%)KePE1sEJ z^OH+-3vwTTQd$DuvQ_bxjaM;CLETm)z9UtJ#-*whzect5Kj-gdAwc2loY6`#w(pN#`qk51=n3oEkIvgVG-sL#q6 zb%e!YGqPsEVo46Br|$5D#(E>!O-F`0KKkhK1O4>@QFfg)dnlC{$+^3wM}Zunm%gp+ z@PCJfp{>w<=qK_X_py)(eih1qJ^v+Cf~F8HXs>usSWC;U` z%<4wX%Y}qOF|4+!g_kX#FKfZ`%PCG}Df|p8Y10^ z(w0uQI5PQGtl-n`y=~*+5jXmA&hN7tdc3{&&5U}??k=;|YT#fJ4V21Z|LWDN+I*hk zM9a|qqNzJ%%N0Ak)`3uD^QOt}AWdoCwq>LC%-H6LD;KfEhqql^6)mBZGnYwOvYnyM zA>ae`Ub=w(Ej|nNL0@ko&w&b02#Zoz7XP{sU;f@Wv$8puvDBda% zH$`NX0#_xqC|vbCMKB%e@RISoblLbi1Eow$RI&^25n;jAq-0}EmQiCQ5DbABiR2t0 zMmn^kAx453gqBOl9v*|&$RQS?AFPB}6ls5-7zb~sIQbJtE#15_Kms}xAP)Z)PeVp1 zrdDJdF@G`UF}a~r$S#p(JZ`ti6T^ab-6?q0*Ksj8YOk2~a}x`^0`}`?7b@w#m)>Wr z0x(?}gv+B|k}AXMpal}ctH4$>y_JT|6?tFyH#qN%yIo-ef)fS@_!KfCOYhbod;wPa z{A7@^pE$!-hOvg7&XAp^?V&$ps#u}-kSbQB%0>7I^joz)2{R=3Nk9yS>qi?Ip!P|q z9AmFIq)DH|uN$sV?vs$O&|bS9iltGMW+`wzJwP^I0J4#9mK_q~m=QNXD268DK&HWu zM>HhdaigYn)Z{kc2~Ui)2Z!zBnmVehwU;?TZEw*kCM{blo15Qvwz7%Mhpm*4YK7)X zp(4Dpnc{`|V9)8T274+-1Ol@)nK%hQqlAbypOHeJe(!*-CJul6>2i=)+3nu}bj{Gd zCg|$H-ir*xm|3v1!xeR*?7C1*Kg;Q)WRJ2B_|mag7~g=Ed>!jm^B(bFTKaKdh)2+wXuC_IcjXoXstL@ z0kxuQtu>X4?}e9n1XOOOJG+0nEGt~)pq_vak$AQ%w@*D--I1@sw9#cUJ9HTA*9~nu zQ0m%P6j0OfHmQAJYrCyM6T9+)INrVg(Tz(7YX{vO_U_TfgXq10lBn$d{EdHHjQdKH z>A-kzJlwxI9~cZmRf`CAxdZxQlU)vH1i=x;v?!#5O{h*AGM^U<<&Z;*3A#*}@+L;T z<8-5OlO-N(r`q+Q?xW@XXQ_GMg897EWZ-4Cup;SKzd7jNQsgWkeANz;c)ok36>PwN z@cP+q8Fl1!fKz>*&(mS)9(zxaV*{Ik-CGSJwATQxa!<&emm@3pPnbqyxJLONvt>q^k`r!4&md$sqEkAMM*!9Kq=DW6L z*A(4}(OrjbYtOD}cPGlbW)4HhrNyPk&{x6z$Dv;6wT~)qLKPmiaN59RmY69SQLa`RU?{IxhHSgAh&DTtsVmoUqqDL0ic_9VEZkd z<9kKt7eRazDa=fd@xHV)*tTgP}O)*B|lEm1R-lf`qBdO zuK=;(W;X9zKnY%iI-xwG6%&?D@B;;OdC@WSO4N(D;v$aX%qwEqdp-)q^>Ktljqji6p0YZvqb*lb=}3uygfg;ZL%%D zw1TeZpvsa4vykEx#h*cIy??Xs>>H|OT0%w!}|vB>KQsVvUzde#E0j5hEII| z@h86vg}7XqKkx9Kr61Q^ql%5+k=UuskN(;{W zZC|baf&8h-?P6m_y{_njz&%$(1R>cwzA%N0!an7i{Lr0+HzOD^LyIxPCKzLa~=HU?4{o#Kft~S4ME>;qJ3k9 zWTKepr|3SquSh2ntwn3m3bpo+6#KfU;FCVs7B&_}OjM_wm68pCLgd|l}*0Xu*_h^L`4 zbUpN+)SA~;c$H{c)4{dQYto_NXkW*OaWOQ}7!oY>LT3_lieT&iN$JjAv-K31CrDso zN9(+#P8B;wLdHdD3hVT=ul3G^Pt=*ivw$fuUl*MzD3 zv_t|KaP!1^oOj0D?hp@#@vbQNWI$?30rRzj?GWJdikyeae>{f$BXk6MNbMirxijiL z*m@8-IF(9LYvOUAs`g|23y1^b{8|_iG(}wIXt@y9&dU`UEPqbjhMh6Y)DBO?N^Mt52DI z{f-f7WdF#6vTV3Mv?J5Xu^Z;o>or-de9H|xM%ow46U~Hcq4!L6TV?qIF`b;wQ`h>C zvRFt`SKF~+UaGDq?ieYzFG}T!<}#P)70y(5Sr)tA-rj4Fygy^JFBeh#Hz=(H`UV_` zXv_a^1|S129o#_USRhr23qint$a; zC0Y1+|CksJ^=)bM4F!;VH6*$CQ=#4E&IC=}(#JN#C#r{KRPVfW0X+#&%|J(*y%tZ{OvCpA(il8~AU~%j;hnqIk3~?{91v`7 zoXv>Bb3#r=Ic?#zlWpYsRJJzAlNjz>ebe#jrHh0?2-zJ01H%5t#}I@B`qts$N%%ITXV3ao z9)vXq9Vs{Z8P>{7{orSB|JBl`DWDH=&ZLD)=poKTvI=He=AwVoi{JS6PFeGEz;1p4 z`2ot~4#*F+sn43e*F6Z2^bVPotih@JZWj>vP;;^j2_Be}#Og zW;E44=5%hkx8Koa zMq-gHtI@Deg_4~ccSejsmmw%_X_KE0Kz@ikgWI8k`b>w~e+)k@8e)8F*pAzA6LYe4 z*7RKXaNXTh-_-yD>{{2cxjLbhIVrWyhE2~&4U?+xWB`-itAn_q2TVzGJcBV>nlZUk z{%}X!$y3F)Xd!B6NgO3;k_l%zJqHeGy!rB;K1U|uWohg+&f_rhX5Q7()zxk;6pU7b zmZ9tp3(1&u%niFkn>Jt98>X~InyD~jkl>*(RD>Q;d}NMHLykz%35A`-v`h~NpocSz zp}qs)aGJ!qI3P&289|nNNEYU*O;fx9R;0+iVhvkd;YzkCS8DAZ&FQji{+4?$D|A8J zen1KXo#+~gv=2wMI!|V3YpJlt-U(B@!)Ow;IQ+i^F_!F4m?LrTKxc|Z=4EQ^FeXFx zNY^S~aI=g~#0^I<3J3ay!j^W2k{ug%#Ka^gi88$S)IHj&C1;k?x_`K-N!k z2+7cNti9jgHPz$g{l&?>{T=JtZ1=Y&LtP0E-PLtn#*Ez;Ta|ayg0_%nwXBvf+pH8L zyKLFX(QpAG$-s^yHql()Yl$spg) zPP92lPD^4M(&;d9I!@z^xgwoLOWbGj6h;#&i)FRPam=Rxe>YA?S__drnZGdfY2@#b z-w{T@-Urn84#eVSi#2MEdaV%S>13nc00Vg}Y-bCJ^UvpI0|%_at$2fwez#WvT*)Bk z(sS9|53|*_f29agzeJ9IUb@mE33ZYB$J}a#wCankmTMagO(n>4z?pNHjIvDkA-Fr} z6gyj(B)h7mLluhNDzotT(tfW;aqdd+G1T}RNf$lt?f@IOFCC<5KA=6y}>um@n~mVc|A zAl%pR;EcWDKF?J;N784{RQnF-$^^M9gj2dgR?N9lS4cx`!a~A7#x?Tm7Th`n!?b3v z)#lNmCxNmPOeQ%G&u~E0+@rRfHJ)3tfGL}35q}%`CSW717`dZFe6)e zms3>kxWLdv)M$>F%@L0~VQ?Fx3AAO#>^9&L525iNu-~d_xN^nGRH|chmDkwRbzLZ? z@+w!TI8daqu9pHuE1#B0QFTm_U+N66Jx1ZA!D%r&^d$O;Zg7_-lc2%jr>k7p^(Lt? zJLMt`fy0cMe`)D=T0KrNawtTTaLdvwRZyx#SPK7)pb20Il-LL01OFJ{V}vFYe0U=Z zF)RZyMi#@h2O8=fnYp0mz~R|D>vW=D-A`Tm#$?kwWpyPUet?r6KQY2z|y3r0kf#Y2IAe1VjiE+ z1023&#j=BK?#B>Uz~0l*$|S2>k4Ug9;4{NUHrY8Gj1+@LRGaJ=3MRY5Jcie60?w!P zhx|QT+kaL&#(Q)=f5S0E02-B@wj_f#qrb&rNd>L8Xq(5JuvDby-@#tASKe0POMo4K z7@M!1<)3ezwLy%}!nP;;amE>$xePF+Dy$%1!`$8qbmvvgOk6>QE`zG-ixv7)MHA>x z9QFELeX{8u77yRKE?RCk0Y@EQl<5#G!AL!rLS`G2e)Lmcv_3O=@I(QQte zD?TO$aN!{zG^IXY55dns21tOP6*Y`OAkEL{W?j#chgVwmQuXB&q8^OWnV*q#v!v@; zi9Ed0OxKFy)zT7~uQ$CYrVo`?-zXkC8rgW?jt?IF>q1{)ywy?=3*#9JR!&ZBnrQbQ zyrJ(Svm*!h7drE6cczM+ZEJSQdjEEK5yipv$DwZM_ss zOF%w?Yt&wI9ekC2y#AWp;i^l(9Ihh1X>;;^Ve7X=4H|NA)OlT?f_Eh9!zv4G5{b!;lsM9%k zNMNE?VdPB)W=_Xuc|jL+;AZ!Xd8L}{U4XVHfOnUx3Wp)aoR;2mMy;~nOvO~Ov4ALR zKY|g!3@~o1wU~?1^-|ypsCejN>8#xnrZDUhX0Qq-Ef*EnCmS?_eEU=Ol-Ed67`WfN zL7Z?CxZhq?H-8J#z_&tqC;5_ft~H9{;4&u*#Kc??hwiz2@E)RutZE zLMfJ{ZQg`4+wL!PwfTdCyL){dEgq7>-|0E_i6Io}{#-AQ<%qT}#;N2H#{O(c!#{U^JBcCW6xd!%6%Zs0(^n^;Hdq z2vkaeYxI{0vK{=i_#>r5?Jc4{E4hrO)-C7K*@h>+&hTpdZd2C~ ziBtfn7kL>$^BGB48Do_abM@s&q*lTyRKl$43*!ox=j_c&Epig4b<6{8C~o(7e5?j= z2G?}^L!DtWj<=6dl>Bws4pVxE*<{mU_6LA>@-FQZj7$HnwbD+vj;E{^Bd*ozd>NlE zWQ47(j&j(I9{>&khJimmAbWD(Mg9&o;U-{NHTo(6DgQQ&-V{6y%l~$_8^rF6DK_I_ z?K5nnQmMS(LjT5sS_Po5FskCa5=bpeov&s7mb0nI+Zd95U>Bh?yNnK>k$~4Dn9gCf z$lgp}pfi)SzzpxS$UMLioTu+u`om$8Arbja7x4e3bcFmq8=!oNrSA_IwyFIB;12wTBpq-07acZ{|*C0lH(s7Zo!0nHf4ZmgTrhF_6&DNxbhbn&+7>SezwY)r5zL%*(2Rjtl|3*{4Vlag+sS0 z9HJol6#Ro1d7ps~pN3B=wU47BZ?Ql;#U*BZvI)P1yS)(*xn*3|;gxK&zCtR^d(WsP zmK6-;#B#AAv0Tk7BfrIPbGC0o=@~i^v$}zD`uL3qLht|zS$4{Sj@Bp-OuyR_bmB0< z)5Y75Juvnfh=eIEeF|7d9Z3OxAtXyK?Q7k$_vV6Z>sjCtL6{dlkKYU8AQLp8+BOEc z3EVUePrjft?WudA$2qxwRBm9<;iurquSq(w;cF1*%J);z0V)-6IE5RWF{dMFL~z{T zh&i1>1G4lpJSc>03}XukLdeRp*3jFscXs;HJII~*^^h4#SNv|1nY9F1N5B%r5^m*D z1wEcP1z-1~dqO{4pQpe0GH)$aV)Keq!8cA5-SWh*Nh@b2gzD60Z|G_Ms_oCq4T5G1 z2<4E!K{;DcaQKZF`X<5ZSZy*O1dJrk=ox+7=L!Nw-&XCiM8ByqusF^cxIY}wMj`=5 zrv>!ZX~NMEt7mDw4PfxeOACk}+o52vz4CrE_}ecqOu&2^>4sPccsO4T$RJF;=)PHh zWBm(PF1}oOWsl-SyrACl6u9LTLK&2!10Dzl5_IS{wJ+ zy#|t?v=sPg@tPR8D8K$u_9_6SIU2_qj{0LS`~TSc61b+W?Em+&Cxk_UEDHEo1XKu* z0D=q3lCW4dS=>hnSs)UUn1sz*8vKq=byDd`0N_w96THLfLk*a*MH7-w5Ylef0Q=C^?)j@ePiT z42=#D@x6S5hQ)+M1qfIB#Kc7gOGUE51N>rRB7(dnvO&OY&&=*exph6kz<4tLJp{tb z|Fo#2H$3{oRj-NsPaAu6xc^44$KR)_JspO9I)zK$(}! z2i}7MykxM_m$`aw8NUJl3~IXTvx4&>cMswCLK^{P2_fV7W{SOH`61DHetDj8dkXzo ztqZ3v_+7_O6Swh0GW!l0bZTGUbq*Bvsd7Gnv=Qv@9|U&{`J`7+WDp(2>y9JEeuJP< z>e0wurU$1LJ)q0o|wj)&MPK_gfFb@5bz|CNP{cqJfeh{Ow1x`2s6<{ z+)EbX9d0VEHC7nYo9B(47iY1@+o>vTv{sZ~C@my1l{}>%4OiF3d3J4~G9^V>sI|{C z3PY#N2o9ZKZ7gogo;yExzGAj%q-oH!nc*}2%O(X*;*1_A7$+Gn_mMZwH_e&&)u{C;eZuFEfS+P8{^lnuxlI_TAYp>{IXi-nU;E*t-kVxLDMN5iXGG~gu*vy+9xS=iW~~C<3{yd;M%x{iBuw! zXvY8BLrjeSNXcOIADt4(qtWNv2l`9A)7}gU%8*Azg`bg6$k^>RN7GqGgmgX#EL z;c>+Ug@V1|7$oryN_*4DOp=G6G0G=+XY4lOiNW|O7&CK(zw2)TK)M*2n&wWn=r>{6 zAM`l?uLmam4h#?q@eLiiFG=J4%!`VN8bbQ#KRI!nIw!jD{+)B?`G_m0W}r`|OQphq zpY;1@V_JEwhXgwU5O8w91-WL7UL*LvfR70JY8^e2ZD==V>V zc*dUz7f+~}k*>S7c&psvbFXiw-x0qf0~RsjKkAPc*>I->M7rc8 zl7Y21$jfdCoP}k(TY_E;p4>}5?VWd2lgs+=Dbkw=BGSQzAdtLCAXKGGRip|??^QzY z2vP*3Nbg;mbfie{(gmc7(gmbT5v1L?_c`b8ZQfhXZ>{^g|C}t=B6;%6yw7)L-uX;P zGVf}izmWp&x4hR&)e_5vT%wtO6>b~7UA$e)%KVvKWv&0Z7_D79S0v1abw_g&%uPOzB$&5|DX&N-PEOEO1gCvRI!}@=x=een02_ z-l|jHrF`k=9KZW#oUvikUhlbehPRw%fbmk3zYL{%Hd44WSqsOO`;j2-bV&C>^@xX$Al6K6Xg{8q$ zjeW5)VziYhT=s;b@AazsZitCVSS3gwK7T&}q(uZs{L1@QsWB_`rV*(Y4J9sab(t}A z?#l4{*c(RqB)uWDl;uHOaxb2-CQX)CN6@2uxQ;Jg%dc*^^y(J=!pV``B+v#^HgPfO zAsv)Ym`k_~6M`8Bn7;1Y?u)*fn(*73?#CCDg{>0ij$D1&s4pm7r(Au=!AAN#p!AYS zEB=gIE4elQ!}3csCj|jCxY6>@8QjVVuMtW{i)xW6k$CcIkF?a0OYyZ9(nz^c9X&)l zF%Dh0CVMZ5+(G3cSB(Uve|jz69J!o-}bKi?62!0>nhS*D2LzrY# zhleu3)^7VN(WR^VojR6(x?o>alY=c~4z;AN9G|aZ%fzx0Tc_O?qWbDcnp)C!%|Sv~ zk1h7?VT=J6DlF$|9a%{}wv}CR>L-eiwgjA{kP-Yli+Z-C6I6b^6bO&;HquV9PG&@B z`ovpaAE|6rvW19ZnmmMPci4Cf{+X)yWRP{a0e3_bzDtpQfr`$2WYYd*l?9V7lAI>`pHkTO)4PI>%1YG|({q@z z00Hax+tql4L%yE+2LVx9ole)n=%|U_S}n2_e$#(Lx4ltg(rUR8Y8e2-_kS!+wH9~P zUhAdwJFbI0!m_c@WvI@$=##J?#mg3*2G;u;;v`=)o_)?q^$^S&Y?lJQr#-&H8HR5f z`fXb?>;2oBdVQ-m`dt(0ym6y81U&JVEgXto(RC3{VedDbpiG#^G%`C6>1cGlqDT=x z@$V+=+ZCT*=S3w)-n~@Ge$Q=CW(Bc4R@WT1F*MIESv6Wa*41EX+n0f`>eJHBQc{5p z>G|#mFsPqB;hOY7 zrxshZ*3*-ZvxH)6!#G7|-m7I?>^5$e2m|^EyiH0)PreW(`Y?NvgB1N1eu|=RDt$sx z{+f^xQkc`Yg`l*ceLz6}8ar;gA^8U+3H{|%{%K!VL|LuhP^RIU1+VVf(<-PQ#nrWf zGR6Vb%{l`oCw!{AWAvJP+|2V^>{O6j0W|g&rVnnKcmp*%+{ukhkgHWhyV)(rt0u{a zvQ)ZlMcBM>$NC9lX$FHff;#*PC9uj8f=#N5 zk|%~j23W4GhppN&Nc)^oN7c-Z<#M8B%6%?jV}l2uISb-F^h|WGmc*lQzwpR=4bQ^{ zn!nOWQP7#UPo9rKdyMR;>HwRK0Y-!En)$qrqk-n{q2=%R2I2(92$n|!qn5rXF@~#4 zz3kO&b=?@{8{Gd)Was(amwb8krpH_T=E86_RWj?K47%j-_(ln}HZU0!WnP*n$9UD#jdYC#=n8a;9}peFNd8vNChW8 zP5bV-JIP#1!yWK(!nr-^S^vJKQ;EgI+Ec2k(cM1yETHudxTu@T>`AD*W4JB)rA;WLVL)8l%ZPZmU8BwNxxKyFQc zU`(ti-VM4)(#Qv!cPZRQ>R&A^EaMV5$hLS|lw-=RKL&|>Vn_ewhEyEcfahny*v(|s zL8{c9;oa<2#u1yFiIDL9^LYV*2Y&b-%iWNy-O_s@x|FYz;wB+t3wBNuwo%~;eI*@C z$OrX94dpd-@I<@L+9TC!qBP0@<<8wN{jQ4BcXIbqjoWH{9~WATZ6&4Ee$#rBH@eh7 zCY?`YY3ele(z)Z@;sSE8+C$9WT`ovFPa$BWoV1$y9zEXUN>aC*q6$PsvSu&*DVMCg z@95-rA2Rd=+Ql4(8ahO`SVBMM&NIZxJ*)|{aBev?_~8GwAm}!&INnsx&U@fZ9ib-4 z+>?$laTqE+=hC;lei?cf%)e=Ju4k-iTbPQazPJWpp)^!&#oTJ^A&7+#11a|)-?3AGAtTePM<6_yWiFb+gld3#S>wb)q8!(T{CP_xh$F0 zmc*`q<8s9#{t5baj`@2;OKgV&_IBz4x>vP&gev#H+5nr*;RYwY2DDLfjj!^mZQlQ5IU)wJqKh!tF>4|V3-253h~{1_qdDwiI$5_}zm1xfT!^iTY(&wAJ~uLImtE=x^0IK63>di=&j zgUpD_jE}BgL4_+q?&>!#ifnc z2pf|cEmYu&evKU)T}D4-iu0<-V!OkllvT>{n_EGPuiiaFvdRfkd;OZvq~r*;xR2C# z?g{((`%0rHzrOkch0~WGW~Ic>QhfKm6yf)t`L;UyMCygtx#O26iY$tXb*ziT&t`KR zCC$hnwxa!Xun&5`iq-d4e1+sGUQ)HFo{Gf&1I@b6fB>{CKVL>?EBRL7+=~O6klN0I zs*hFIE!N#Cx@`;t>FD7W^fvbvruC}uLpscSu*5u376rA~@s=5MEYa)iW=b$N30yg= z@eXB8zkZx&eRtk;Sor9Wkq))g(Zwp87V%ANq!+)#b6+BrODCQ0vT~%^BV;|3nqg(C zB%^Z|BJP!nrw{*%#MVnmv>;2=r07k=`lvTdORq;!Q^c3VVlYqI7QZnEWq?l)Xqxbe z_O<=|w65kCKqP+)D@;1K7#jZ!iJRX1<=*X%V5f+&X(J$Ubn44`{?!7O)@DWx5f!si zEf#t+$M*{G*J`GfdnVN1soEhh2Cg9NtvF5bw=H4cqn+{M-|%HU@sl^n56dkWsK`B!teBVvNMo-A;(Z~x-`^iK*Z*qbcs)oA zK94K0YXv)ep7%`H`1ysv)y))c%9w^rudAJJYckM(k)7pxnC|!Z;#6}eZ|blX>rn<5 z4t+VkhZF;@dTAyk1yC0shOs{Sh}0KcSRZJ(ho5iFThW;=wUdFcWN}Pbx42nC7uqb( zFg($#Rgm02!A#mlV{WHrG&c8o;c25}Khqq|U;usjmq}~*y<}kGeq0QH85XuJ+oHZu z&nmvK+qk~i9kSVoA{twbhfhBH@RpDv%9U`KZu&0pGRlscggonhQw@)q+{Ws*qKh@R zl29(HJ>wP0wEm!ncm@@CbI&qBJJ>p*Xk;P<`)imXp;r;MZT*mZP+?*JOM!5|aigj% zuD0urxOFcR?(5fCy(O{FMxzY|N|RevUvlDpvr&A`Z4E=8VDXa8=>$)c1_U zm?sZ49zqeRJzRP0QUdm(<}|8_s%lCR%8%n!rDD`#V`8HVv2=(mLP&z`d$A-{vpI@= zvZ`sP*hjDDJzP3^?C(#@QF!SMPusy#bhIKD=lkB0^zU-SF&t)nYR`-xPx^D<6DRlF z?&Dw&&W(O7`Ph|1sPIB%^ql@1$EaP^8lvs;SzSd*Q5h)utJ&E#nWP0fv&N78Ex#@L zqEv-qRMj4a5q5KNV($kj#w+>8G}jwk&caht*w>___5BvJ#8J&9tE$Gj!XX_cOwik~ zwMf{pY@Dfc-ab1Io_;#VS_pUdVQrZ?rGTC}i?r*hm7I%8o%@BJ z5nMf`0DhY6o&{cQU^YQcu6m~ro!`qkf7aN=)Zktj54x7zEhyLBi_af}J zMJT+*=A3k8H)ZpqpFl(4vN zJ)wH4l_(k^p;Uqy)>8Hh-K_Ypye>$Rvq?qFNeDcaU5pqBdi4E4d)obL(4^;v0ah$i z@1+dzTq%ZRxNquQkGu4#o7{k>HUKGQb3^1tU6B2v%{-fH#PwRL`^=lvD2Oxn)s`nR znN6yx6ZA>)jd%y_&1yIY63wZ26H?8oBoiAx4Robx`0H_4?zi-qFRcH-K8EXg6HLTm zX<dIBep1YCwSPM6Gx0)yjE0`;D7e2P)0QcUI@g|xgo?I8*yqV)8e4%v7Ck1=L=RP{8?_VaS8JQ+neT1n?qp$=? zN<*;R@%8Ajk8PTDa3;cW4{kPl;g(Wh9R&KE^6Tkht_uCuj(wnc&xL6TH!_}D<|Fyr zEK(!9GG7f+w%I5gQ8zDl=|H^8M-Gi`LrOR1qu8F^U$nXM;phq@dB}U=sV!2b=mhib z!L5~*i+1-Z`J&$U^*JCJ@&eNm5_C03C%X@f0AU>H?Fji>mE<{wW%OxEE%TMth91*X zU+nO|Zr{fqY?WVbd%h>%Gq@ERAx-R>a7D@fa%w_&G(^$IGvx`b-1Me~g3yEddki9Ab&eQCzh?)-1@f^KPC?3$PLP%A$) zt3`wWpx)DyBMS5rf5nj6CK~Ma&RvT|~Q-vxutR}tbj*0nvtSH!Km-S@BE{aGDKSlr`+>D- zR2i1iOGhH2$fs7kPx~z`W4C2q_+%DCkTh>@(0lTyi2Y>IQe!2_4!W!-RDq*NL8jf~ z{(>-)os&}#5a1@iL2x_n+U1({gIVoRr1SP6L;l4avwWW0`*IWyD3}F@kz+xPVRYeR zJfEAs>20^@l?74Dby~vRe{2dreWP^edPnAmZw1_kQ{(GgHydtb;}XTuQdF1F8Sup7 zwnJ+?rTscG+)kfanw3_@v9%1F*i!brHh@28# zHw+64@2qAF=k%Km5}Ey^3o&gefQRbDM&c5LF$u#v4D!XQ4jBkVE_#HDNTt0=)G=O5 z9LaII-|<`{l-x~1iS)e&8{_kv1wq`cNe|peeEs~)J2^88L)uvRPl~x84S(j^T%9N3 z|H9UAwld@tZfWK~(K1A*fUx5K*cly@muy_b*P+bMrDiA;V>&w8v9LU~qmnUY^X>`r z*aHL7Lvr!7_vCuBtxQ>3ZA_Fwfjm9B4wFgLC;_cD8nKavi;rY<-gvWl!ZDq`u6@GQ;B#H`l_W0&cnNP^;4$lJtoqIvvQr|ll zAHS2?a?0NK*lwo}mo9S6uRzrJ+AM8kXw~vKpq_Drkv_@aaw)p)HgJL1X6VB>`P3(4 zu5N<5#L|Rm+0=WT`F9??8p3@jc|A&A?UM!BYr4A0=tb${bg2w^jn^Y%NeWZhPX(yo z-Z#Rv{mE%0L%DbH<6sP4-7zQW{=4U>x_4j1V!j#;&53@Ixwfk0p!rDC!cBGxp7+{a zWfiaFgf&*ioaoz+S9TS$s86_QZ4Ma ziJb3P48|R&o$Afjr*SJ-9p&s7y;TpZe>?l3Zv>^)I+uejJy?9wUp@PIi9%97=o~e2 zLT1Q2&?vyE$V^qw?%CY^_8QIRl9bJnn!7_Q-we0MR`k-_y5}ReNE8)c-O+Y5+1b&( zV%}}aRwAeKiFdgo!GtyWfQnhuiJ zxQy6Jx79^%_rAT)ZFKhK@Hm!|XG`JpyqtPEwz!Mr-V+B=Q=ME3CGz7#O+&}Bg$lcIK&$M(`3KIR-5zN!w_qTKrgG#KocQ^Zl{7LOYX zovwxA26{jK-uCuMS;;uVw^!C4r~9TNj?=s5R+`D`*6#~VXU;^v2XB2CONq+~my)#o zTvljvIeN}_MAw16?a(q~uaYc5Or1dn)j{Q?i=bw1i)T{2s)>)rMJ`SOh zzSY~tY;$J)WmjCYyU0GAbgEl8`S|o~G|qe3|I{Nb`_^#f=5k`_X<5tie1P^m*WhsS z`S+L4GMB6J~$Uxjx1?) z9~jIRM3v+Xd3D+vob99qi68l|`R6accGFG!u`I5uaQwYd?$+2Lx$8 zDW>|=^Ec~}i!qc(!JO`yX>2;K6(`$bBc-b(Uh;hWXN?Q>eQWNfyeO<|yYUV%>Kyv< z7HxL6CxS6+k;P%jc{c9379X935$-1S-ez4PpALG|hK%#vu_#bOBd(Pk-AM-qVKh2Q zGUksT5f|N4ZM1sMmhd`?`Wk%ILDsQAF(m>h5V*lA8JV0Kkt*~kGF{<;!f@f`;E&V| zuhohB_{;}mzTY+TWM${#LRp^L2ht-sZBlS-6Epf~=m&f+a$oGa*m1F$-ODs1?t%c< zGsUjk4>uxlIL&J`cJ4nb@Ftw?^R0eXI`YVfxI$octQAFO8N zy~@4G>+LYtv){D&vve)D(C^k0_Pa*!7rbk>-XHN47o|2DjQQ-Ca{s( zbz-Z8x%#JYnwy>SVutb1;2jN=0Po%#5vv`f>!6X%kj+S|V#kjX8<{&Pd$(G?K9i&H zH?Nw^)=iD4Ul2Tjj#dQwFEG*b)u!LJu=`=sKPj2P)XPjl?KuZw4P4TDC_2=G2GLI^M z{^2=M;e6Z^Ilmd|^SKZwbxYG>uWRfxkDAo-1>63n64#+R^%-vikN3B*Lz=vvT3b7~ zZ^SQC2m~88(nwNU6rUdrJ(KL#x}_T90iWC73v^q|dd>9r&aaArD@-P zi}$4Q;A1*fR>Xaj{-+yk64#Vxf|L zxKA}_q58IHP34!INdYT7nv{76xJbqVX>lIH^>Ct%H>d)N@lGNjavQF_j ziQ{)&+EYeyRQ14WO2mR7H`iSc@0G!@NuzE{zbg|}9uQ&F$;$1P+)v(llj_@6^QPi) zMtvSXJc7T^m8MY0(Q9>`)@&_2cN7{BKT`J=>TnG_re?qqLtgMQBFBCqP|Az9eD#-;uPegwQm_&Bdfi6Yt)~(x*qE?k6rZ3CXB+6%f^WMDllNtRhn`@y-57PR)jSlMt zT;DI(H6EhQzr9e(p$|_X<_(6yDrUJlqlNeA^XwO z{zvg{h<{_8r%NF>w}`;vebnCRgOd|E1+$a4bxk%D$D3>O`)f|pG0a}ue4~Q%&Zdof zo4u3uxy2%e9+h9SY6elgx;lHCwKdwV>$)^CDzP$ys0Ht|&qJa~o9D+WKVQszP1C4d zN(zeEEve@@t~1ke^_(m$2zz_f{#@wPXF~tyvRdlty;8kaW%W;~j1gB@Y@U2_$|$c* z(xy`5co)8%WzS=EtfjIU=1FwfQkU3vK-NOw=iw@pg!xJCS1YpJFCH7;7fK?!*tQB* zYI|nt0>7ia{o6v+hzCtGGD_xiB-YAxGuj#Es0~I_Volvgap@x2EEHs zNmm>`kT5x1I6TRD%VGa$y~keMcs#(H`?fB0e|=;P{-E%Dd)sQ?a+0>jMr=9YrGM4! zCPHHr zeEPFxl3BpX`|XLT=)C8&Ei)4nqxsS4xTR^5dT#>{NmJ=MDYw^rhQJHQjswT6GwrBS z@618xQCKHIv8LF|b1~$7yM43a=bhQ1lxij7Gminc&8YW^TakIp?+%9!(zin5rt9uH zw)gGZdN%Dcm8{o=$7x;jN~hQ|8|#l(#FxSG_;L={8_g*zSm94|{8b-~?Ua%l;eYT76^4{&Mea2N1b^44_?U7B-2u@s%({N(*LUHpNRRDII! zMv$%Z$t!R8*II>j~95@9S1<8_#@N4`qL>z6gw!YABl7mzX#`(^Qmdl~azhzDsXsv(_7k zDB)G#4ma(VJ1;+3BJ1a|S@n3M|KV0R`WU+)c@?2sfTNf~DaZ+#&RoBT$|y_nTHQ*|aey0L`{@1LRJA^0W7ht=)3x_UWr*S^FSHK7M8%fm${ z7RySrBRe7@#5JC_xHOgLtoa(EBYgo3PPgcXJ*6WqbVnU-84FV#}p(l8GG2C7YT3xbz>hiHj+Olio?A9cwB4Ks2EkneBYjB|>(Deq#^gJ7C`w1(ifS|G+mGXqfc~Sh zz|h%=7ZFO8MLi~q_jmAuBoZIrtu? zDrV7Fw4I6>e74Eyrm2=e3z+4@1W|L!gY#^(oU#veXzt_x+R9=%woma(tG-LY^JS< zxZ3U4>+KJ5xxSw)hRF0%t{02ZW~M_1lD)BA`RNxP0$ zgx^KNoSE9T0QKo*eySCmt~p}o&`Z01etB>1h-=W&b>JPF>@>E5Gu-W}eb<=Y08J_O z8}z?L@3v`g+Pj27eNQy&Gw)p|3zElXD=DeJPUgh|5JOIu9rPNx63-P(T=6aq?45zOqgvPNXFe&&}d?-DZ-)2L$8 zS=Q-iU!@-KTD%r{VcA&ct*?8GTa=HrH0&%t+I_$`{j!hr0vBVo67x@U@e>j}UQIW% zcdmoV<4G|ZPaIC9Sj>FOKK|8svv+W zLE7TT)ZKZa&bDH)$uj(ihwtqPIW5gVS}WNtB7FF zSO2UzL9X{oRb|BcboNR=Cqza0cd~x5rMH>_HlKTLL^=08&gP&VWPYwJGLu}iTUeD% z=1E8%l|VZ_z#^k{c9w~=Np+ISU;T6mHyYTi3$MkJCuUGweCm5jG`^p2qknHIIg0r(+rpZ*l7m?Pf z>3KNDSgNz!@!=Ff@~3qzZ@rLD5qx6dR+>{DXK(|3ujrMjb`smmh3XGKO6ge_Qe)|E zu=~tgTPNdOyU|2vj_RfTvG-uHYnIYb?b__y*CFgZ*rmCJN*C8scgoJsTtvkE%Xeqo zs!n^Za&|P8KKAJ$m@1}oCqU(@Ma-1`a8Pt^JE;s2nsVK)zzfVCb~227dlw?JKq+*S}btVPOHPdElABagPLN^W-XiLRv{9l7Z_1`{o7g=4a?-1$|hx9`&rJXv1HyRc-Z5}V5oH4%4_wBga)j!O4UpJD?LNK zoRz4GsF>UeLebsr?%D!OMM~zrs5;%~HI9sr%dCqz|yL3x5i!@kI0{VdVcuxMHPbg1wrAzDx9%iG zbjcSPU~l?0a$aO*R3}{6E)3f}iIO>ps6$xG_T{!*6v<Sti5I|D$|gcAgfcP_cqAe9k3{HK!fa*^4o?Mmc$}S`xt(F$wkT5`C_g_x z4+P)=04}r#m%XcvgT4!wjs3NM<{)8gZ-_E~>R@hb!}2RfeFIxZ2VpigmVe~?^e_3^ z*mM687`LIVH4pj?9w;}A=T}BNzf%4sr+-BE7Yk_KMuz_i`Kcqy>W_ep40(*LjIE7r z9PH8AL;uL$$WXu#eTKP%ElT7M)yl?pe?GA?7g2C!QPj6K{xbyh>p!3T;lcCQbpOQ= z(KYk082={UMgJ)}KFA;Op`8T8{|r#Y*49cy!Q2pKYj11fz@l!8G7{qX{e7W-8H^>+ z2aJmV5CFyng>XS&DiEXq1TKI8I3W-L2;?tG|MdJLrGl-IxryulP0GJ`{#WY=9jb!D z|Go&Ut^ZjH3JL-ewuX+sYEMQ&#L>~*NC3ePAmK;^oD0Uw2j_w#km6io5)x8e2tIxZ z1ivH9vD|5hpgr?~!8 zT>n-H{9DfdXBctbk-0N^2o64n zfB}D*3rLvTKef_#MGtRO%pI(ZSsYM~#=nOC=sfusq_Cu`#h_f&H4Spr1=<2_fKcB!EQl^TA=fNO3sg z*I4PVLnV>_vj_SDQs!0;#wZ>sEA;46!r0K($oQW#7CtEKuM-xRWW=azvZ66H*6i_1 zbErymxe7Jw3sK1&$(NVfK4iYSb2T{cx}>@Iai)LlQ07Y-m1wn%x=J2u4i%L?$n~kt zA1TZ4yr-9)w>$@rzs$IA3g40`msVB1>0X?2o&PId!Z*<`dFh=&daqdJdi-(}N+BA& z%rPyAwJlTRD=!s9U31ejxnc>{XzAV4?Wo z9h`mrN~KIGU^b3qPo#7xCJa```<#10xRc-pLMb#sbntaN-Clv;i^-Ip;$e{rVW;M> zys!;l>uV$^yTXye>wZEi;v&PyitAtH??h{`PZA-NeCYCCYEE3O(^Fp$5SU%jhR;KIU0Ixp_n`0QjH1&C+%j${w!T;iQMMy? zTX0AYfPEnF`#@o8fc10X4rzNWt?wh!PJSeP8-#j!&O_TLvgTse(`%guq*4oP+P)!n zxW&!JHPms23^!*vv|sGh(2Xz9$+tV!(C{6(4bN(B527oDPtw!L43UnhvRh z;Qg4j5%S4rZ#%7_2-l-yYHxEP9D(A7FF5vf-Vu6n3qti^4$;>EbD^`}zN6E=>q5?> z$MkiSfAn7N|IzNeK=_gDJAX)V!sarqGMF3EkZLAsNG(L>xO zL*bq>nze_|6efIRPhPw{BuLu1a@I*x5`A;??nwy8iER)~LieEYJ8$@$sHgp6OzZ`5 z8Upboyta2sd1Ix7xV}=JzU5!H-}F_iwnZ6n?kMarg5JR{C}R^cVhH;7gQNfb;{oSm z;YA=|2$o-O{o?`UWBKD5i_O1mP$c>W{q^{Z4d6v!*mwcn-)#Ut0RPPfW9WdU>Jfa>wvPLNW8>=f%(gKmm-j033m#4GBfp*xzH}gCdZ> z$HxcdL;PO9d{BN&KL7^&9v>ecrd~ciI20p4K3-l-8xo@~`H&FISdcKj-*x=r!tZ*K zFepaMNH{<5?{$eppey9JazP?se3*U+=pw9q9Ilc?}R9 z=r)e&2ciSr#xeYmAUe=o!1M#rfxa&>{XldeL3AKNbRa==AVG8>L3Hqg=->y@f$rNe zV&(_Yfo2M(ABYZq5FO|~0y8a$4t`7>zxwvy(?TJbI-qE-V)|j~fI={JKp~hqpb$(Q zPza_DCq657ngpnV5CkWF9q60nl!Sn;sfgW*U`hn}lBg76%Q z9%o}{1K~Logy&E`koo}OITVEFP!OJ@2jrNs@PX6^2+yH>AUZ&J4h7-)uX!Fu86ZL0 z6$sCvNRV~~!gDAH&!HeZhl21N3c_^c#fXLV(I|l zIRL_Q0E$^300_?k^jgO6?HK^!IRM4v2LQrz0EFiN2+si!o&z8}2hj6)jQBu!4xra4 zF#Ryw6#&9>0EFiN2+z@zd(3Nq@Em|)-sb=a&jIwj79(a5o&z8}2S9iZfbblEWA;}7 z2+si!o&z8}M=zpa#tg!90EFiN2+si!o&y-{=7&Hr)`B1q0EFiN2+si!o&)IoFv=c; z=Ku)L0g(AQ0K#(sgy#SV&jApg10XyHKzROZjS)i!2+si!o&z8}2S9iZfbbju;W+@p za{z?r00_?k5S{}dJO@B{4uJ3+0O2_R!gBzG=Ku)L0T7;}KdFLQ_8>e5KzI&-@Eic) zIRL_Q0EFiN2+z?A%b4+j@Eic)IRL_Q0EFiN2+si!o&z8}hk@`M2Ey}S>)yY&aTo~C zVIVw*f$$s#!gCl1&tV`uhk@`M2Eua~2+v_4Jcohs90tO37zoc{AUubG@EpD9i&=gk zJV&pf{^rLI`8D?W`}#OP1ieE3cN-MJ3;%uJ0E*y)qWST+v}hY2nvK8NkdWW^M9>2> z*zf)QFWc{H*JvB>?|TVo&?0}2@0ShDx4&KYmkr&A{bob*V_X-;4?(xdfB89}^v$h| zQDnsE4}AV(vljmUe24bWJy?B|!=GDJX!!F(`N)WG+>m@AMMnJ3eJcnV@&A|TcpjpR goml=13jM>j#wN-R*1uk&%kB5T;plyUe+K?P0Az0UPXGV_ diff --git a/audits/2023-10-Spearbit-Cantina-Managed.pdf b/audits/2023-10-Spearbit-Cantina-Managed.pdf index 460ab4bced9b3cbdf426beb1faf9a437530e7f3c..44b7bc6e40f9cdb13dff35ab05f6d35fe0ea0667 100644 GIT binary patch delta 114522 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%0A(9+YmBSX6bJKgcZ)xxxiZIt9fVtU-xwLDTMwW; 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 z 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

tTTocI)QhEAYcdNpz7 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

#gxJ`?=%7a{?MXGQu2rCgPO2#+6pLE9 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 z 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 Z7=q7T`Yx0mrlbgiLD?lFbj|eG{{`i4y!8M8 diff --git a/deployments/mainnet/arbitrum-mainnet.json b/deployments/mainnet/arbitrum-mainnet.json index 34e8c05f..e9e2067a 100644 --- a/deployments/mainnet/arbitrum-mainnet.json +++ b/deployments/mainnet/arbitrum-mainnet.json @@ -2,47 +2,44 @@ "chainId": 42161, "rpcUrl": "https://arbitrum-mainnet.infura.io/v3/ed5e0e19bcbc427cbf8f661736d44516", "config": { - "commitHash": "333cc86042891d25c72e9a66dc9068652c0e02e0", + "commitHash": "27827821e933f574d9bd87581e9b3221c58a9b3d", "deployer": "0x7270b20603FbB3dF0921381670fbd62b9991aDa4", "admin": "0xa36caE0ACd40C6BbA61014282f6AE51c7807A433", "adminSigners": [ - "0x71d9f8CFdcCEF71B59DD81AB387e523E2834F2b8", - "0xEf270f8877Aa1875fc13e78dcA31f3235210368f", + "0xd55114BfE98a2ca16202Aa741BeE571765292616", + "0x6E72DD4D5CFCc274a8712A72C9dB9FE1d5A7eB6b", + "0x88b991A2A8d3C5Ac808D3471e1784C6165d29612", + "0xE9441B34f71659cCA2bfE90d98ee0e57D9CAD28F", "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x46a71eEf8DbcFcbAC7A0e8D5d6B634A649e61fb8", - "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", - "0x518B822e679Cc5162AD2C644760767D42d2fb80b", - "0xc4576CE4603552c5BeAa056c449b0795D48fcf92", - "0x790c2c860DDC993f3da92B19cB440cF8338C59a6" - ], - "pausers": [ "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", "0x790c2c860DDC993f3da92B19cB440cF8338C59a6", - "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x3cE760441A4E9BD2c40A69d39A472052Ac14e0D9" + "0xc4576CE4603552c5BeAa056c449b0795D48fcf92" ], "adapter": { "name": "Axelar", - "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31" + "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "axelarGasService": "0x2d5d7d31F671F86C782533cc367F14109a082712" }, - "deploymentSalt": "e416b338a274162320c79445ae6604141d1cb08275eb27011b69f002dc094d05", + "deploymentSalt": "0x7270b20603fbb3df0921381670fbd62b9991ada4b17953a73f70fdff36730018", "etherscanUrl": "https://api.arbiscan.io/api/" }, "contracts": { - "root": "0x498016d30Cd5f0db50d7ACE329C07313a0420502", - "investmentManager": "0xA85CB660D5dc25b6d9E5fd291ad5E5034B1AAeD7", - "poolManager": "0x8841717f4A0552505375A478e25b18EA35976067", - "gateway": "0xfD3791491999fb58F002eB2fA16e30290806D0Da", - "escrow": "0xd595E1483c507E74E2E6A3dE8e7D08d8f6F74936", - "userEscrow": "0x9fc3A3bcEdc1CaB14EfC1B7ef45dFBDd3d17c9d7", - "adapter": "0x2559998026796Ca6fd057f3aa66F2d6ecdEd9028", - "trancheFactory": "0x2d60cd1527073419423B14666E2D43C1Cf28B152", - "liquidityPoolFactory": "0x77F48b2c942E6f3ac2232568d560e423c441386a", - "restrictionManagerFactory": "0xf4D7F6919eF0B495a2551F7299324961F29aE7aC", - "pauseAdmin": "0x634F036fE66579E901c7bA34e33DF422E37A0037", - "delayedAdmin": "0xFE364bEdef1707DD4f2DF358da2C1908824Cc4AC", - "messages": "0x811f7bd79d9cf392f6a60c8e8f570c96769d92c3" + "escrow": "0x0000000005F458Fd6ba9EEb5f365D83b7dA913dD", + "routerEscrow": "0x0F1b890fC6774Ef9b14e99de16302E24A6e7B4F7", + "root": "0x0C1fDfd6a1331a875EA013F3897fc8a76ada5DfC", + "erc7540VaultFactory": "0x6f9dba3D3A3ab083BcA60Ef82784cf12A6eC24b8", + "restrictionManager": "0x4737C3f62Cc265e786b280153fC666cEA2fBc0c0", + "trancheFactory": "0xFa072fB96F737bdBCEa28c921d43c34d3a4Dbb6C", + "investmentManager": "0xE79f06573d6aF1B66166A926483ba00924285d20", + "poolManager": "0x91808B5E2F6d7483D41A681034D7c9DbB64B9E29", + "transferProxyFactory": "0xbe55eBC29344a26550E07EF59aeF791fA3b2A817", + "gasService": "0x3C9C09C4Cfda9D2c35142AAea706E9FC9EA28F27", + "gateway": "0x7829E5ca4286Df66e9F58160544097dB517a3B8c", + "centrifugeRouter": "0x2F445BA946044C5F508a63eEaF7EAb673c69a1F4", + "guardian": "0x09ab10a9c3E6Eac1d18270a2322B6113F4C7f5E8", + "adapter": "0x85bAFcAdeA202258e3512FFBC3E2c9eE6Ad56365" }, "deploymentBlock": 161607032, - "isTestnet": false + "isTestnet": false, + "isDeterministicallyDeployed": true } \ No newline at end of file diff --git a/deployments/mainnet/base-mainnet.json b/deployments/mainnet/base-mainnet.json index 6cc1b811..a3f72a1e 100644 --- a/deployments/mainnet/base-mainnet.json +++ b/deployments/mainnet/base-mainnet.json @@ -2,47 +2,44 @@ "chainId": 8453, "rpcUrl": "https://mainnet.base.org", "config": { - "commitHash": "2f07d3129172af3ee47463c03a253b4a8b24d824", + "commitHash": "27827821e933f574d9bd87581e9b3221c58a9b3d", "deployer": "0x7270b20603FbB3dF0921381670fbd62b9991aDa4", "admin": "0x8b83962fB9dB346a20c95D98d4E312f17f4C0d9b", "adminSigners": [ - "0x71d9f8CFdcCEF71B59DD81AB387e523E2834F2b8", - "0xEf270f8877Aa1875fc13e78dcA31f3235210368f", + "0xd55114BfE98a2ca16202Aa741BeE571765292616", + "0x6E72DD4D5CFCc274a8712A72C9dB9FE1d5A7eB6b", + "0x88b991A2A8d3C5Ac808D3471e1784C6165d29612", + "0xE9441B34f71659cCA2bfE90d98ee0e57D9CAD28F", "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x46a71eEf8DbcFcbAC7A0e8D5d6B634A649e61fb8", - "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", - "0x518B822e679Cc5162AD2C644760767D42d2fb80b", - "0xc4576CE4603552c5BeAa056c449b0795D48fcf92", - "0x790c2c860DDC993f3da92B19cB440cF8338C59a6" - ], - "pausers": [ "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", "0x790c2c860DDC993f3da92B19cB440cF8338C59a6", - "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x3cE760441A4E9BD2c40A69d39A472052Ac14e0D9" + "0xc4576CE4603552c5BeAa056c449b0795D48fcf92" ], "adapter": { "name": "Axelar", - "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31" + "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "axelarGasService": "0x2d5d7d31F671F86C782533cc367F14109a082712" }, - "deploymentSalt": "e416b338a274162320c79445ae6604141d1cb08275eb27011b69f002dc094d05", + "deploymentSalt": "0x7270b20603fbb3df0921381670fbd62b9991ada4b17953a73f70fdff36730018", "etherscanUrl": "https://api.basescan.org/api/" }, "contracts": { - "root": "0x498016d30Cd5f0db50d7ACE329C07313a0420502", - "investmentManager": "0xbBF0AB988691dB1892ADaF7F0eF560Ca4c6DD73A", - "poolManager": "0x78E9e622A57f70F1E0Ec652A4931E4e278e58142", - "gateway": "0x634F036fE66579E901c7bA34e33DF422E37A0037", - "escrow": "0xd595E1483c507E74E2E6A3dE8e7D08d8f6F74936", - "userEscrow": "0x9fc3A3bcEdc1CaB14EfC1B7ef45dFBDd3d17c9d7", - "adapter": "0x8174D5f12Ce682459864D8C081f9635012Ab51c2", - "trancheFactory": "0x2d60cd1527073419423B14666E2D43C1Cf28B152", - "liquidityPoolFactory": "0x77F48b2c942E6f3ac2232568d560e423c441386a", - "restrictionManagerFactory": "0xf4D7F6919eF0B495a2551F7299324961F29aE7aC", - "pauseAdmin": "0xce86472007Ea37a5d0208f8C1559A37530c8067C", - "delayedAdmin": "0x2559998026796Ca6fd057f3aa66F2d6ecdEd9028", - "messages": "0xAf9F6Ac63C057EB7F59b6Fae2c3d447191b58Ea5" + "escrow": "0x0000000005F458Fd6ba9EEb5f365D83b7dA913dD", + "routerEscrow": "0x0F1b890fC6774Ef9b14e99de16302E24A6e7B4F7", + "root": "0x0C1fDfd6a1331a875EA013F3897fc8a76ada5DfC", + "erc7540VaultFactory": "0xcaD01F5A7eE9ba09A1aFDb9Dcaa58cE024E4462C", + "restrictionManager": "0x4737C3f62Cc265e786b280153fC666cEA2fBc0c0", + "trancheFactory": "0xFa072fB96F737bdBCEa28c921d43c34d3a4Dbb6C", + "investmentManager": "0x36b87b860857e6a6d4c2D24be11dc9b230F00f03", + "poolManager": "0x7f192F34499DdB2bE06c4754CFf2a21c4B056994", + "transferProxyFactory": "0xbe55eBC29344a26550E07EF59aeF791fA3b2A817", + "gasService": "0x32043A41F4be198C4f6590312F7A7b91624Cab57", + "gateway": "0x3423D288F2C04eB072eBB973F8c8B9b73cAa4361", + "centrifugeRouter": "0xF35501E7fC4a076E744dbAFA883CED74CCF5009d", + "guardian": "0x427A1ce127b1775e4Cbd4F58ad468B9F832eA7e9", + "adapter": "0x30e34260b895CAE34A1cfB185271628c53311cF3" }, - "deploymentBlock": 8053054, - "isTestnet": false + "deploymentBlock": 17854405, + "isTestnet": false, + "isDeterministicallyDeployed": true } \ No newline at end of file diff --git a/deployments/mainnet/celo-mainnet.json b/deployments/mainnet/celo-mainnet.json index 6ae8d93e..ac3c97bf 100644 --- a/deployments/mainnet/celo-mainnet.json +++ b/deployments/mainnet/celo-mainnet.json @@ -2,47 +2,44 @@ "chainId": 42220, "rpcUrl": "https://celo-mainnet.infura.io/v3/ed5e0e19bcbc427cbf8f661736d44516", "config": { - "commitHash": "333cc86042891d25c72e9a66dc9068652c0e02e0", + "commitHash": "ea767c1c9bffd2e1bdc647688e42c44c489a6e5f", "deployer": "0x7270b20603FbB3dF0921381670fbd62b9991aDa4", "admin": "0x2464f95F6901233bF4a0130A3611d5B4CBd83195", "adminSigners": [ - "0x71d9f8CFdcCEF71B59DD81AB387e523E2834F2b8", - "0xEf270f8877Aa1875fc13e78dcA31f3235210368f", + "0xd55114BfE98a2ca16202Aa741BeE571765292616", + "0x6E72DD4D5CFCc274a8712A72C9dB9FE1d5A7eB6b", + "0x88b991A2A8d3C5Ac808D3471e1784C6165d29612", + "0xE9441B34f71659cCA2bfE90d98ee0e57D9CAD28F", "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x46a71eEf8DbcFcbAC7A0e8D5d6B634A649e61fb8", - "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", - "0x518B822e679Cc5162AD2C644760767D42d2fb80b", - "0xc4576CE4603552c5BeAa056c449b0795D48fcf92", - "0x790c2c860DDC993f3da92B19cB440cF8338C59a6" - ], - "pausers": [ "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", "0x790c2c860DDC993f3da92B19cB440cF8338C59a6", - "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x3cE760441A4E9BD2c40A69d39A472052Ac14e0D9" + "0xc4576CE4603552c5BeAa056c449b0795D48fcf92" ], "adapter": { "name": "Axelar", - "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31" + "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "axelarGasService": "0x2d5d7d31F671F86C782533cc367F14109a082712" }, - "deploymentSalt": "e416b338a274162320c79445ae6604141d1cb08275eb27011b69f002dc094d05", + "deploymentSalt": "0x7270b20603fbb3df0921381670fbd62b9991ada4b17953a73f70fdff36730018", "etherscanUrl": "https://api.celoscan.io/" }, "contracts": { - "root": "0x498016d30Cd5f0db50d7ACE329C07313a0420502", - "investmentManager": "0xbBF0AB988691dB1892ADaF7F0eF560Ca4c6DD73A", - "poolManager": "0x78E9e622A57f70F1E0Ec652A4931E4e278e58142", - "gateway": "0x634F036fE66579E901c7bA34e33DF422E37A0037", - "escrow": "0xd595E1483c507E74E2E6A3dE8e7D08d8f6F74936", - "userEscrow": "0x9fc3A3bcEdc1CaB14EfC1B7ef45dFBDd3d17c9d7", - "adapter": "0x8174D5f12Ce682459864D8C081f9635012Ab51c2", - "trancheFactory": "0x2d60cd1527073419423B14666E2D43C1Cf28B152", - "liquidityPoolFactory": "0x77F48b2c942E6f3ac2232568d560e423c441386a", - "restrictionManagerFactory": "0xf4D7F6919eF0B495a2551F7299324961F29aE7aC", - "pauseAdmin": "0xce86472007Ea37a5d0208f8C1559A37530c8067C", - "delayedAdmin": "0x2559998026796Ca6fd057f3aa66F2d6ecdEd9028", - "messages": "0xAf9F6Ac63C057EB7F59b6Fae2c3d447191b58Ea5" + "escrow": "0x9EDf9FC14DDBEE68CE1a69827b09794367180717", + "routerEscrow": "0xa915C288fd549e52b9e1280269929D6A91EF0c4A", + "root": "0x89e0E9ef81966BfA7D64BBE76394D36014a685c3", + "erc7540VaultFactory": "0x6b8D011EcaB5E84aAc2686eB103b33977C52Fd64", + "restrictionManager": "0x9d5fbC48077863d63a883f44F66aCCde72A9D4e2", + "trancheFactory": "0x288d01671D252eDE0878270D194e6550cF3456ce", + "investmentManager": "0xcaD01F5A7eE9ba09A1aFDb9Dcaa58cE024E4462C", + "poolManager": "0xa3Ce97352C1469884EEF3547Ec9362329FE78Cf0", + "transferProxyFactory": "0x453158D0b4cBd2d54B3c645f725E8fdD46c971C3", + "gasService": "0x36b87b860857e6a6d4c2D24be11dc9b230F00f03", + "gateway": "0x7f192F34499DdB2bE06c4754CFf2a21c4B056994", + "centrifugeRouter": "0x5a00C4fF931f37202aD4Be1FDB297E9EDc1CBb33", + "guardian": "0x32043A41F4be198C4f6590312F7A7b91624Cab57", + "adapter": "0xE4e34083a49Df72E634121f32583c9eA59191cCA" }, - "deploymentBlock": 23066448, - "isTestnet": false + "deploymentBlock": 26965681, + "isTestnet": false, + "isDeterministicallyDeployed": false } \ No newline at end of file diff --git a/deployments/mainnet/ethereum-mainnet.json b/deployments/mainnet/ethereum-mainnet.json index 75032662..06294c28 100644 --- a/deployments/mainnet/ethereum-mainnet.json +++ b/deployments/mainnet/ethereum-mainnet.json @@ -1,51 +1,45 @@ { "chainId": 1, - "rpcUrl": "https://mainnet.infura.io/v3/ed5e0e19bcbc427cbf8f661736d44516", + "rpcUrl": "https://mainnet.infura.io/v3/28b9df37a970456197cdb6b73af4e6de", "config": { - "commitHash": "da5c31462b5fe615d3510ca35f884018fd8055c7", + "commitHash": "27827821e933f574d9bd87581e9b3221c58a9b3d", "deployer": "0x7270b20603FbB3dF0921381670fbd62b9991aDa4", "admin": "0xD9D30ab47c0f096b0AA67e9B8B1624504a63e7FD", "adminSigners": [ - "0x71d9f8CFdcCEF71B59DD81AB387e523E2834F2b8", - "0xEf270f8877Aa1875fc13e78dcA31f3235210368f", + "0xd55114BfE98a2ca16202Aa741BeE571765292616", + "0x6E72DD4D5CFCc274a8712A72C9dB9FE1d5A7eB6b", + "0x88b991A2A8d3C5Ac808D3471e1784C6165d29612", + "0xE9441B34f71659cCA2bfE90d98ee0e57D9CAD28F", "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x46a71eEf8DbcFcbAC7A0e8D5d6B634A649e61fb8", - "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", - "0x518B822e679Cc5162AD2C644760767D42d2fb80b", - "0xc4576CE4603552c5BeAa056c449b0795D48fcf92", - "0x790c2c860DDC993f3da92B19cB440cF8338C59a6" - ], - "pausers": [ "0x9eDec77dd2651Ce062ab17e941347018AD4eAEA9", "0x790c2c860DDC993f3da92B19cB440cF8338C59a6", - "0x2F1724cc5005F376411747dFE24fb7412f5955B1", - "0x3cE760441A4E9BD2c40A69d39A472052Ac14e0D9" + "0xc4576CE4603552c5BeAa056c449b0795D48fcf92" ], "adapter": { "name": "Axelar", - "axelarGateway": "0x4F4495243837681061C4743b74B3eEdf548D56A5" + "axelarGateway": "0x4F4495243837681061C4743b74B3eEdf548D56A5", + "axelarGasService": "0x2d5d7d31F671F86C782533cc367F14109a082712" }, - "deploymentSalt": "e416b338a274162320c79445ae6604141d1cb08275eb27011b69f002dc094d05", + "deploymentSalt": "0x7270b20603fbb3df0921381670fbd62b9991ada4b17953a73f70fdff36730018", "etherscanUrl": "https://api.etherscan.io/api/" }, "contracts": { - "root": "0x498016d30Cd5f0db50d7ACE329C07313a0420502", - "investmentManager": "0xbBF0AB988691dB1892ADaF7F0eF560Ca4c6DD73A", - "poolManager": "0x78E9e622A57f70F1E0Ec652A4931E4e278e58142", - "gateway": "0x634F036fE66579E901c7bA34e33DF422E37A0037", - "escrow": "0xd595E1483c507E74E2E6A3dE8e7D08d8f6F74936", - "userEscrow": "0x9fc3A3bcEdc1CaB14EfC1B7ef45dFBDd3d17c9d7", - "adapter": "0x8174D5f12Ce682459864D8C081f9635012Ab51c2", - "trancheFactory": "0x4aEFE6CeFEd5D0A30679E41C0B3Fee6cbAa6ADf6", - "liquidityPoolFactory": "0x7f93eDB11d5Dc23F04C4E9382aa0d3F31E95BF2C", - "restrictionManagerFactory": "0xf4D7F6919eF0B495a2551F7299324961F29aE7aC", - "pauseAdmin": "0xce86472007Ea37a5d0208f8C1559A37530c8067C", - "delayedAdmin": "0x2559998026796Ca6fd057f3aa66F2d6ecdEd9028", - "messages": "0xAf9F6Ac63C057EB7F59b6Fae2c3d447191b58Ea5" + "escrow": "0x0000000005F458Fd6ba9EEb5f365D83b7dA913dD", + "routerEscrow": "0x0F1b890fC6774Ef9b14e99de16302E24A6e7B4F7", + "root": "0x0C1fDfd6a1331a875EA013F3897fc8a76ada5DfC", + "erc7540VaultFactory": "0x6f9dba3D3A3ab083BcA60Ef82784cf12A6eC24b8", + "restrictionManager": "0x4737C3f62Cc265e786b280153fC666cEA2fBc0c0", + "trancheFactory": "0xFa072fB96F737bdBCEa28c921d43c34d3a4Dbb6C", + "investmentManager": "0xE79f06573d6aF1B66166A926483ba00924285d20", + "poolManager": "0x91808B5E2F6d7483D41A681034D7c9DbB64B9E29", + "transferProxyFactory": "0xbe55eBC29344a26550E07EF59aeF791fA3b2A817", + "gasService": "0x3C9C09C4Cfda9D2c35142AAea706E9FC9EA28F27", + "gateway": "0x7829E5ca4286Df66e9F58160544097dB517a3B8c", + "centrifugeRouter": "0x2F445BA946044C5F508a63eEaF7EAb673c69a1F4", + "guardian": "0x09ab10a9c3E6Eac1d18270a2322B6113F4C7f5E8", + "adapter": "0x85bAFcAdeA202258e3512FFBC3E2c9eE6Ad56365" }, - "deploymentBlock": 18671269, - "spells": [ - "0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7" - ], - "isTestnet": false + "deploymentBlock": 20432396, + "isTestnet": false, + "isDeterministicallyDeployed": true } \ No newline at end of file diff --git a/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.sol b/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.sol index b0ab8dc0..780da305 100644 --- a/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.sol +++ b/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.sol @@ -84,4 +84,4 @@ contract Spell is Addresses { deprectaedLP.poolId(), deprectaedLP.trancheId(), deprectaedLP.asset() ); } -} \ No newline at end of file +} diff --git a/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.t.sol b/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.t.sol index 35a1e452..c7aabda0 100644 --- a/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.t.sol +++ b/deployments/mainnet/spells/001_0xcfbd142ec8f00bbf5f1aa22f66abf2eb476948a7.t.sol @@ -54,4 +54,4 @@ contract SpellTest is RPCTest { assertEq(Tranche(anemoyToken).isTrustedForwarder(newLP_), true); assertEq(Tranche(anemoyToken).allowance(address(escrow), newLP_), UINT256_MAX); } -// } \ No newline at end of file +// } diff --git a/deployments/testnet/ethereum-sepolia-demo.json b/deployments/testnet/ethereum-sepolia-demo.json index b062edce..8460f1f7 100644 --- a/deployments/testnet/ethereum-sepolia-demo.json +++ b/deployments/testnet/ethereum-sepolia-demo.json @@ -2,30 +2,33 @@ "chainId": 11155111, "rpcUrl": "https://sepolia.infura.io/v3/ed5e0e19bcbc427cbf8f661736d44516", "config": { - "commitHash": "acc5fabfff7523edc5da96caccced2b50136bb5e", + "commitHash": "de3d2732726a6900c21a1d66c406b191704daa89", "deployer": "0x423420Ae467df6e90291fd0252c0A8a637C1e03f", "adapter": { - "name": "Axelar" + "name": "Axelar", + "axelarGateway": "0xe432150cce91c13a887f7D836923d5597adD8E31", + "axelarGasService": "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6" }, "admin": "0x423420Ae467df6e90291fd0252c0A8a637C1e03f", "etherscanUrl": "https://api.etherscan.io/api/" }, "contracts": { - "root": "0x3BBd1460508ec94A43AC0b492C3AdA11d978f07f", - "investmentManager": "0x95dfC530d5127e50c996f66A61d607e784fafeBd", - "centrifugeRouter": "0x723635430aa191Ef5f6f856415F41b1A4d81dD7A", - "poolManager": "0xcc46253796c393a95Bc56757F148547CF7279761", - "gateway": "0x6facCe2Bc939BA043DB60a57d41BaF41D19c9232", - "gasService": "0x3aeeaf60Aff345D6295b0fC904098303d7773fea", - "escrow": "0x40c4Dc85Dbf465e9876b9B487d72Ac778DdF2fAc", - "routerEscrow": "0x4D48269388bFfc1cC9C3923db9DcC1aA374a903F", - "adapter": "0x54a03011c6413C6Edc04C956c57a354c9DFc70B0", - "trancheFactory": "0xe86AA3DeF8D06B6D23f17F52AcB6daF6dBEA1572", - "erc7540VaultFactory": "0x760bA84a6f06e9Aa7ee0f0660666a75A36266C07", - "transferProxyFactory": "0xa2a1D375E6a0DA034fFF9226b344BcFE613744aC", - "restrictionManager": "0x1723125b37a402F38D067a8EA0Bd08FdbFCB03fd", - "guardian": "0xAE5d930b098944d117F080Fd7cb162C670e5de9b" + "root": "0x500f2a494Bac9f3776F9a5cb20f69039B0ce7339", + "guardian": "0x3121eCA31a6CC1d68909cD2EbcaF4d364FadE767", + "restrictionManager": "0x71B313101B77B3150FB0fb7427D7D74d3818eB5d", + "investmentManager": "0x4eA66EaF285BBcf03D28225D3aFff5c9FDCdB98c", + "poolManager": "0x5aB7b672dAf72715A58cf0880F840abe0de4dC39", + "centrifugeRouter": "0xe10D49F8e75DFd329E470585E81eC79C13e8B8a0", + "gateway": "0xBb322Fd48E88a520130DF86Ca84B83CbAb4323e6", + "gasService": "0x9799140BD1BBeaE6ECa817081C84723eaBCEffa5", + "escrow": "0x0000000D37F3998bC9Af9508aeb669d5cda23E4D", + "routerEscrow": "0x809816F6dd323f6EFB23913E8e47A39411f266Aa", + "adapter": "0x4403B52b23c8760455336E88493f798C82f19911", + "trancheFactory": "0xaf6202b8e882b6660c9d55E450d75dD4D6d6A9b4", + "erc7540VaultFactory": "0x68d2A0c2312B15874F5C456433d11bDE182f7eA3", + "transferProxyFactory": "0x66d80393a75C8e2e3530409Ea9B1164E0cBB3279" }, "deploymentBlock": 6403738, - "isTestnet": true + "isTestnet": true, + "isDeterministicallyDeployed": true } diff --git a/echidna-assertion.yaml b/echidna-assertion.yaml new file mode 100644 index 00000000..3c1f0a53 --- /dev/null +++ b/echidna-assertion.yaml @@ -0,0 +1,9 @@ + +testMode: "assertion" +prefix: "invariant_" +coverage: true +corpusDir: "echidna" +balanceAddr: 0x1043561a8829300000 +balanceContract: 0x1043561a8829300000 +filterFunctions: [] +cryticArgs: ["--foundry-compile-all"] \ No newline at end of file diff --git a/echidna-property.yaml b/echidna-property.yaml new file mode 100644 index 00000000..e11b3ba0 --- /dev/null +++ b/echidna-property.yaml @@ -0,0 +1,8 @@ +testMode: "property" +prefix: "invariant_" +coverage: true +corpusDir: "echidna" +balanceAddr: 0x1043561a8829300000 +balanceContract: 0x1043561a8829300000 +filterFunctions: [] +cryticArgs: ["--foundry-compile-all"] \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index c9f40c10..3a995ceb 100644 --- a/foundry.toml +++ b/foundry.toml @@ -2,6 +2,7 @@ src = 'src' out = 'out' libs = ['lib'] +no_match_contract = "CryticTester" solc_version = "0.8.26" evm_version = "cancun" diff --git a/lib/chimera b/lib/chimera new file mode 160000 index 00000000..13ccf08d --- /dev/null +++ b/lib/chimera @@ -0,0 +1 @@ +Subproject commit 13ccf08db630a402b5681c24397380ce2ea565f6 diff --git a/medusa-aggregator.json b/medusa-aggregator.json new file mode 100644 index 00000000..6e878909 --- /dev/null +++ b/medusa-aggregator.json @@ -0,0 +1,86 @@ +{ + "fuzzing": { + "workers": 10, + "workerResetLimit": 50, + "timeout": 0, + "testLimit": 0, + "callSequenceLength": 100, + "corpusDirectory": "medusa-aggregator", + "coverageEnabled": true, + "deploymentOrder": [ + "CryticAggregatorTester" + ], + "targetContracts": [ + "CryticAggregatorTester" + ], + "targetContractsBalances": [ + "0x27b46536c66c8e3000000" + ], + "constructorArgs": {}, + "deployerAddress": "0x30000", + "senderAddresses": [ + "0x10000", + "0x20000", + "0x30000" + ], + "blockNumberDelayMax": 60480, + "blockTimestampDelayMax": 604800, + "blockGasLimit": 125000000, + "transactionGasLimit": 12500000, + "testing": { + "stopOnFailedTest": false, + "stopOnFailedContractMatching": false, + "stopOnNoTests": true, + "testAllContracts": false, + "traceAll": false, + "assertionTesting": { + "enabled": true, + "testViewMethods": true, + "panicCodeConfig": { + "failOnCompilerInsertedPanic": false, + "failOnAssertion": true, + "failOnArithmeticUnderflow": false, + "failOnDivideByZero": false, + "failOnEnumTypeConversionOutOfBounds": false, + "failOnIncorrectStorageAccess": false, + "failOnPopEmptyArray": false, + "failOnOutOfBoundsArrayAccess": false, + "failOnAllocateTooMuchMemory": false, + "failOnCallUninitializedVariable": false + } + }, + "propertyTesting": { + "enabled": true, + "testPrefixes": [ + "invariant_" + ] + }, + "optimizationTesting": { + "enabled": false, + "testPrefixes": [ + "optimize_" + ] + } + }, + "chainConfig": { + "codeSizeCheckDisabled": true, + "cheatCodes": { + "cheatCodesEnabled": true, + "enableFFI": false + } + } + }, + "compilation": { + "platform": "crytic-compile", + "platformConfig": { + "target": ".", + "solcVersion": "", + "exportDirectory": "", + "args": ["--foundry-compile-all"] + } + }, + "logging": { + "level": "info", + "logDirectory": "" + } +} \ No newline at end of file diff --git a/medusa-core.json b/medusa-core.json new file mode 100644 index 00000000..2947c201 --- /dev/null +++ b/medusa-core.json @@ -0,0 +1,88 @@ +{ + "fuzzing": { + "workers": 10, + "workerResetLimit": 50, + "timeout": 0, + "testLimit": 0, + "callSequenceLength": 100, + "corpusDirectory": "medusa-core", + "coverageEnabled": true, + "deploymentOrder": [ + "CryticTester" + ], + "targetContracts": [ + "CryticTester" + ], + "targetContractsBalances": [ + "0x27b46536c66c8e3000000" + ], + "constructorArgs": {}, + "deployerAddress": "0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38", + "senderAddresses": [ + "0x10000", + "0x20000", + "0x30000" + ], + "blockNumberDelayMax": 60480, + "blockTimestampDelayMax": 604800, + "blockGasLimit": 125000000, + "transactionGasLimit": 12500000, + "testing": { + "stopOnFailedTest": false, + "stopOnFailedContractMatching": false, + "stopOnNoTests": true, + "testAllContracts": false, + "traceAll": false, + "assertionTesting": { + "enabled": true, + "testViewMethods": true, + "panicCodeConfig": { + "failOnCompilerInsertedPanic": false, + "failOnAssertion": true, + "failOnArithmeticUnderflow": false, + "failOnDivideByZero": false, + "failOnEnumTypeConversionOutOfBounds": false, + "failOnIncorrectStorageAccess": false, + "failOnPopEmptyArray": false, + "failOnOutOfBoundsArrayAccess": false, + "failOnAllocateTooMuchMemory": false, + "failOnCallUninitializedVariable": false + } + }, + "propertyTesting": { + "enabled": true, + "testPrefixes": [ + "invariant_" + ] + }, + "optimizationTesting": { + "enabled": false, + "testPrefixes": [ + "optimize_" + ] + } + }, + "chainConfig": { + "codeSizeCheckDisabled": true, + "cheatCodes": { + "cheatCodesEnabled": true, + "enableFFI": false + } + } + }, + "compilation": { + "platform": "crytic-compile", + "platformConfig": { + "target": ".", + "solcVersion": "", + "exportDirectory": "", + "args": [ + "--foundry-compile-all" + ] + } + }, + "logging": { + "level": "info", + "logDirectory": "" + } +} \ No newline at end of file diff --git a/remappings.txt b/remappings.txt index 83fbb695..acd9c607 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1 +1,2 @@ -forge-std/=lib/forge-std/src/ \ No newline at end of file +forge-std/=lib/forge-std/src/ +@chimera/=lib/chimera/src/ \ No newline at end of file diff --git a/scope.txt b/scope.txt new file mode 100644 index 00000000..e083d5ef --- /dev/null +++ b/scope.txt @@ -0,0 +1,29 @@ +src/ERC7540Vault.sol +src/CentrifugeRouter.sol +src/InvestmentManager.sol +src/PoolManager.sol +src/Root.sol +src/Escrow.sol +src/Auth.sol +src/token/ERC20.sol +src/token/Tranche.sol +src/token/RestrictionManager.sol +src/gateway/Gateway.sol +src/gateway/GasService.sol +src/gateway/adapters/axelar/Adapter.sol +src/admin/Guardian.sol +src/factories/ERC7540VaultFactory.sol +src/factories/TrancheFactory.sol +src/factories/TransferProxyFactory.sol +src/libraries/MathLib.sol +src/libraries/BytesLib.sol +src/libraries/MessagesLib.sol +src/libraries/CastLib.sol +src/libraries/SignatureLib.sol +src/libraries/BitmapLib.sol +src/libraries/ArrayLib.sol +src/libraries/TransientStorage.sol +src/libraries/SafeTransferLib.sol +src/libraries/EIP712Lib.sol +script/Deployer.sol +script/Axelar.s.sol \ No newline at end of file diff --git a/script/Axelar.s.sol b/script/Axelar.s.sol index 0e447c5e..8ee8e648 100644 --- a/script/Axelar.s.sol +++ b/script/Axelar.s.sol @@ -2,9 +2,7 @@ pragma solidity 0.8.26; import {AxelarAdapter} from "src/gateway/adapters/axelar/Adapter.sol"; -import {ERC20} from "src/token/ERC20.sol"; import {Deployer} from "script/Deployer.sol"; -import {AxelarForwarder} from "src/gateway/adapters/axelar/Forwarder.sol"; // Script to deploy Liquidity Pools with an Axelar Adapter. contract AxelarScript is Deployer { diff --git a/script/Deployer.sol b/script/Deployer.sol index 1fe89cef..6afcdee2 100644 --- a/script/Deployer.sol +++ b/script/Deployer.sol @@ -13,7 +13,6 @@ import {PoolManager} from "src/PoolManager.sol"; import {Escrow} from "src/Escrow.sol"; import {CentrifugeRouter} from "src/CentrifugeRouter.sol"; import {Guardian} from "src/admin/Guardian.sol"; -import {MockSafe} from "test/mocks/MockSafe.sol"; import {IAuth} from "src/interfaces/IAuth.sol"; import "forge-std/Script.sol"; @@ -31,10 +30,10 @@ contract Deployer is Script { Gateway public gateway; GasService public gasService; CentrifugeRouter public router; + TransferProxyFactory public transferProxyFactory; address public vaultFactory; address public restrictionManager; address public trancheFactory; - address public transferProxyFactory; function deploy(address deployer) public { // If no salt is provided, a pseudo-random salt is generated, @@ -48,7 +47,7 @@ contract Deployer is Script { uint128 gasPrice = uint128(vm.envOr("GAS_PRICE", uint256(2500000000000000000))); // Centrifuge Chain uint256 tokenPrice = vm.envOr("TOKEN_PRICE", uint256(178947400000000)); // CFG/ETH - escrow = new Escrow{salt: keccak256(abi.encodePacked(salt, "escrow1"))}(deployer); + escrow = new Escrow{salt: salt}(deployer); routerEscrow = new Escrow{salt: keccak256(abi.encodePacked(salt, "escrow2"))}(deployer); root = new Root{salt: salt}(address(escrow), delay, deployer); vaultFactory = address(new ERC7540VaultFactory(address(root))); @@ -56,7 +55,7 @@ contract Deployer is Script { trancheFactory = address(new TrancheFactory{salt: salt}(address(root), deployer)); investmentManager = new InvestmentManager(address(root), address(escrow)); poolManager = new PoolManager(address(escrow), vaultFactory, trancheFactory); - transferProxyFactory = address(new TransferProxyFactory{salt: salt}(address(poolManager))); + transferProxyFactory = new TransferProxyFactory{salt: salt}(address(root), deployer); gasService = new GasService(messageCost, proofCost, gasPrice, tokenPrice); gateway = new Gateway(address(root), address(poolManager), address(investmentManager), address(gasService)); router = new CentrifugeRouter(address(routerEscrow), address(gateway), address(poolManager)); @@ -74,7 +73,6 @@ contract Deployer is Script { function _rely() internal { // Rely on PoolManager - gasService.rely(address(poolManager)); escrow.rely(address(poolManager)); IAuth(vaultFactory).rely(address(poolManager)); IAuth(trancheFactory).rely(address(poolManager)); @@ -88,6 +86,7 @@ contract Deployer is Script { gasService.rely(address(root)); escrow.rely(address(root)); routerEscrow.rely(address(root)); + transferProxyFactory.rely(address(root)); IAuth(vaultFactory).rely(address(root)); IAuth(trancheFactory).rely(address(root)); IAuth(restrictionManager).rely(address(root)); @@ -103,7 +102,7 @@ contract Deployer is Script { gasService.rely(address(gateway)); // Rely on others - IAuth(address(routerEscrow)).rely(address(router)); + routerEscrow.rely(address(router)); investmentManager.rely(address(vaultFactory)); } @@ -114,6 +113,10 @@ contract Deployer is Script { investmentManager.file("poolManager", address(poolManager)); investmentManager.file("gateway", address(gateway)); + + gateway.file("payers", address(router), true); + + transferProxyFactory.file("poolManager", address(poolManager)); } function wire(address adapter) public { @@ -127,6 +130,7 @@ contract Deployer is Script { IAuth(vaultFactory).deny(deployer); IAuth(trancheFactory).deny(deployer); IAuth(restrictionManager).deny(deployer); + transferProxyFactory.deny(deployer); root.deny(deployer); investmentManager.deny(deployer); poolManager.deny(deployer); diff --git a/src/Auth.sol b/src/Auth.sol index da6cf2fc..a8929f79 100644 --- a/src/Auth.sol +++ b/src/Auth.sol @@ -6,22 +6,28 @@ import {IAuth} from "src/interfaces/IAuth.sol"; /// @title Auth /// @notice Simple authentication pattern /// @author Based on code from https://github.com/makerdao/dss -contract Auth is IAuth { +abstract contract Auth is IAuth { + /// @inheritdoc IAuth mapping(address => uint256) public wards; + constructor(address initialWard) { + wards[initialWard] = 1; + emit Rely(initialWard); + } + /// @dev Check if the msg.sender has permissions modifier auth() { require(wards[msg.sender] == 1, "Auth/not-authorized"); _; } - /// @dev Give permissions to the user + /// @inheritdoc IAuth function rely(address user) external auth { wards[user] = 1; emit Rely(user); } - /// @dev Remove permissions from the user + /// @inheritdoc IAuth function deny(address user) external auth { wards[user] = 0; emit Deny(user); diff --git a/src/CentrifugeRouter.sol b/src/CentrifugeRouter.sol index 03a0d986..f7694daf 100644 --- a/src/CentrifugeRouter.sol +++ b/src/CentrifugeRouter.sol @@ -10,9 +10,11 @@ import {IERC7540Vault} from "src/interfaces/IERC7540.sol"; import {ICentrifugeRouter} from "src/interfaces/ICentrifugeRouter.sol"; import {IPoolManager, Domain} from "src/interfaces/IPoolManager.sol"; import {IEscrow} from "src/interfaces/IEscrow.sol"; +import {ITranche} from "src/interfaces/token/ITranche.sol"; import {IGateway} from "src/interfaces/gateway/IGateway.sol"; import {TransientStorage} from "src/libraries/TransientStorage.sol"; import {IRecoverable} from "src/interfaces/IRoot.sol"; +import {ITransferProxy} from "src/interfaces/factories/ITransferProxy.sol"; /// @title CentrifugeRouter /// @notice This is a helper contract, designed to be the entrypoint for EOAs. @@ -20,11 +22,16 @@ import {IRecoverable} from "src/interfaces/IRoot.sol"; /// It also adds the need to fully pay for each step of the transaction execution. CentrifugeRouter allows /// the caller to execute multiple function into a single transaction by taking advantage of /// the multicall functionality which batches message calls into a single one. +/// @dev It is critical to ensure that at the end of any transaction, no funds remain in the +/// CentrifugeRouter. Any funds that do remain are at risk of being taken by other users. contract CentrifugeRouter is Auth, ICentrifugeRouter { using CastLib for address; using TransientStorage for bytes32; - bytes32 public constant INITIATOR_SLOT = bytes32(uint256(keccak256("initiator")) - 1); + /// @dev Requests for Centrifuge pool are non-fungible and all have ID = 0 + uint256 private constant REQUEST_ID = 0; + + bytes32 public constant INITIATOR_SLOT = bytes32(uint256(keccak256("Centrifuge/initiator")) - 1); IEscrow public immutable escrow; IGateway public immutable gateway; @@ -33,17 +40,14 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { /// @inheritdoc ICentrifugeRouter mapping(address controller => mapping(address vault => uint256 amount)) public lockedRequests; - constructor(address escrow_, address gateway_, address poolManager_) { + constructor(address escrow_, address gateway_, address poolManager_) Auth(msg.sender) { escrow = IEscrow(escrow_); gateway = IGateway(gateway_); poolManager = IPoolManager(poolManager_); - - wards[msg.sender] = 1; - emit Rely(msg.sender); } modifier protected() { - address currentInitiator = _initiator(); + address currentInitiator = INITIATOR_SLOT.tloadAddress(); if (currentInitiator == address(0)) { // Single call re-entrancy lock INITIATOR_SLOT.tstore(msg.sender); @@ -63,12 +67,12 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { } // --- Enable interactions with the vault --- - function open(address vault) public protected { - IERC7540Vault(vault).setEndorsedOperator(_initiator(), true); + function enable(address vault) public protected { + IERC7540Vault(vault).setEndorsedOperator(msg.sender, true); } - function close(address vault) external protected { - IERC7540Vault(vault).setEndorsedOperator(_initiator(), false); + function disable(address vault) external protected { + IERC7540Vault(vault).setEndorsedOperator(msg.sender, false); } // --- Deposit --- @@ -78,6 +82,8 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { payable protected { + require(owner == msg.sender || owner == address(this), "CentrifugeRouter/invalid-owner"); + (address asset,) = poolManager.getVaultAsset(vault); if (owner == address(this)) { _approveMax(asset, vault); @@ -93,43 +99,40 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { payable protected { - address initiator = _initiator(); - require(owner == initiator || owner == address(this), "CentrifugeRouter/invalid-owner"); + require(owner == msg.sender || owner == address(this), "CentrifugeRouter/invalid-owner"); lockedRequests[controller][vault] += amount; (address asset,) = poolManager.getVaultAsset(vault); SafeTransferLib.safeTransferFrom(asset, owner, address(escrow), amount); - emit LockDepositRequest(vault, controller, owner, initiator, amount); + emit LockDepositRequest(vault, controller, owner, msg.sender, amount); } /// @inheritdoc ICentrifugeRouter - function openLockDepositRequest(address vault, uint256 amount) external payable protected { - open(vault); + function enableLockDepositRequest(address vault, uint256 amount) external payable protected { + enable(vault); - address initiator = _initiator(); (address asset, bool isWrapper) = poolManager.getVaultAsset(vault); - - if (isWrapper) { - wrap(asset, amount, address(this), initiator); - lockDepositRequest(vault, amount, initiator, address(this)); + uint256 assetBalance = IERC20(asset).balanceOf(msg.sender); + if (isWrapper && assetBalance < amount) { + wrap(asset, amount, address(this), msg.sender); + lockDepositRequest(vault, amount, msg.sender, address(this)); } else { - lockDepositRequest(vault, amount, initiator, initiator); + lockDepositRequest(vault, amount, msg.sender, msg.sender); } } /// @inheritdoc ICentrifugeRouter function unlockDepositRequest(address vault, address receiver) external payable protected { - address initiator = _initiator(); - uint256 lockedRequest = lockedRequests[initiator][vault]; + uint256 lockedRequest = lockedRequests[msg.sender][vault]; require(lockedRequest != 0, "CentrifugeRouter/no-locked-balance"); - lockedRequests[initiator][vault] = 0; + lockedRequests[msg.sender][vault] = 0; (address asset,) = poolManager.getVaultAsset(vault); escrow.approveMax(asset, address(this)); SafeTransferLib.safeTransferFrom(asset, address(escrow), receiver, lockedRequest); - emit UnlockDepositRequest(vault, initiator, receiver); + emit UnlockDepositRequest(vault, msg.sender, receiver); } /// @inheritdoc ICentrifugeRouter @@ -150,16 +153,12 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { _pay(topUpAmount); _approveMax(asset, vault); IERC7540Vault(vault).requestDeposit(lockedRequest, controller, address(this)); - emit ExecuteLockedDepositRequest(vault, controller, _initiator()); + emit ExecuteLockedDepositRequest(vault, controller, msg.sender); } /// @inheritdoc ICentrifugeRouter function claimDeposit(address vault, address receiver, address controller) external payable protected { - require( - controller == _initiator() - || (controller == receiver && IERC7540Vault(vault).isOperator(controller, address(this))), - "CentrifugeRouter/invalid-sender" - ); + _canClaim(vault, receiver, controller); uint256 maxMint = IERC7540Vault(vault).maxMint(controller); IERC7540Vault(vault).mint(maxMint, receiver, controller); } @@ -167,7 +166,7 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { /// @inheritdoc ICentrifugeRouter function cancelDepositRequest(address vault, uint256 topUpAmount) external payable protected { _pay(topUpAmount); - IERC7540Vault(vault).cancelDepositRequest(0, _initiator()); + IERC7540Vault(vault).cancelDepositRequest(REQUEST_ID, msg.sender); } /// @inheritdoc ICentrifugeRouter @@ -176,12 +175,8 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { payable protected { - require( - controller == _initiator() - || (controller == receiver && IERC7540Vault(vault).isOperator(controller, address(this))), - "CentrifugeRouter/invalid-sender" - ); - IERC7540Vault(vault).claimCancelDepositRequest(0, receiver, controller); + _canClaim(vault, receiver, controller); + IERC7540Vault(vault).claimCancelDepositRequest(REQUEST_ID, receiver, controller); } // --- Redeem --- @@ -191,21 +186,18 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { payable protected { + require(owner == msg.sender || owner == address(this), "CentrifugeRouter/invalid-owner"); _pay(topUpAmount); IERC7540Vault(vault).requestRedeem(amount, controller, owner); } /// @inheritdoc ICentrifugeRouter function claimRedeem(address vault, address receiver, address controller) external payable protected { - address initiator = _initiator(); - bool permissionlesslyClaiming = controller != initiator && controller == receiver - && IERC7540Vault(vault).isOperator(controller, address(this)); - - require(controller == initiator || permissionlesslyClaiming, "CentrifugeRouter/invalid-sender"); + _canClaim(vault, receiver, controller); uint256 maxWithdraw = IERC7540Vault(vault).maxWithdraw(controller); (address asset, bool isWrapper) = poolManager.getVaultAsset(vault); - if (isWrapper && permissionlesslyClaiming) { + if (isWrapper && controller != msg.sender) { // Auto-unwrap if permissionlessly claiming for another controller IERC7540Vault(vault).withdraw(maxWithdraw, address(this), controller); unwrap(asset, maxWithdraw, receiver); @@ -217,17 +209,13 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { /// @inheritdoc ICentrifugeRouter function cancelRedeemRequest(address vault, uint256 topUpAmount) external payable protected { _pay(topUpAmount); - IERC7540Vault(vault).cancelRedeemRequest(0, _initiator()); + IERC7540Vault(vault).cancelRedeemRequest(REQUEST_ID, msg.sender); } /// @inheritdoc ICentrifugeRouter function claimCancelRedeemRequest(address vault, address receiver, address controller) external payable protected { - require( - controller == _initiator() - || (controller == receiver && IERC7540Vault(vault).isOperator(controller, address(this))), - "CentrifugeRouter/invalid-sender" - ); - IERC7540Vault(vault).claimCancelRedeemRequest(0, receiver, controller); + _canClaim(vault, receiver, controller); + IERC7540Vault(vault).claimCancelRedeemRequest(REQUEST_ID, receiver, controller); } // --- Transfer --- @@ -237,7 +225,7 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { payable protected { - SafeTransferLib.safeTransferFrom(asset, _initiator(), address(this), amount); + SafeTransferLib.safeTransferFrom(asset, msg.sender, address(this), amount); _approveMax(asset, address(poolManager)); _pay(topUpAmount); poolManager.transferAssets(asset, recipient, amount); @@ -252,6 +240,16 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { transferAssets(asset, recipient.toBytes32(), amount, topUpAmount); } + /// @inheritdoc ICentrifugeRouter + function transferAssetsFromProxy(address transferProxy, address asset, uint256 topUpAmount) + external + payable + protected + { + _pay(topUpAmount); + ITransferProxy(transferProxy).transfer(asset); + } + /// @inheritdoc ICentrifugeRouter function transferTrancheTokens( address vault, @@ -261,7 +259,7 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { uint128 amount, uint256 topUpAmount ) public payable protected { - SafeTransferLib.safeTransferFrom(IERC7540Vault(vault).share(), _initiator(), address(this), amount); + SafeTransferLib.safeTransferFrom(IERC7540Vault(vault).share(), msg.sender, address(this), amount); _approveMax(IERC7540Vault(vault).share(), address(poolManager)); _pay(topUpAmount); IPoolManager(poolManager).transferTrancheTokens( @@ -288,12 +286,12 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { payable protected { - try IERC20Permit(asset).permit(_initiator(), spender, assets, deadline, v, r, s) {} catch {} + try IERC20Permit(asset).permit(msg.sender, spender, assets, deadline, v, r, s) {} catch {} } // --- ERC20 wrapping --- function wrap(address wrapper, uint256 amount, address receiver, address owner) public payable protected { - require(owner == _initiator() || owner == address(this), "CentrifugeRouter/invalid-owner"); + require(owner == msg.sender || owner == address(this), "CentrifugeRouter/invalid-owner"); address underlying = IERC20Wrapper(wrapper).underlying(); amount = MathLib.min(amount, IERC20(underlying).balanceOf(owner)); @@ -317,7 +315,8 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { require(INITIATOR_SLOT.tloadAddress() == address(0), "CentrifugeRouter/already-initiated"); INITIATOR_SLOT.tstore(msg.sender); - for (uint256 i; i < data.length; ++i) { + uint256 totalBytes = data.length; + for (uint256 i; i < totalBytes; ++i) { (bool success, bytes memory returnData) = address(this).delegatecall(data[i]); if (!success) { uint256 length = returnData.length; @@ -334,7 +333,7 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { // --- View Methods --- /// @inheritdoc ICentrifugeRouter function getVault(uint64 poolId, bytes16 trancheId, address asset) external view returns (address) { - return IPoolManager(poolManager).getVault(poolId, trancheId, asset); + return ITranche(IPoolManager(poolManager).getTranche(poolId, trancheId)).vault(asset); } /// @inheritdoc ICentrifugeRouter @@ -342,21 +341,36 @@ contract CentrifugeRouter is Auth, ICentrifugeRouter { (, amount) = IGateway(gateway).estimate(payload); } - // --- Helpers --- - function _initiator() internal view returns (address) { - return INITIATOR_SLOT.tloadAddress(); + /// @inheritdoc ICentrifugeRouter + function hasPermissions(address vault, address controller) external view returns (bool) { + return IERC7540Vault(vault).isPermissioned(controller); } - /// @dev Gives the max approval to `to` to spend the given `asset` if not already approved. - /// @dev Assumes that `type(uint256).max` is large enough to never have to increase the allowance again. + /// @inheritdoc ICentrifugeRouter + function isEnabled(address vault, address controller) public view returns (bool) { + return IERC7540Vault(vault).isOperator(controller, address(this)); + } + + /// @notice Gives the max approval to `to` to spend the given `asset` if not already approved. + /// @dev Assumes that `type(uint256).max` is large enough to never have to increase the allowance again. function _approveMax(address token, address spender) internal { if (IERC20(token).allowance(address(this), spender) == 0) { SafeTransferLib.safeApprove(token, spender, type(uint256).max); } } + /// @notice Send native tokens to the gateway for transaction payment. function _pay(uint256 amount) internal { require(amount <= address(this).balance, "CentrifugeRouter/insufficient-funds"); gateway.topUp{value: amount}(); } + + /// @notice Ensures msg.sender is either the controller, or can permissionlessly claim + /// on behalf of the controller. + function _canClaim(address vault, address receiver, address controller) internal view { + require( + controller == msg.sender || (controller == receiver && isEnabled(vault, controller)), + "CentrifugeRouter/invalid-sender" + ); + } } diff --git a/src/ERC7540Vault.sol b/src/ERC7540Vault.sol index ce37adf7..44c6d3f5 100644 --- a/src/ERC7540Vault.sol +++ b/src/ERC7540Vault.sol @@ -24,15 +24,15 @@ import "src/interfaces/IERC20.sol"; /// After execution users can use the deposit, mint, redeem and withdraw functions to get their shares /// and/or assets from the pools. contract ERC7540Vault is Auth, IERC7540Vault { - /// @dev Requests for Centrifuge pool are non-transferable and all have ID = 0 + /// @dev Requests for Centrifuge pool are non-fungible and all have ID = 0 uint256 private constant REQUEST_ID = 0; - bytes32 public constant AUTHORIZE_OPERATOR_TYPEHASH = - keccak256("AuthorizeOperator(address controller,address operator,bool approved,uint256 deadline,bytes32 nonce)"); + IRoot public immutable root; + address public immutable escrow; + IInvestmentManager public manager; /// @inheritdoc IERC7540Vault uint64 public immutable poolId; - /// @inheritdoc IERC7540Vault bytes16 public immutable trancheId; @@ -41,21 +41,15 @@ contract ERC7540Vault is Auth, IERC7540Vault { /// @inheritdoc IERC7575 address public immutable share; - uint8 public immutable shareDecimals; - - /// @dev For looking up endorsed contracts - IRoot public immutable root; - - /// @dev Escrow contract for tokens - address public immutable escrow; - - /// @dev Vault implementation contract - IInvestmentManager public manager; + uint8 internal immutable _shareDecimals; + /// --- ERC7741 --- bytes32 private immutable nameHash; bytes32 private immutable versionHash; uint256 public immutable deploymentChainId; bytes32 private immutable _DOMAIN_SEPARATOR; + bytes32 public constant AUTHORIZE_OPERATOR_TYPEHASH = + keccak256("AuthorizeOperator(address controller,address operator,bool approved,bytes32 nonce,uint256 deadline)"); /// @inheritdoc IERC7741 mapping(address controller => mapping(bytes32 nonce => bool used)) public authorizations; @@ -74,12 +68,12 @@ contract ERC7540Vault is Auth, IERC7540Vault { address root_, address escrow_, address manager_ - ) { + ) Auth(msg.sender) { poolId = poolId_; trancheId = trancheId_; asset = asset_; share = share_; - shareDecimals = IERC20Metadata(share).decimals(); + _shareDecimals = IERC20Metadata(share).decimals(); root = IRoot(root_); escrow = escrow_; manager = IInvestmentManager(manager_); @@ -88,9 +82,6 @@ contract ERC7540Vault is Auth, IERC7540Vault { versionHash = keccak256(bytes("1")); deploymentChainId = block.chainid; _DOMAIN_SEPARATOR = EIP712Lib.calculateDomainSeparator(nameHash, versionHash); - - wards[msg.sender] = 1; - emit Rely(msg.sender); } // --- Administration --- @@ -144,6 +135,10 @@ contract ERC7540Vault is Auth, IERC7540Vault { "ERC7540Vault/request-redeem-failed" ); + require( + ITranche(share).checkTransferRestriction(owner, address(escrow), shares), "ERC7540Vault/restrictions-failed" + ); + try ITranche(share).authTransferFrom(sender, owner, address(escrow), shares) returns (bool) {} catch { // Support tranche tokens that block authTransferFrom. In this case ERC20 approval needs to be set @@ -167,7 +162,7 @@ contract ERC7540Vault is Auth, IERC7540Vault { // --- Asynchronous cancellation methods --- /// @inheritdoc IERC7540CancelDeposit function cancelDepositRequest(uint256, address controller) external { - validateController(controller); + _validateController(controller); manager.cancelDepositRequest(address(this), controller, msg.sender); emit CancelDepositRequest(controller, REQUEST_ID, msg.sender); } @@ -187,14 +182,14 @@ contract ERC7540Vault is Auth, IERC7540Vault { external returns (uint256 assets) { - validateController(controller); + _validateController(controller); assets = manager.claimCancelDepositRequest(address(this), receiver, controller); emit CancelDepositClaim(receiver, controller, REQUEST_ID, msg.sender, assets); } /// @inheritdoc IERC7540CancelRedeem function cancelRedeemRequest(uint256, address controller) external { - validateController(controller); + _validateController(controller); manager.cancelRedeemRequest(address(this), controller, msg.sender); emit CancelRedeemRequest(controller, REQUEST_ID, msg.sender); } @@ -214,13 +209,14 @@ contract ERC7540Vault is Auth, IERC7540Vault { external returns (uint256 shares) { - validateController(controller); + _validateController(controller); shares = manager.claimCancelRedeemRequest(address(this), receiver, controller); emit CancelRedeemClaim(receiver, controller, REQUEST_ID, msg.sender, shares); } /// @inheritdoc IERC7540Operator function setOperator(address operator, bool approved) public virtual returns (bool success) { + require(msg.sender != operator, "ERC7540Vault/cannot-set-self-as-operator"); isOperator[msg.sender][operator] = approved; emit OperatorSet(msg.sender, operator, approved); success = true; @@ -228,6 +224,7 @@ contract ERC7540Vault is Auth, IERC7540Vault { /// @inheritdoc IERC7540Vault function setEndorsedOperator(address owner, bool approved) public virtual { + require(msg.sender != owner, "ERC7540Vault/cannot-set-self-as-operator"); require(root.endorsed(msg.sender), "ERC7540Vault/not-endorsed"); isOperator[owner][msg.sender] = approved; emit OperatorSet(owner, msg.sender, approved); @@ -245,12 +242,12 @@ contract ERC7540Vault is Auth, IERC7540Vault { address controller, address operator, bool approved, - uint256 deadline, bytes32 nonce, + uint256 deadline, bytes memory signature ) external returns (bool success) { + require(controller != operator, "ERC7540Vault/cannot-set-self-as-operator"); require(block.timestamp <= deadline, "ERC7540Vault/expired"); - require(controller != address(0), "ERC7540Vault/invalid-controller"); require(!authorizations[controller][nonce], "ERC7540Vault/authorization-used"); authorizations[controller][nonce] = true; @@ -259,7 +256,7 @@ contract ERC7540Vault is Auth, IERC7540Vault { abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), - keccak256(abi.encode(AUTHORIZE_OPERATOR_TYPEHASH, controller, operator, approved, deadline, nonce)) + keccak256(abi.encode(AUTHORIZE_OPERATOR_TYPEHASH, controller, operator, approved, nonce, deadline)) ) ); @@ -313,12 +310,14 @@ contract ERC7540Vault is Auth, IERC7540Vault { /// @inheritdoc IERC7540Deposit function deposit(uint256 assets, address receiver, address controller) public returns (uint256 shares) { - validateController(controller); + _validateController(controller); shares = manager.deposit(address(this), assets, receiver, controller); emit Deposit(receiver, controller, assets, shares); } /// @inheritdoc IERC7575 + /// @notice When claiming deposit requests using deposit(), there can be some precision loss leading to dust. + /// It is recommended to use mint() to claim deposit requests instead. function deposit(uint256 assets, address receiver) external returns (uint256 shares) { shares = deposit(assets, receiver, msg.sender); } @@ -330,7 +329,7 @@ contract ERC7540Vault is Auth, IERC7540Vault { /// @inheritdoc IERC7540Deposit function mint(uint256 shares, address receiver, address controller) public returns (uint256 assets) { - validateController(controller); + _validateController(controller); assets = manager.mint(address(this), shares, receiver, controller); emit Deposit(receiver, controller, assets, shares); } @@ -346,9 +345,9 @@ contract ERC7540Vault is Auth, IERC7540Vault { } /// @inheritdoc IERC7575 - /// @notice DOES NOT support controller != msg.sender since shares are already transferred on requestRedeem + /// @notice DOES NOT support controller != msg.sender since shares are already transferred on requestRedeem function withdraw(uint256 assets, address receiver, address controller) public returns (uint256 shares) { - validateController(controller); + _validateController(controller); shares = manager.withdraw(address(this), assets, receiver, controller); emit Withdraw(msg.sender, receiver, controller, assets, shares); } @@ -359,9 +358,11 @@ contract ERC7540Vault is Auth, IERC7540Vault { } /// @inheritdoc IERC7575 - /// @notice DOES NOT support controller != msg.sender since shares are already transferred on requestRedeem + /// @notice DOES NOT support controller != msg.sender since shares are already transferred on requestRedeem. + /// When claiming redemption requests using redeem(), there can be some precision loss leading to dust. + /// It is recommended to use withdraw() to claim redemption requests instead. function redeem(uint256 shares, address receiver, address controller) external returns (uint256 assets) { - validateController(controller); + _validateController(controller); assets = manager.redeem(address(this), shares, receiver, controller); emit Withdraw(msg.sender, receiver, controller, assets, shares); } @@ -387,6 +388,10 @@ contract ERC7540Vault is Auth, IERC7540Vault { } // --- Event emitters --- + function onRedeemRequest(address controller, address owner, uint256 shares) public auth { + emit RedeemRequest(controller, owner, REQUEST_ID, msg.sender, shares); + } + function onDepositClaimable(address controller, uint256 assets, uint256 shares) public auth { emit DepositClaimable(controller, REQUEST_ID, assets, shares); } @@ -406,7 +411,7 @@ contract ERC7540Vault is Auth, IERC7540Vault { // --- Helpers --- /// @notice Price of 1 unit of share, quoted in the decimals of the asset. function pricePerShare() external view returns (uint256) { - return convertToAssets(10 ** shareDecimals); + return convertToAssets(10 ** _shareDecimals); } /// @notice Returns timestamp of the last share price update. @@ -420,7 +425,7 @@ contract ERC7540Vault is Auth, IERC7540Vault { } /// @notice Ensures msg.sender can operate on behalf of controller. - function validateController(address controller) internal view { + function _validateController(address controller) internal view { require(controller == msg.sender || isOperator[controller][msg.sender], "ERC7540Vault/invalid-controller"); } } diff --git a/src/Escrow.sol b/src/Escrow.sol index 7cf60bde..9673c16b 100644 --- a/src/Escrow.sol +++ b/src/Escrow.sol @@ -10,10 +10,7 @@ import {SafeTransferLib} from "src/libraries/SafeTransferLib.sol"; /// @notice Escrow contract that holds tokens. /// Only wards can approve funds to be taken out. contract Escrow is Auth, IEscrow { - constructor(address deployer) { - wards[deployer] = 1; - emit Rely(deployer); - } + constructor(address deployer) Auth(deployer) {} // --- Token approvals --- /// @inheritdoc IEscrow diff --git a/src/InvestmentManager.sol b/src/InvestmentManager.sol index 22a66ea3..2ea0c9b2 100644 --- a/src/InvestmentManager.sol +++ b/src/InvestmentManager.sol @@ -32,14 +32,12 @@ contract InvestmentManager is Auth, IInvestmentManager { IGateway public gateway; IPoolManager public poolManager; + /// @inheritdoc IInvestmentManager mapping(address vault => mapping(address investor => InvestmentState)) public investments; - constructor(address root_, address escrow_) { + constructor(address root_, address escrow_) Auth(msg.sender) { root = root_; escrow = escrow_; - - wards[msg.sender] = 1; - emit Rely(msg.sender); } // --- Administration --- @@ -142,6 +140,7 @@ contract InvestmentManager is Auth, IInvestmentManager { IERC7540Vault _vault = IERC7540Vault(vault); InvestmentState storage state = investments[vault][controller]; + require(state.pendingDepositRequest > 0, "InvestmentManager/no-pending-deposit-request"); require(state.pendingCancelDepositRequest != true, "InvestmentManager/cancellation-is-pending"); state.pendingCancelDepositRequest = true; @@ -161,6 +160,7 @@ contract InvestmentManager is Auth, IInvestmentManager { function cancelRedeemRequest(address vault, address controller, address source) public auth { IERC7540Vault _vault = IERC7540Vault(vault); uint256 approximateTranchesPayout = pendingRedeemRequest(vault, controller); + require(approximateTranchesPayout > 0, "InvestmentManager/no-pending-redeem-request"); require( _canTransfer(vault, address(0), controller, approximateTranchesPayout), "InvestmentManager/transfer-not-allowed" @@ -254,7 +254,7 @@ contract InvestmentManager is Auth, IInvestmentManager { if (state.pendingDepositRequest == 0) delete state.pendingCancelDepositRequest; - // Mint to escrow. Recipient can claim by calling withdraw / redeem + // Mint to escrow. Recipient can claim by calling deposit / mint ITranche tranche = ITranche(IERC7540Vault(vault).share()); tranche.mint(address(escrow), shares); @@ -363,7 +363,9 @@ contract InvestmentManager is Auth, IInvestmentManager { "InvestmentManager/transfer-failed" ); } + emit TriggerRedeemRequest(poolId, trancheId, user, poolManager.idToAsset(assetId), shares); + IERC7540Vault(vault).onRedeemRequest(user, user, shares); } // --- View functions --- @@ -371,14 +373,14 @@ contract InvestmentManager is Auth, IInvestmentManager { function convertToShares(address vault, uint256 _assets) public view returns (uint256 shares) { IERC7540Vault vault_ = IERC7540Vault(vault); (uint128 latestPrice,) = poolManager.getTranchePrice(vault_.poolId(), vault_.trancheId(), vault_.asset()); - shares = uint256(_calculateShares(_assets.toUint128(), vault, latestPrice)); + shares = uint256(_calculateShares(_assets.toUint128(), vault, latestPrice, MathLib.Rounding.Down)); } /// @inheritdoc IInvestmentManager function convertToAssets(address vault, uint256 _shares) public view returns (uint256 assets) { IERC7540Vault vault_ = IERC7540Vault(vault); (uint128 latestPrice,) = poolManager.getTranchePrice(vault_.poolId(), vault_.trancheId(), vault_.asset()); - assets = uint256(_calculateAssets(_shares.toUint128(), vault, latestPrice)); + assets = uint256(_calculateAssets(_shares.toUint128(), vault, latestPrice, MathLib.Rounding.Down)); } /// @inheritdoc IInvestmentManager @@ -389,7 +391,7 @@ contract InvestmentManager is Auth, IInvestmentManager { function _maxDeposit(address vault, address user) internal view returns (uint128 assets) { InvestmentState memory state = investments[vault][user]; - assets = _calculateAssets(state.maxMint, vault, state.depositPrice); + assets = _calculateAssets(state.maxMint, vault, state.depositPrice, MathLib.Rounding.Down); } /// @inheritdoc IInvestmentManager @@ -406,7 +408,7 @@ contract InvestmentManager is Auth, IInvestmentManager { /// @inheritdoc IInvestmentManager function maxRedeem(address vault, address user) public view returns (uint256 shares) { InvestmentState memory state = investments[vault][user]; - shares = uint256(_calculateShares(state.maxWithdraw, vault, state.redeemPrice)); + shares = uint256(_calculateShares(state.maxWithdraw, vault, state.redeemPrice, MathLib.Rounding.Down)); } /// @inheritdoc IInvestmentManager @@ -452,10 +454,13 @@ contract InvestmentManager is Auth, IInvestmentManager { auth returns (uint256 shares) { + require(assets <= _maxDeposit(vault, controller), "InvestmentManager/exceeds-max-deposit"); + InvestmentState storage state = investments[vault][controller]; - uint128 shares_ = _calculateShares(assets.toUint128(), vault, state.depositPrice); - _processDeposit(state, shares_, vault, receiver); - shares = uint256(shares_); + uint128 sharesUp = _calculateShares(assets.toUint128(), vault, state.depositPrice, MathLib.Rounding.Up); + uint128 sharesDown = _calculateShares(assets.toUint128(), vault, state.depositPrice, MathLib.Rounding.Down); + _processDeposit(state, sharesUp, sharesDown, vault, receiver); + shares = uint256(sharesDown); } /// @inheritdoc IInvestmentManager @@ -465,18 +470,26 @@ contract InvestmentManager is Auth, IInvestmentManager { returns (uint256 assets) { InvestmentState storage state = investments[vault][controller]; - _processDeposit(state, shares.toUint128(), vault, receiver); - assets = uint256(_calculateAssets(shares.toUint128(), vault, state.depositPrice)); - } - - function _processDeposit(InvestmentState storage state, uint128 shares, address vault, address receiver) internal { - require(shares != 0, "InvestmentManager/tranche-token-amount-is-zero"); - require(shares <= state.maxMint, "InvestmentManager/exceeds-deposit-limits"); - state.maxMint = state.maxMint - shares; - require( - IERC20(IERC7540Vault(vault).share()).transferFrom(address(escrow), receiver, shares), - "InvestmentManager/tranche-tokens-transfer-failed" - ); + uint128 shares_ = shares.toUint128(); + _processDeposit(state, shares_, shares_, vault, receiver); + assets = uint256(_calculateAssets(shares_, vault, state.depositPrice, MathLib.Rounding.Down)); + } + + function _processDeposit( + InvestmentState storage state, + uint128 sharesUp, + uint128 sharesDown, + address vault, + address receiver + ) internal { + require(sharesUp <= state.maxMint, "InvestmentManager/exceeds-deposit-limits"); + state.maxMint = state.maxMint > sharesUp ? state.maxMint - sharesUp : 0; + if (sharesDown > 0) { + require( + IERC20(IERC7540Vault(vault).share()).transferFrom(address(escrow), receiver, sharesDown), + "InvestmentManager/tranche-tokens-transfer-failed" + ); + } } /// @inheritdoc IInvestmentManager @@ -485,10 +498,13 @@ contract InvestmentManager is Auth, IInvestmentManager { auth returns (uint256 assets) { + require(shares <= maxRedeem(vault, controller), "InvestmentManager/exceeds-max-redeem"); + InvestmentState storage state = investments[vault][controller]; - uint128 assets_ = _calculateAssets(shares.toUint128(), vault, state.redeemPrice); - _processRedeem(state, assets_, vault, receiver); - assets = uint256(assets_); + uint128 assetsUp = _calculateAssets(shares.toUint128(), vault, state.redeemPrice, MathLib.Rounding.Up); + uint128 assetsDown = _calculateAssets(shares.toUint128(), vault, state.redeemPrice, MathLib.Rounding.Down); + _processRedeem(state, assetsUp, assetsDown, vault, receiver); + assets = uint256(assetsDown); } /// @inheritdoc IInvestmentManager @@ -498,16 +514,22 @@ contract InvestmentManager is Auth, IInvestmentManager { returns (uint256 shares) { InvestmentState storage state = investments[vault][controller]; - _processRedeem(state, assets.toUint128(), vault, receiver); - shares = uint256(_calculateShares(assets.toUint128(), vault, state.redeemPrice)); - } - - function _processRedeem(InvestmentState storage state, uint128 assets, address vault, address receiver) internal { + uint128 assets_ = assets.toUint128(); + _processRedeem(state, assets_, assets_, vault, receiver); + shares = uint256(_calculateShares(assets_, vault, state.redeemPrice, MathLib.Rounding.Down)); + } + + function _processRedeem( + InvestmentState storage state, + uint128 assetsUp, + uint128 assetsDown, + address vault, + address receiver + ) internal { IERC7540Vault vault_ = IERC7540Vault(vault); - require(assets != 0, "InvestmentManager/asset-amount-is-zero"); - require(assets <= state.maxWithdraw, "InvestmentManager/exceeds-redeem-limits"); - state.maxWithdraw = state.maxWithdraw - assets; - SafeTransferLib.safeTransferFrom(vault_.asset(), address(escrow), receiver, assets); + require(assetsUp <= state.maxWithdraw, "InvestmentManager/exceeds-redeem-limits"); + state.maxWithdraw = state.maxWithdraw > assetsUp ? state.maxWithdraw - assetsUp : 0; + if (assetsDown > 0) SafeTransferLib.safeTransferFrom(vault_.asset(), address(escrow), receiver, assetsDown); } /// @inheritdoc IInvestmentManager @@ -519,7 +541,9 @@ contract InvestmentManager is Auth, IInvestmentManager { InvestmentState storage state = investments[vault][controller]; assets = state.claimableCancelDepositRequest; state.claimableCancelDepositRequest = 0; - SafeTransferLib.safeTransferFrom(IERC7540Vault(vault).asset(), address(escrow), receiver, assets); + if (assets > 0) { + SafeTransferLib.safeTransferFrom(IERC7540Vault(vault).asset(), address(escrow), receiver, assets); + } } /// @inheritdoc IInvestmentManager @@ -531,36 +555,46 @@ contract InvestmentManager is Auth, IInvestmentManager { InvestmentState storage state = investments[vault][controller]; shares = state.claimableCancelRedeemRequest; state.claimableCancelRedeemRequest = 0; - require( - IERC20(IERC7540Vault(vault).share()).transferFrom(address(escrow), receiver, shares), - "InvestmentManager/tranche-tokens-transfer-failed" - ); + if (shares > 0) { + require( + IERC20(IERC7540Vault(vault).share()).transferFrom(address(escrow), receiver, shares), + "InvestmentManager/tranche-tokens-transfer-failed" + ); + } } // --- Helpers --- /// @dev Calculates share amount based on asset amount and share price. Returned value is in share decimals. - function _calculateShares(uint128 assets, address vault, uint256 price) internal view returns (uint128 shares) { + function _calculateShares(uint128 assets, address vault, uint256 price, MathLib.Rounding rounding) + internal + view + returns (uint128 shares) + { if (price == 0 || assets == 0) { shares = 0; } else { (uint8 assetDecimals, uint8 shareDecimals) = _getPoolDecimals(vault); uint256 sharesInPriceDecimals = - _toPriceDecimals(assets, assetDecimals).mulDiv(10 ** PRICE_DECIMALS, price, MathLib.Rounding.Down); + _toPriceDecimals(assets, assetDecimals).mulDiv(10 ** PRICE_DECIMALS, price, rounding); shares = _fromPriceDecimals(sharesInPriceDecimals, shareDecimals); } } /// @dev Calculates asset amount based on share amount and share price. Returned value is in asset decimals. - function _calculateAssets(uint128 shares, address vault, uint256 price) internal view returns (uint128 assets) { + function _calculateAssets(uint128 shares, address vault, uint256 price, MathLib.Rounding rounding) + internal + view + returns (uint128 assets) + { if (price == 0 || shares == 0) { assets = 0; } else { (uint8 assetDecimals, uint8 shareDecimals) = _getPoolDecimals(vault); uint256 assetsInPriceDecimals = - _toPriceDecimals(shares, shareDecimals).mulDiv(price, 10 ** PRICE_DECIMALS, MathLib.Rounding.Down); + _toPriceDecimals(shares, shareDecimals).mulDiv(price, 10 ** PRICE_DECIMALS, rounding); assets = _fromPriceDecimals(assetsInPriceDecimals, assetDecimals); } diff --git a/src/PoolManager.sol b/src/PoolManager.sol index f3234175..5d68f1ef 100644 --- a/src/PoolManager.sol +++ b/src/PoolManager.sol @@ -2,7 +2,7 @@ pragma solidity 0.8.26; import {ERC7540VaultFactory} from "src/factories/ERC7540VaultFactory.sol"; -import {TrancheFactoryLike} from "src/factories/TrancheFactory.sol"; +import {ITrancheFactory} from "src/interfaces/factories/ITrancheFactory.sol"; import {ITranche} from "src/interfaces/token/ITranche.sol"; import {IHook} from "src/interfaces/token/IHook.sol"; import {IERC20Metadata, IERC20Wrapper} from "src/interfaces/IERC20.sol"; @@ -35,7 +35,7 @@ contract PoolManager is Auth, IPoolManager { using MathLib for uint256; using CastLib for *; - uint8 internal constant MIN_DECIMALS = 1; + uint8 internal constant MIN_DECIMALS = 2; uint8 internal constant MAX_DECIMALS = 18; IEscrow public immutable escrow; @@ -43,22 +43,22 @@ contract PoolManager is Auth, IPoolManager { IGateway public gateway; address public investmentManager; ERC7540VaultFactory public vaultFactory; - TrancheFactoryLike public trancheFactory; + ITrancheFactory public trancheFactory; IGasService public gasService; - mapping(uint64 poolId => Pool) public pools; - mapping(address => VaultAsset) public vaultToAsset; + mapping(uint64 poolId => Pool) internal _pools; + mapping(address => VaultAsset) internal _vaultToAsset; + mapping(uint64 poolId => mapping(bytes16 => UndeployedTranche)) internal _undeployedTranches; + + /// @inheritdoc IPoolManager mapping(uint128 assetId => address) public idToAsset; + /// @inheritdoc IPoolManager mapping(address => uint128 assetId) public assetToId; - mapping(uint64 poolId => mapping(bytes16 => UndeployedTranche)) public undeployedTranches; - constructor(address escrow_, address vaultFactory_, address trancheFactory_) { + constructor(address escrow_, address vaultFactory_, address trancheFactory_) Auth(msg.sender) { escrow = IEscrow(escrow_); vaultFactory = ERC7540VaultFactory(vaultFactory_); - trancheFactory = TrancheFactoryLike(trancheFactory_); - - wards[msg.sender] = 1; - emit Rely(msg.sender); + trancheFactory = ITrancheFactory(trancheFactory_); } // --- Administration --- @@ -66,7 +66,7 @@ contract PoolManager is Auth, IPoolManager { function file(bytes32 what, address data) external auth { if (what == "gateway") gateway = IGateway(data); else if (what == "investmentManager") investmentManager = data; - else if (what == "trancheFactory") trancheFactory = TrancheFactoryLike(data); + else if (what == "trancheFactory") trancheFactory = ITrancheFactory(data); else if (what == "vaultFactory") vaultFactory = ERC7540VaultFactory(data); else if (what == "gasService") gasService = IGasService(data); else revert("PoolManager/file-unrecognized-param"); @@ -103,7 +103,6 @@ contract PoolManager is Auth, IPoolManager { ) external { ITranche tranche = ITranche(getTranche(poolId, trancheId)); require(address(tranche) != address(0), "PoolManager/unknown-token"); - tranche.burn(msg.sender, amount); bytes9 domain = _formatDomain(destinationDomain, destinationId); gateway.send( @@ -170,7 +169,7 @@ contract PoolManager is Auth, IPoolManager { /// @inheritdoc IPoolManager function addPool(uint64 poolId) public auth { - Pool storage pool = pools[poolId]; + Pool storage pool = _pools[poolId]; require(pool.createdAt == 0, "PoolManager/pool-already-added"); pool.createdAt = block.timestamp; emit AddPool(poolId); @@ -178,25 +177,21 @@ contract PoolManager is Auth, IPoolManager { /// @inheritdoc IPoolManager function allowAsset(uint64 poolId, uint128 assetId) public auth { - Pool storage pool = pools[poolId]; - require(pool.createdAt != 0, "PoolManager/invalid-pool"); - + require(isPoolActive(poolId), "PoolManager/invalid-pool"); address asset = idToAsset[assetId]; require(asset != address(0), "PoolManager/unknown-asset"); - pools[poolId].allowedAssets[asset] = true; + _pools[poolId].allowedAssets[asset] = true; emit AllowAsset(poolId, asset); } /// @inheritdoc IPoolManager function disallowAsset(uint64 poolId, uint128 assetId) public auth { - Pool storage pool = pools[poolId]; - require(pool.createdAt != 0, "PoolManager/invalid-pool"); - + require(isPoolActive(poolId), "PoolManager/invalid-pool"); address asset = idToAsset[assetId]; require(asset != address(0), "PoolManager/unknown-asset"); - delete pools[poolId].allowedAssets[asset]; + delete _pools[poolId].allowedAssets[asset]; emit DisallowAsset(poolId, asset); } @@ -211,11 +206,9 @@ contract PoolManager is Auth, IPoolManager { ) public auth { require(decimals >= MIN_DECIMALS, "PoolManager/too-few-tranche-token-decimals"); require(decimals <= MAX_DECIMALS, "PoolManager/too-many-tranche-token-decimals"); + require(isPoolActive(poolId), "PoolManager/invalid-pool"); - Pool storage pool = pools[poolId]; - require(pool.createdAt != 0, "PoolManager/invalid-pool"); - - UndeployedTranche storage undeployedTranche = undeployedTranches[poolId][trancheId]; + UndeployedTranche storage undeployedTranche = _undeployedTranches[poolId][trancheId]; require(undeployedTranche.decimals == 0, "PoolManager/tranche-already-exists"); require(getTranche(poolId, trancheId) == address(0), "PoolManager/tranche-already-deployed"); @@ -256,8 +249,10 @@ contract PoolManager is Auth, IPoolManager { public auth { - TrancheDetails storage tranche = pools[poolId].tranches[trancheId]; - require(tranche.token != address(0), "PoolManager/tranche-does-not-exist"); + TrancheDetails storage tranche = _pools[poolId].tranches[trancheId]; + require( + tranche.token != address(0) || canTrancheBeDeployed(poolId, trancheId), "PoolManager/tranche-does-not-exist" + ); address asset = idToAsset[assetId]; require(computedAt >= tranche.prices[asset].computedAt, "PoolManager/cannot-set-older-price"); @@ -270,7 +265,9 @@ contract PoolManager is Auth, IPoolManager { function updateRestriction(uint64 poolId, bytes16 trancheId, bytes memory update) public auth { ITranche tranche = ITranche(getTranche(poolId, trancheId)); require(address(tranche) != address(0), "PoolManager/unknown-token"); - IHook(tranche.hook()).updateRestriction(address(tranche), update); + address hook = tranche.hook(); + require(hook != address(0), "PoolManager/invalid-hook"); + IHook(hook).updateRestriction(address(tranche), update); } /// @inheritdoc IPoolManager @@ -329,13 +326,13 @@ contract PoolManager is Auth, IPoolManager { // slither-disable-start reentrancy-eth /// @inheritdoc IPoolManager function deployTranche(uint64 poolId, bytes16 trancheId) external returns (address) { - UndeployedTranche storage undeployedTranche = undeployedTranches[poolId][trancheId]; - require(undeployedTranche.decimals != 0, "PoolManager/tranche-not-added"); + require(canTrancheBeDeployed(poolId, trancheId), "PoolManager/tranche-not-added"); address[] memory trancheWards = new address[](2); trancheWards[0] = investmentManager; trancheWards[1] = address(this); + UndeployedTranche storage undeployedTranche = _undeployedTranches[poolId][trancheId]; address token = trancheFactory.newTranche( poolId, trancheId, @@ -349,9 +346,9 @@ contract PoolManager is Auth, IPoolManager { ITranche(token).file("hook", undeployedTranche.hook); } - pools[poolId].tranches[trancheId].token = token; + _pools[poolId].tranches[trancheId].token = token; - delete undeployedTranches[poolId][trancheId]; + delete _undeployedTranches[poolId][trancheId]; // Give investment manager infinite approval for tranche tokens // in the escrow to transfer to the user on deposit or mint @@ -364,7 +361,7 @@ contract PoolManager is Auth, IPoolManager { /// @inheritdoc IPoolManager function deployVault(uint64 poolId, bytes16 trancheId, address asset) external returns (address) { - TrancheDetails storage tranche = pools[poolId].tranches[trancheId]; + TrancheDetails storage tranche = _pools[poolId].tranches[trancheId]; require(tranche.token != address(0), "PoolManager/tranche-does-not-exist"); require(isAllowedAsset(poolId, asset), "PoolManager/asset-not-supported"); @@ -382,9 +379,9 @@ contract PoolManager is Auth, IPoolManager { // Check whether the ERC20 token is a wrapper try IERC20Wrapper(asset).underlying() returns (address) { - vaultToAsset[vault] = VaultAsset(asset, true); + _vaultToAsset[vault] = VaultAsset(asset, true); } catch { - vaultToAsset[vault] = VaultAsset(asset, false); + _vaultToAsset[vault] = VaultAsset(asset, false); } // Link vault to tranche token @@ -397,8 +394,7 @@ contract PoolManager is Auth, IPoolManager { /// @inheritdoc IPoolManager function removeVault(uint64 poolId, bytes16 trancheId, address asset) external auth { - require(pools[poolId].createdAt != 0, "PoolManager/pool-does-not-exist"); - TrancheDetails storage tranche = pools[poolId].tranches[trancheId]; + TrancheDetails storage tranche = _pools[poolId].tranches[trancheId]; require(tranche.token != address(0), "PoolManager/tranche-does-not-exist"); address vault = ITranche(tranche.token).vault(asset); @@ -406,7 +402,7 @@ contract PoolManager is Auth, IPoolManager { vaultFactory.denyVault(vault, investmentManager); - delete vaultToAsset[vault]; + delete _vaultToAsset[vault]; IAuth(tranche.token).deny(vault); ITranche(tranche.token).updateVault(asset, address(0)); @@ -415,43 +411,58 @@ contract PoolManager is Auth, IPoolManager { } // --- Helpers --- + /// @inheritdoc IPoolManager + function isPoolActive(uint64 poolId) public view returns (bool) { + return _pools[poolId].createdAt > 0; + } + /// @inheritdoc IPoolManager function getTranche(uint64 poolId, bytes16 trancheId) public view returns (address) { - TrancheDetails storage tranche = pools[poolId].tranches[trancheId]; + TrancheDetails storage tranche = _pools[poolId].tranches[trancheId]; return tranche.token; } + /// @inheritdoc IPoolManager + function canTrancheBeDeployed(uint64 poolId, bytes16 trancheId) public view returns (bool) { + return _undeployedTranches[poolId][trancheId].decimals > 0; + } + /// @inheritdoc IPoolManager function getTranchePrice(uint64 poolId, bytes16 trancheId, address asset) public view returns (uint128 price, uint64 computedAt) { - TranchePrice memory value = pools[poolId].tranches[trancheId].prices[asset]; + TranchePrice memory value = _pools[poolId].tranches[trancheId].prices[asset]; + require(value.computedAt > 0, "PoolManager/unknown-price"); price = value.price; computedAt = value.computedAt; } /// @inheritdoc IPoolManager function getVault(uint64 poolId, bytes16 trancheId, uint128 assetId) public view returns (address) { - return ITranche(pools[poolId].tranches[trancheId].token).vault(idToAsset[assetId]); + address vault = ITranche(_pools[poolId].tranches[trancheId].token).vault(idToAsset[assetId]); + require(vault != address(0), "PoolManager/unknown-vault"); + return vault; } /// @inheritdoc IPoolManager function getVault(uint64 poolId, bytes16 trancheId, address asset) public view returns (address) { - return ITranche(pools[poolId].tranches[trancheId].token).vault(asset); + address vault = ITranche(_pools[poolId].tranches[trancheId].token).vault(asset); + require(vault != address(0), "PoolManager/unknown-vault"); + return vault; } /// @inheritdoc IPoolManager function getVaultAsset(address vault) public view override returns (address, bool) { - VaultAsset memory _asset = vaultToAsset[vault]; + VaultAsset memory _asset = _vaultToAsset[vault]; require(_asset.asset != address(0), "PoolManager/unknown-vault"); return (_asset.asset, _asset.isWrapper); } /// @inheritdoc IPoolManager function isAllowedAsset(uint64 poolId, address asset) public view returns (bool) { - return pools[poolId].allowedAssets[asset]; + return _pools[poolId].allowedAssets[asset]; } function _formatDomain(Domain domain, uint64 chainId) internal pure returns (bytes9) { diff --git a/src/Root.sol b/src/Root.sol index 0b6169a6..2b5882ae 100644 --- a/src/Root.sol +++ b/src/Root.sol @@ -19,24 +19,20 @@ contract Root is Auth, IRoot { address public immutable escrow; - /// @notice Trusted contracts within the system - mapping(address => uint256) public endorsements; - /// @inheritdoc IRoot bool public paused; /// @inheritdoc IRoot uint256 public delay; /// @inheritdoc IRoot + mapping(address => uint256) public endorsements; + /// @inheritdoc IRoot mapping(address relyTarget => uint256 timestamp) public schedule; - constructor(address _escrow, uint256 _delay, address deployer) { + constructor(address _escrow, uint256 _delay, address deployer) Auth(deployer) { require(_delay <= MAX_DELAY, "Root/delay-too-long"); escrow = _escrow; delay = _delay; - - wards[deployer] = 1; - emit Rely(deployer); } // --- Administration --- diff --git a/src/admin/Guardian.sol b/src/admin/Guardian.sol index 6ec0c363..28a3848d 100644 --- a/src/admin/Guardian.sol +++ b/src/admin/Guardian.sol @@ -5,18 +5,18 @@ import {Root} from "src/Root.sol"; import {IGuardian} from "src/interfaces/IGuardian.sol"; import {IGateway} from "src/interfaces/gateway/IGateway.sol"; -interface SafeLike { +interface ISafe { function isOwner(address signer) external view returns (bool); } contract Guardian is IGuardian { Root public immutable root; - SafeLike public immutable safe; + ISafe public immutable safe; IGateway public immutable gateway; constructor(address safe_, address root_, address gateway_) { root = Root(root_); - safe = SafeLike(safe_); + safe = ISafe(safe_); gateway = IGateway(gateway_); } diff --git a/src/factories/ERC7540VaultFactory.sol b/src/factories/ERC7540VaultFactory.sol index 3ff91c68..ac3afcf5 100644 --- a/src/factories/ERC7540VaultFactory.sol +++ b/src/factories/ERC7540VaultFactory.sol @@ -2,38 +2,19 @@ pragma solidity 0.8.26; import {ERC7540Vault} from "src/ERC7540Vault.sol"; +import {IERC7540VaultFactory} from "src/interfaces/factories/IERC7540VaultFactory.sol"; import {Auth} from "src/Auth.sol"; -interface ERC7540VaultFactoryLike { - function newVault( - uint64 poolId, - bytes16 trancheId, - address asset, - address tranche, - address escrow, - address investmentManager, - address[] calldata wards_ - ) external returns (address); - function denyVault(address vault, address investmentManager) external; -} - -interface AuthLike { - function rely(address) external; - function deny(address) external; -} - /// @title ERC7540 Vault Factory /// @dev Utility for deploying new vault contracts -contract ERC7540VaultFactory is Auth, ERC7540VaultFactoryLike { +contract ERC7540VaultFactory is Auth, IERC7540VaultFactory { address public immutable root; - constructor(address _root) { + constructor(address _root) Auth(msg.sender) { root = _root; - - wards[msg.sender] = 1; - emit Rely(msg.sender); } + /// @inheritdoc IERC7540VaultFactory function newVault( uint64 poolId, bytes16 trancheId, @@ -46,16 +27,18 @@ contract ERC7540VaultFactory is Auth, ERC7540VaultFactoryLike { ERC7540Vault vault = new ERC7540Vault(poolId, trancheId, asset, tranche, root, escrow, investmentManager); vault.rely(root); - for (uint256 i = 0; i < wards_.length; i++) { + uint256 wardsCount = wards_.length; + for (uint256 i; i < wardsCount; i++) { vault.rely(wards_[i]); } - AuthLike(investmentManager).rely(address(vault)); + Auth(investmentManager).rely(address(vault)); vault.deny(address(this)); return address(vault); } + /// @inheritdoc IERC7540VaultFactory function denyVault(address vault, address investmentManager) public auth { - AuthLike(investmentManager).deny(address(vault)); + Auth(investmentManager).deny(address(vault)); } } diff --git a/src/factories/TrancheFactory.sol b/src/factories/TrancheFactory.sol index 0a91164a..b997b392 100644 --- a/src/factories/TrancheFactory.sol +++ b/src/factories/TrancheFactory.sol @@ -2,32 +2,21 @@ pragma solidity 0.8.26; import {Tranche} from "src/token/Tranche.sol"; +import {ITrancheFactory} from "src/interfaces/factories/ITrancheFactory.sol"; import {Auth} from "src/Auth.sol"; -interface TrancheFactoryLike { - function newTranche( - uint64 poolId, - bytes16 trancheId, - string memory name, - string memory symbol, - uint8 decimals, - address[] calldata restrictionManagerWards - ) external returns (address); -} - /// @title Tranche Token Factory /// @dev Utility for deploying new tranche token contracts /// Ensures the addresses are deployed at a deterministic address /// based on the pool id and tranche id. -contract TrancheFactory is Auth, TrancheFactoryLike { +contract TrancheFactory is Auth, ITrancheFactory { address public immutable root; - constructor(address _root, address deployer) { + constructor(address _root, address deployer) Auth(deployer) { root = _root; - wards[deployer] = 1; - emit Rely(deployer); } + /// @inheritdoc ITrancheFactory function newTranche( uint64 poolId, bytes16 trancheId, @@ -46,11 +35,26 @@ contract TrancheFactory is Auth, TrancheFactoryLike { token.file("symbol", symbol); token.rely(root); - for (uint256 i = 0; i < trancheWards.length; i++) { + uint256 wardsCount = trancheWards.length; + for (uint256 i; i < wardsCount; i++) { token.rely(trancheWards[i]); } token.deny(address(this)); return address(token); } + + /// @inheritdoc ITrancheFactory + function getAddress(uint64 poolId, bytes16 trancheId, uint8 decimals) external view returns (address) { + bytes32 hash = keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + keccak256(abi.encodePacked(poolId, trancheId)), + keccak256(abi.encodePacked(type(Tranche).creationCode, abi.encode(decimals))) + ) + ); + + return address(uint160(uint256(hash))); + } } diff --git a/src/factories/TransferProxyFactory.sol b/src/factories/TransferProxyFactory.sol index f05288eb..8041e6b9 100644 --- a/src/factories/TransferProxyFactory.sol +++ b/src/factories/TransferProxyFactory.sol @@ -1,50 +1,106 @@ // SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.26; +import {Auth} from "src/Auth.sol"; +import {IERC20} from "src/interfaces/IERC20.sol"; +import {MathLib} from "src/libraries/MathLib.sol"; +import {IRecoverable} from "src/interfaces/IRoot.sol"; import {IPoolManager} from "src/interfaces/IPoolManager.sol"; +import {SafeTransferLib} from "src/libraries/SafeTransferLib.sol"; import {ITransferProxy, ITransferProxyFactory} from "src/interfaces/factories/ITransferProxy.sol"; -contract TransferProxy is ITransferProxy { - IPoolManager public immutable poolManager; +contract TransferProxy is Auth, ITransferProxy { + using MathLib for uint256; + bytes32 public immutable destination; - constructor(address poolManager_, bytes32 destination_) { - poolManager = IPoolManager(poolManager_); + IPoolManager public poolManager; + + constructor(bytes32 destination_) Auth(msg.sender) { destination = destination_; } + // --- Administration --- /// @inheritdoc ITransferProxy - function transfer(address asset, uint128 amount) external { - poolManager.transferAssets(asset, destination, amount); + function file(bytes32 what, address data) external auth { + if (what == "poolManager") poolManager = IPoolManager(data); + else revert("TransferProxy/file-unrecognized-param"); + emit File(what, data); + } + + /// @inheritdoc IRecoverable + function recoverTokens(address token, address to, uint256 amount) external auth { + SafeTransferLib.safeTransfer(token, to, amount); } -} -interface TransferProxyFactoryLike { - function newTransferProxy(address poolManager, bytes32 destination) external returns (address); + // --- Transfers --- + /// @inheritdoc ITransferProxy + function transfer(address token) external { + uint128 amount = IERC20(token).balanceOf(address(this)).toUint128(); + + address poolManager_ = address(poolManager); + if (IERC20(token).allowance(address(this), poolManager_) == 0) { + SafeTransferLib.safeApprove(token, poolManager_, type(uint256).max); + } + + IPoolManager(poolManager_).transferAssets(token, destination, amount); + } } /// @title Restricted Transfer Proxy Factory /// @dev Utility for deploying contracts that have a fixed destination for transfers /// Users can send tokens to the TransferProxy, from a service that only supports /// ERC20 transfers and not full contract calls. -contract TransferProxyFactory is ITransferProxyFactory { - address public immutable poolManager; +contract TransferProxyFactory is Auth, ITransferProxyFactory { + address public immutable root; + + address public poolManager; /// @inheritdoc ITransferProxyFactory mapping(bytes32 id => address proxy) public proxies; - constructor(address poolManager_) { - poolManager = poolManager_; + constructor(address root_, address deployer) Auth(deployer) { + root = root_; } + // --- Administration --- + /// @inheritdoc ITransferProxyFactory + function file(bytes32 what, address data) external auth { + if (what == "poolManager") poolManager = data; + else revert("TransferProxyFactory/file-unrecognized-param"); + emit File(what, data); + } + + // --- Deployment --- /// @inheritdoc ITransferProxyFactory function newTransferProxy(bytes32 destination) external returns (address) { require(proxies[destination] == address(0), "TransferProxyFactory/already-deployed"); - address proxy = address(new TransferProxy(poolManager, destination)); - proxies[destination] = proxy; + // Salt is the destination, so every transfer proxy on every chain has the same address + TransferProxy proxy = new TransferProxy{salt: destination}(destination); + proxy.file("poolManager", poolManager); + + proxy.rely(root); + proxy.deny(address(this)); + + proxies[destination] = address(proxy); + + emit DeployTransferProxy(destination, address(proxy)); + return address(proxy); + } + + // --- View methods --- + /// @inheritdoc ITransferProxyFactory + function getAddress(bytes32 destination) external view returns (address) { + bytes32 hash = keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + destination, + keccak256(abi.encodePacked(type(TransferProxy).creationCode, abi.encode(destination))) + ) + ); - emit DeployTransferProxy(destination, proxy); - return proxy; + return address(uint160(uint256(hash))); } } diff --git a/src/gateway/GasService.sol b/src/gateway/GasService.sol index 4712d312..2b4c9a05 100644 --- a/src/gateway/GasService.sol +++ b/src/gateway/GasService.sol @@ -30,15 +30,12 @@ contract GasService is IGasService, Auth { /// @inheritdoc IGasService uint256 public tokenPrice; - constructor(uint64 messageCost_, uint64 proofCost_, uint128 gasPrice_, uint256 tokenPrice_) { + constructor(uint64 messageCost_, uint64 proofCost_, uint128 gasPrice_, uint256 tokenPrice_) Auth(msg.sender) { messageCost = messageCost_; proofCost = proofCost_; gasPrice = gasPrice_; tokenPrice = tokenPrice_; lastUpdatedAt = uint64(block.timestamp); - - wards[msg.sender] = 1; - emit Rely(msg.sender); } /// @inheritdoc IGasService diff --git a/src/gateway/Gateway.sol b/src/gateway/Gateway.sol index dec33cbc..ea0039d4 100644 --- a/src/gateway/Gateway.sol +++ b/src/gateway/Gateway.sol @@ -4,6 +4,7 @@ pragma solidity 0.8.26; import {Auth} from "src/Auth.sol"; import {ArrayLib} from "src/libraries/ArrayLib.sol"; import {BytesLib} from "src/libraries/BytesLib.sol"; +import {MathLib} from "src/libraries/MathLib.sol"; import {MessagesLib} from "src/libraries/MessagesLib.sol"; import {SafeTransferLib} from "src/libraries/SafeTransferLib.sol"; import {TransientStorage} from "src/libraries/TransientStorage.sol"; @@ -22,9 +23,10 @@ import {IRecoverable} from "src/interfaces/IRoot.sol"; contract Gateway is Auth, IGateway, IRecoverable { using ArrayLib for uint16[8]; using BytesLib for bytes; + using MathLib for uint256; using TransientStorage for bytes32; - bytes32 public constant QUOTA_SLOT = bytes32(uint256(keccak256("quota")) - 1); + bytes32 public constant QUOTA_SLOT = bytes32(uint256(keccak256("Centrifuge/quota")) - 1); uint8 public constant MAX_ADAPTER_COUNT = 8; uint8 public constant PRIMARY_ADAPTER_ID = 1; @@ -36,20 +38,25 @@ contract Gateway is Auth, IGateway, IRecoverable { address public investmentManager; IGasService public gasService; + mapping(bytes32 messageHash => Message) internal _messages; + mapping(address adapter => Adapter) internal _activeAdapters; + + /// @inheritdoc IGateway address[] public adapters; - mapping(address adapter => Adapter) public activeAdapters; - mapping(bytes32 messageHash => Message) public messages; - mapping(uint8 messageId => address manager) messageHandlers; - mapping(address router => mapping(bytes32 messageHash => uint256 timestamp)) public recoveries; + /// @inheritdoc IGateway + mapping(address payer => bool) public payers; + /// @inheritdoc IGateway + mapping(uint8 messageId => address) public messageHandlers; + /// @inheritdoc IGateway + mapping(address adapter => mapping(bytes32 messageHash => uint256 timestamp)) public recoveries; - constructor(address root_, address poolManager_, address investmentManager_, address gasService_) { + constructor(address root_, address poolManager_, address investmentManager_, address gasService_) + Auth(msg.sender) + { root = IRoot(root_); poolManager = poolManager_; investmentManager = investmentManager_; gasService = IGasService(gasService_); - - wards[msg.sender] = 1; - emit Rely(msg.sender); } modifier pauseable() { @@ -58,35 +65,32 @@ contract Gateway is Auth, IGateway, IRecoverable { } receive() external payable { - emit Received(msg.sender, msg.value); + emit ReceiveNativeTokens(msg.sender, msg.value); } // --- Administration --- /// @inheritdoc IGateway function file(bytes32 what, address[] calldata addresses) external auth { if (what == "adapters") { - uint8 quorum_ = uint8(addresses.length); + uint8 quorum_ = addresses.length.toUint8(); require(quorum_ != 0, "Gateway/empty-adapter-set"); require(quorum_ <= MAX_ADAPTER_COUNT, "Gateway/exceeds-max"); - uint64 sessionId = 0; - uint8 numAdapters = uint8(adapters.length); - if (numAdapters != 0) { - // Increment session id if it is not the initial adapter setup and the quorum was decreased - Adapter memory prevAdapter = activeAdapters[adapters[0]]; - sessionId = quorum_ < prevAdapter.quorum ? prevAdapter.activeSessionId + 1 : prevAdapter.activeSessionId; - } + // Increment session id to reset pending votes + uint256 numAdapters = adapters.length; + uint64 sessionId = numAdapters > 0 ? _activeAdapters[adapters[0]].activeSessionId + 1 : 0; + // Disable old adapters - for (uint8 i = 0; i < numAdapters; i++) { - delete activeAdapters[adapters[i]]; + for (uint8 i; i < numAdapters; i++) { + delete _activeAdapters[adapters[i]]; } // Enable new adapters, setting quorum to number of adapters for (uint8 j; j < quorum_; j++) { - require(activeAdapters[addresses[j]].id == 0, "Gateway/no-duplicates-allowed"); + require(_activeAdapters[addresses[j]].id == 0, "Gateway/no-duplicates-allowed"); // Ids are assigned sequentially starting at 1 - activeAdapters[addresses[j]] = Adapter(j + 1, quorum_, sessionId); + _activeAdapters[addresses[j]] = Adapter(j + 1, quorum_, sessionId); } adapters = addresses; @@ -109,15 +113,27 @@ contract Gateway is Auth, IGateway, IRecoverable { /// @inheritdoc IGateway function file(bytes32 what, uint8 data1, address data2) public auth { - if (what == "message") messageHandlers[data1] = data2; - else revert("Gateway/file-unrecognized-param"); + if (what == "message") { + require(data1 > uint8(type(MessagesLib.Call).max), "Gateway/hardcoded-message-id"); + messageHandlers[data1] = data2; + } else { + revert("Gateway/file-unrecognized-param"); + } emit File(what, data1, data2); } + /// @inheritdoc IGateway + function file(bytes32 what, address payer, bool isAllowed) external auth { + if (what == "payers") payers[payer] = isAllowed; + else revert("Gateway/file-unrecognized-param"); + + emit File(what, payer, isAllowed); + } + /// @inheritdoc IRecoverable function recoverTokens(address token, address receiver, uint256 amount) external auth { if (token == address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)) { - payable(receiver).transfer(amount); + SafeTransferLib.safeTransferETH(receiver, amount); } else { SafeTransferLib.safeTransfer(token, receiver, amount); } @@ -130,7 +146,7 @@ contract Gateway is Auth, IGateway, IRecoverable { } function _handle(bytes calldata payload, address adapter_, bool isRecovery) internal { - Adapter memory adapter = activeAdapters[adapter_]; + Adapter memory adapter = _activeAdapters[adapter_]; require(adapter.id != 0, "Gateway/invalid-adapter"); uint8 call = payload.toUint8(0); if ( @@ -155,14 +171,14 @@ contract Gateway is Auth, IGateway, IRecoverable { if (isMessageProof) { require(isRecovery || adapter.id != PRIMARY_ADAPTER_ID, "Gateway/non-proof-adapter"); messageHash = payload.toBytes32(1); - emit HandleProof(messageHash, adapter_); + emit ProcessProof(messageHash, adapter_); } else { require(isRecovery || adapter.id == PRIMARY_ADAPTER_ID, "Gateway/non-message-adapter"); messageHash = keccak256(payload); - emit HandleMessage(payload, adapter_); + emit ProcessMessage(payload, adapter_); } - Message storage state = messages[messageHash]; + Message storage state = _messages[messageHash]; if (adapter.activeSessionId != state.sessionId) { // Clear votes from previous session @@ -180,16 +196,16 @@ contract Gateway is Auth, IGateway, IRecoverable { // Handle message if (isMessageProof) { _dispatch(state.pendingMessage, false); + emit ExecuteMessage(state.pendingMessage, adapter_); } else { _dispatch(payload, false); + emit ExecuteMessage(payload, adapter_); } // Only if there are no more pending messages, remove the pending message if (state.votes.isEmpty()) { delete state.pendingMessage; } - - emit ExecuteMessage(payload, msg.sender); } else if (!isMessageProof) { state.pendingMessage = payload; } @@ -202,19 +218,22 @@ contract Gateway is Auth, IGateway, IRecoverable { if (id == 4) { // Handle batch messages require(!isBatched, "Gateway/no-recursive-batching-allowed"); - uint256 offset = 1; - while (offset < message.length) { - // Each message in the batch is prefixed with - // the message length (uint16: 2 bytes) - uint16 length = message.toUint16(offset); - bytes memory subMessage = new bytes(length); - offset = offset + 2; // Skip length - for (uint256 i = 0; i < length; i++) { + uint256 offset = 1; // Offsets the message type which is 1 byte + uint256 messageLength = message.length; + + // Check if the message actually contains 2 bytes dedicated for the subMessage length + while (offset + 2 <= messageLength) { + uint16 subMessageLength = message.toUint16(offset); + bytes memory subMessage = new bytes(subMessageLength); + offset = offset + 2; // Skip subMessage length + + require(offset + subMessageLength <= messageLength, "Gateway/corrupted-message"); + for (uint256 i; i < subMessageLength; i++) { subMessage[i] = message[offset + i]; } _dispatch(subMessage, true); - offset += length; + offset += subMessageLength; } return; } else if (id >= 5 && id <= 7) { @@ -240,8 +259,7 @@ contract Gateway is Auth, IGateway, IRecoverable { address adapter = payload.toAddress(33); if (MessagesLib.messageType(payload) == MessagesLib.Call.InitiateMessageRecovery) { - require(activeAdapters[msg.sender].id != 0, "Gateway/invalid-sender"); - require(activeAdapters[adapter].id != 0, "Gateway/invalid-adapter"); + require(_activeAdapters[adapter].id != 0, "Gateway/invalid-adapter"); recoveries[adapter][messageHash] = block.timestamp + RECOVERY_CHALLENGE_PERIOD; emit InitiateMessageRecovery(messageHash, adapter); } else if (MessagesLib.messageType(payload) == MessagesLib.Call.DisputeMessageRecovery) { @@ -305,7 +323,6 @@ contract Gateway is Auth, IGateway, IRecoverable { } QUOTA_SLOT.tstore(0); } else if (gasService.shouldRefuel(source, message)) { - uint256 tank = address(this).balance; for (uint256 i; i < numAdapters; i++) { IAdapter currentAdapter = IAdapter(adapters[i]); bool isPrimaryAdapter = i == PRIMARY_ADAPTER_ID - 1; @@ -313,8 +330,7 @@ contract Gateway is Auth, IGateway, IRecoverable { uint256 consumed = currentAdapter.estimate(payload, isPrimaryAdapter ? messageCost : proofCost); - if (consumed <= tank) { - tank -= consumed; + if (consumed <= address(this).balance) { currentAdapter.pay{value: consumed}(payload, address(this)); } @@ -329,42 +345,43 @@ contract Gateway is Auth, IGateway, IRecoverable { /// @inheritdoc IGateway function topUp() external payable { - require(IRoot(root).endorsed(msg.sender), "Gateway/only-endorsed-can-topup"); + require(payers[msg.sender], "Gateway/only-payers-can-top-up"); require(msg.value != 0, "Gateway/cannot-topup-with-nothing"); QUOTA_SLOT.tstore(msg.value); } // --- Helpers --- /// @inheritdoc IGateway - function estimate(bytes calldata payload) external view returns (uint256[] memory tranches, uint256 total) { + function estimate(bytes calldata payload) external view returns (uint256[] memory perAdapter, uint256 total) { bytes memory proof = abi.encodePacked(uint8(MessagesLib.Call.MessageProof), keccak256(payload)); - uint256 proofCost = gasService.estimate(payload); - uint256 messageCost = gasService.estimate(proof); - tranches = new uint256[](adapters.length); + uint256 messageCost = gasService.estimate(payload); + uint256 proofCost = gasService.estimate(proof); + perAdapter = new uint256[](adapters.length); - for (uint256 i; i < adapters.length; i++) { + uint256 adaptersCount = adapters.length; + for (uint256 i; i < adaptersCount; i++) { uint256 centrifugeCost = i == PRIMARY_ADAPTER_ID - 1 ? messageCost : proofCost; bytes memory message = i == PRIMARY_ADAPTER_ID - 1 ? payload : proof; uint256 estimated = IAdapter(adapters[i]).estimate(message, centrifugeCost); - tranches[i] = estimated; + perAdapter[i] = estimated; total += estimated; } } /// @inheritdoc IGateway function quorum() external view returns (uint8) { - Adapter memory adapter = activeAdapters[adapters[0]]; + Adapter memory adapter = _activeAdapters[adapters[0]]; return adapter.quorum; } /// @inheritdoc IGateway function activeSessionId() external view returns (uint64) { - Adapter memory adapter = activeAdapters[adapters[0]]; + Adapter memory adapter = _activeAdapters[adapters[0]]; return adapter.activeSessionId; } /// @inheritdoc IGateway - function votes(bytes32 messageHash) external view returns (uint16[8] memory) { - return messages[messageHash].votes; + function votes(bytes32 messageHash) external view returns (uint16[MAX_ADAPTER_COUNT] memory) { + return _messages[messageHash].votes; } } diff --git a/src/gateway/adapters/axelar/Adapter.sol b/src/gateway/adapters/axelar/Adapter.sol index 8f234e17..4641a100 100644 --- a/src/gateway/adapters/axelar/Adapter.sol +++ b/src/gateway/adapters/axelar/Adapter.sol @@ -1,33 +1,16 @@ // SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.26; -import {IAxelarAdapter, IAdapter} from "src/interfaces/gateway/adapters/IAxelarAdapter.sol"; +import { + IAxelarAdapter, + IAdapter, + IAxelarGateway, + IAxelarGasService +} from "src/interfaces/gateway/adapters/IAxelarAdapter.sol"; import {IGateway} from "src/interfaces/gateway/IGateway.sol"; import {Auth} from "src/Auth.sol"; import {IGateway} from "src/interfaces/gateway/IGateway.sol"; -interface AxelarGatewayLike { - function callContract(string calldata destinationChain, string calldata contractAddress, bytes calldata payload) - external; - - function validateContractCall( - bytes32 commandId, - string calldata sourceChain, - string calldata sourceAddress, - bytes32 payloadHash - ) external returns (bool); -} - -interface AxelarGasServiceLike { - function payNativeGasForContractCall( - address sender, - string calldata destinationChain, - string calldata destinationAddress, - bytes calldata payload, - address refundAddress - ) external payable; -} - /// @title Axelar Adapter /// @notice Routing contract that integrates with an Axelar Gateway contract AxelarAdapter is Auth, IAxelarAdapter { @@ -37,22 +20,19 @@ contract AxelarAdapter is Auth, IAxelarAdapter { IGateway public immutable gateway; bytes32 public immutable centrifugeIdHash; bytes32 public immutable centrifugeAddressHash; - AxelarGatewayLike public immutable axelarGateway; - AxelarGasServiceLike public immutable axelarGasService; + IAxelarGateway public immutable axelarGateway; + IAxelarGasService public immutable axelarGasService; /// @inheritdoc IAxelarAdapter uint256 public axelarCost = 58_039_058_122_843; - constructor(address gateway_, address axelarGateway_, address axelarGasService_) { + constructor(address gateway_, address axelarGateway_, address axelarGasService_) Auth(msg.sender) { gateway = IGateway(gateway_); - axelarGateway = AxelarGatewayLike(axelarGateway_); - axelarGasService = AxelarGasServiceLike(axelarGasService_); + axelarGateway = IAxelarGateway(axelarGateway_); + axelarGasService = IAxelarGasService(axelarGasService_); centrifugeIdHash = keccak256(bytes(CENTRIFUGE_ID)); centrifugeAddressHash = keccak256(bytes("0x7369626CEF070000000000000000000000000000")); - - wards[msg.sender] = 1; - emit Rely(msg.sender); } // --- Administrative --- diff --git a/src/gateway/adapters/axelar/Forwarder.sol b/src/gateway/adapters/axelar/Forwarder.sol index 7e54f4a4..482b58fb 100644 --- a/src/gateway/adapters/axelar/Forwarder.sol +++ b/src/gateway/adapters/axelar/Forwarder.sol @@ -2,16 +2,8 @@ pragma solidity 0.8.26; import {Auth} from "src/Auth.sol"; -import {AxelarGatewayLike} from "src/gateway/adapters/axelar/Adapter.sol"; - -interface PrecompileLike { - function execute( - bytes32 commandId, - string calldata sourceChain, - string calldata sourceAddress, - bytes calldata payload - ) external; -} +import {IAxelarGateway} from "src/gateway/adapters/axelar/Adapter.sol"; +import {IPrecompile} from "src/interfaces/misc/IPrecompile.sol"; // A contract to be deployed on Centrifuge-EVM in order to forward axelar tx to // the precompile. @@ -20,23 +12,20 @@ contract AxelarForwarder is Auth { // 0x0000000000000000000000000000000000000800 in hex. address internal constant PRECOMPILE = 0x0000000000000000000000000000000000000800; - AxelarGatewayLike public axelarGateway; + IAxelarGateway public axelarGateway; // --- Events --- event File(bytes32 indexed what, address data); event Forwarded(bytes32 commandId, string sourceChain, string sourceAddress, bytes payload); - constructor(address axelarGateway_) { - axelarGateway = AxelarGatewayLike(axelarGateway_); - - wards[msg.sender] = 1; - emit Rely(msg.sender); + constructor(address axelarGateway_) Auth(msg.sender) { + axelarGateway = IAxelarGateway(axelarGateway_); } // --- Administration --- function file(bytes32 what, address data) external auth { if (what == "axelarGateway") { - axelarGateway = AxelarGatewayLike(data); + axelarGateway = IAxelarGateway(data); } else { revert("AxelarForwarder/file-unrecognized-param"); } @@ -56,7 +45,7 @@ contract AxelarForwarder is Auth { "AxelarForwarder/not-approved-by-gateway" ); - PrecompileLike precompile = PrecompileLike(PRECOMPILE); + IPrecompile precompile = IPrecompile(PRECOMPILE); precompile.execute(commandId, sourceChain, sourceAddress, payload); emit Forwarded(commandId, sourceChain, sourceAddress, payload); diff --git a/src/interfaces/IAuth.sol b/src/interfaces/IAuth.sol index d8dec218..a1e6e02a 100644 --- a/src/interfaces/IAuth.sol +++ b/src/interfaces/IAuth.sol @@ -5,6 +5,9 @@ interface IAuth { event Rely(address indexed user); event Deny(address indexed user); + /// @notice Returns whether the target is a ward (has admin access) + function wards(address target) external view returns (uint256); + /// @notice Make user a ward (give them admin access) function rely(address user) external; diff --git a/src/interfaces/ICentrifugeRouter.sol b/src/interfaces/ICentrifugeRouter.sol index 054731d8..50c982da 100644 --- a/src/interfaces/ICentrifugeRouter.sol +++ b/src/interfaces/ICentrifugeRouter.sol @@ -16,6 +16,16 @@ interface ICentrifugeRouter is IRecoverable { /// @dev This is a getter method function lockedRequests(address controller, address vault) external view returns (uint256 amount); + // --- Manage permissionless claiming --- + /// @notice Enable permissionless claiming + /// @dev After this is called, anyone can claim tokens to msg.sender. + /// Even any requests submitted directly to the vault (not through the CentrifugeRouter) will be + /// permissionlessly claimable through the CentrifugeRouter, until `disable()` is called. + function enable(address vault) external; + + /// @notice Disable permissionless claiming + function disable(address vault) external; + // --- Deposit --- /// @notice Check `IERC7540Deposit.requestDeposit`. /// @dev This adds a mandatory prepayment for all the costs that will incur during the transaction. @@ -63,11 +73,13 @@ interface ICentrifugeRouter is IRecoverable { /// @notice Helper method to lock a deposit request, and enable permissionless claiming of that vault in 1 call. /// @dev It starts interaction with the vault by calling `open`. - /// If `vault`'s underlying asset is a wrapped one, there is a `wrap` message call on the deposited asset - /// beforehand. + /// Vaults support assets that are wrapped one. When user calls this method + /// and the vault's asset is a wrapped one, first the balance of the wrapped asset is checked. + /// If balance >= `amount`, then this asset is used + /// else amount is treat as an underlying asset one and it is wrapped. /// @param vault Address of the vault /// @param amount Amount to be deposited - function openLockDepositRequest(address vault, uint256 amount) external payable; + function enableLockDepositRequest(address vault, uint256 amount) external payable; /// @notice Unlocks all deposited assets of the current caller for a given vault /// @@ -127,13 +139,6 @@ interface ICentrifugeRouter is IRecoverable { /// @param controller Check IERC7575.withdraw.owner function claimRedeem(address vault, address receiver, address controller) external payable; - // --- Manage permissionless claiming --- - /// @notice Allow permissionless claiming - function open(address vault) external; - - /// @notice Disallow permissionless claiming - function close(address vault) external; - /// @notice Check `IERC7540CancelRedeem.cancelRedeemRequest`. /// @dev This adds a mandatory prepayment for all the costs that will incur during the transaction. /// The caller must call `CentrifugeRouter.estimate` to get estimates how much the deposit will cost. @@ -164,6 +169,9 @@ interface ICentrifugeRouter is IRecoverable { /// @dev the recipient address is padded to 32 bytes internally function transferAssets(address asset, address recipient, uint128 amount, uint256 topUpAmount) external payable; + /// @notice Trigger a transfer of assets from a TransferProxy contract. + function transferAssetsFromProxy(address transferProxy, address asset, uint256 topUpAmount) external payable; + /// @notice Check `IPoolManager.transferTrancheTokens`. /// @dev This adds a mandatory prepayment for all the costs that will incur during the transaction. /// The caller must call `CentrifugeRouter.estimate` to get estimates how much the deposit will cost. @@ -234,15 +242,15 @@ interface ICentrifugeRouter is IRecoverable { /// address router = // CentrifugeRouter's address /// /// bytes[] memory calls = new bytes[](2); - /// calls[0] = abi.encodeWithSelector( - /// router.requestDeposit.selector, vault, amount1, investor, investor, requestDepositCost - /// }; - /// calls[1] = abi.encodeWithSelector( - /// router.requestDeposit.selector, vault, amount2, investor, investor, requestDepositCost - /// }; + /// calls[0] = abi.encodeCall( + /// router.requestDeposit, (vault, amount1, investor, investor, requestDepositCost) + /// ); + /// calls[1] = abi.encodeCall( + /// router.requestDeposit, (vault, amount2, investor, investor, requestDepositCost) + /// ); /// uint256 msgValue = 2 * requestDepositCost; - /// router.multical{value: msgValue}(calls); + /// router.multicall{value: msgValue}(calls); /// /// The `msg.value` MUST be at least 20 gwei. `multicall{value: 20 gwei}()` /// @param data An array of all encoded messages calls and their arguments @@ -254,4 +262,14 @@ interface ICentrifugeRouter is IRecoverable { /// @notice Check IGateway.estimate function estimate(bytes calldata payload) external view returns (uint256 amount); + + /// @notice Called to check if `user` has permissions on `vault` to execute requests + /// + /// @param vault Address of the `vault` the `user` wants to operate on + /// @param user Address of the `user` that will operates on the `vault` + /// @return Whether `user` has permissions to operate on `vault` + function hasPermissions(address vault, address user) external view returns (bool); + + /// @notice Returns whether the controller has called `enable()` for the given `vault` + function isEnabled(address vault, address controller) external view returns (bool); } diff --git a/src/interfaces/IERC20.sol b/src/interfaces/IERC20.sol index 2cc304e3..97747954 100644 --- a/src/interfaces/IERC20.sol +++ b/src/interfaces/IERC20.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.5.0; /// @title IERC20 diff --git a/src/interfaces/IERC7540.sol b/src/interfaces/IERC7540.sol index 95b24507..7d7f5094 100644 --- a/src/interfaces/IERC7540.sol +++ b/src/interfaces/IERC7540.sol @@ -19,6 +19,7 @@ interface IERC7540Operator { * * @param operator The address of the operator. * @param approved The approval status. + * @return Whether the call was executed successfully or not */ function setOperator(address operator, bool approved) external returns (bool); @@ -247,8 +248,8 @@ interface IERC7741 { address controller, address operator, bool approved, - uint256 deadline, bytes32 nonce, + uint256 deadline, bytes memory signature ) external returns (bool); @@ -307,6 +308,9 @@ interface IERC7540Vault is /// @dev MUST be called by endorsed sender function setEndorsedOperator(address owner, bool approved) external; + /// @notice Callback when a redeem Request is triggered externally; + function onRedeemRequest(address controller, address owner, uint256 shares) external; + /// @notice Callback when a deposit Request becomes claimable function onDepositClaimable(address owner, uint256 assets, uint256 shares) external; diff --git a/src/interfaces/IInvestmentManager.sol b/src/interfaces/IInvestmentManager.sol index 41049a59..1f055a6d 100644 --- a/src/interfaces/IInvestmentManager.sol +++ b/src/interfaces/IInvestmentManager.sol @@ -4,21 +4,21 @@ pragma solidity >=0.5.0; import {IMessageHandler} from "src/interfaces/gateway/IGateway.sol"; import {IRecoverable} from "src/interfaces/IRoot.sol"; -/// @dev Vault orders and deposit/redeem bookkeeping per user +/// @dev Vault requests and deposit/redeem bookkeeping per user struct InvestmentState { /// @dev Shares that can be claimed using `mint()` uint128 maxMint; + /// @dev Assets that can be claimed using `withdraw()` + uint128 maxWithdraw; /// @dev Weighted average price of deposits, used to convert maxMint to maxDeposit uint256 depositPrice; - /// @dev Currency that can be claimed using `withdraw()` - uint128 maxWithdraw; /// @dev Weighted average price of redemptions, used to convert maxWithdraw to maxRedeem uint256 redeemPrice; - /// @dev Remaining deposit order in assets + /// @dev Remaining deposit request in assets uint128 pendingDepositRequest; - /// @dev Remaining redeem order in shares + /// @dev Remaining redeem request in shares uint128 pendingRedeemRequest; - /// @dev Currency that can be claimed using `claimCancelDepositRequest()` + /// @dev Assets that can be claimed using `claimCancelDepositRequest()` uint128 claimableCancelDepositRequest; /// @dev Shares that can be claimed using `claimCancelRedeemRequest()` uint128 claimableCancelRedeemRequest; @@ -35,6 +35,23 @@ interface IInvestmentManager is IMessageHandler, IRecoverable { uint64 indexed poolId, bytes16 indexed trancheId, address user, address asset, uint128 shares ); + /// @notice Returns the investment state + function investments(address vault, address investor) + external + view + returns ( + uint128 maxMint, + uint128 maxWithdraw, + uint256 depositPrice, + uint256 redeemPrice, + uint128 pendingDepositRequest, + uint128 pendingRedeemRequest, + uint128 claimableCancelDepositRequest, + uint128 claimableCancelRedeemRequest, + bool pendingCancelDepositRequest, + bool pendingCancelRedeemRequest + ); + /// @notice Updates contract parameters of type address. /// @param what The bytes32 representation of 'gateway' or 'poolManager'. /// @param data The new contract address. @@ -127,6 +144,50 @@ interface IInvestmentManager is IMessageHandler, IRecoverable { /// partial. /// @dev The assets in the escrow are reserved for the user and are transferred to the user during /// claimCancelDepositRequest calls. + /// `fulfillment` represents the decrease in `pendingDepositRequest`. + /// This is a separate parameter from `assets` since there can be some precision loss when calculating this, + /// which would lead to having dust in the pendingDepositRequest value and + /// never closing out the request even after it is technically fulfilled. + /// + /// Example: + /// User deposits 100 units of the vaults underlying asset. + /// - At some point they make cancellation request. The order in which is not guaranteed + /// Both requests arrive at CentrifugeChain. If the cancellation is first then all of the + /// deposited amount will be cancelled. + /// + /// - There is the case where the deposit event is first and it gets completely fulfilled then + /// No amount of the deposited asset will be cancelled. + /// + /// - There is the case where partially the deposit request is fulfilled. Let's say 40 units. + /// Then the cancel request arrives. + /// The remaining amount of deposited funds which is 60 units will cancelled. + /// There is a scenario where the deposit funds might different from the pool currency so some + /// swapping might happen. Either during this swapping or some fee collection or rounding there will be + /// difference between the actual amount that will be returned to the user. + /// `fulfillment` in this case will be 60 units but assets will be some lower amount because of the + /// aforementioned reasons + /// Let's assume the `asset` is 59. The user will be able to take back these 59 but + /// in order to not let any dust, we use `fulfillment` in our calculations. + /// + /// `pendingDepositRequest` not necessary gets zeroed during this cancellation event. + /// When CentrifugeChain process the cancel event on its side, part of the deposit might be fulfilled. + /// In such case the chain will send two messages, one `fulfillDepositRequest` and one + /// `fulfillCancelDepositRequest`. In the example above, given the 100 units + /// deposited, 40 units are fulfilled and 60 can be cancelled. + /// The two messages sent from CentrifugeChain are not guaranteed to arrive in order. + /// + /// Assuming first is the `fulfillCancelDepositRequest` the `pendingDepositRequest` here will be reduced to + /// 60 units only. Then the `fulfillCancelDepositRequest` arrives with `fulfillment` 60. This amount is + /// removed from `pendingDepositRequests`. Since there are not more pendingDepositRequest` the + /// `pendingCancelDepositRequest` gets deleted. + /// + /// Assuming first the `fulfillCancelDepositRequest` arrives then the `pendingDepositRequest` will be 100. + /// `fulfillment` is 60 so we are left with `pendingDepositRequest` equals to 40 ( 100 - 60 ). + /// Then the second message arrives which is `fulfillDepositRequest`. ( Check `fulfillDepositRequest` + /// implementation for details.) + /// When it arrives the `pendingDepositRequest` is 40 and the assets is 40 + /// so there are no more `pendingDepositRequest` and right there the `pendingCancelDepositRequest will be + /// deleted. function fulfillCancelDepositRequest( uint64 poolId, bytes16 trancheId, diff --git a/src/interfaces/IPoolManager.sol b/src/interfaces/IPoolManager.sol index f6ef2b6e..1118d589 100644 --- a/src/interfaces/IPoolManager.sol +++ b/src/interfaces/IPoolManager.sol @@ -84,11 +84,6 @@ interface IPoolManager is IMessageHandler, IRecoverable { /// @notice returns the asset id associated with a given address function assetToId(address) external view returns (uint128 assetId); - /// @notice returns the asset address associated with a given vault address - /// @return asset The asset address - /// @return isWrapper Whether the asset is a wrapped ERC20 token - function vaultToAsset(address) external view returns (address asset, bool isWrapper); - /// @notice Updates a contract parameter /// @param what Accepts a bytes32 representation of 'gateway', 'investmentManager', 'trancheFactory', /// 'vaultFactory', or 'gasService' @@ -195,9 +190,15 @@ interface IPoolManager is IMessageHandler, IRecoverable { /// @dev The function can only be executed by the gateway contract. function removeVault(uint64 poolId, bytes16 trancheId, address asset) external; + /// @notice Returns whether the given pool id is active + function isPoolActive(uint64 poolId) external view returns (bool); + /// @notice Returns the tranche token for a given pool and tranche id function getTranche(uint64 poolId, bytes16 trancheId) external view returns (address); + /// @notice Returns whether the tranche token for a given pool and tranche id can be deployed + function canTrancheBeDeployed(uint64 poolId, bytes16 trancheId) external view returns (bool); + /// @notice Returns the vault for a given pool, tranche id, and asset id function getVault(uint64 poolId, bytes16 trancheId, uint128 assetId) external view returns (address); diff --git a/src/interfaces/IRoot.sol b/src/interfaces/IRoot.sol index f0182ca1..dd033a1a 100644 --- a/src/interfaces/IRoot.sol +++ b/src/interfaces/IRoot.sol @@ -32,6 +32,9 @@ interface IRoot is IMessageHandler { /// @notice Returns the current timelock for adding new wards function delay() external view returns (uint256); + /// @notice Trusted contracts within the system + function endorsements(address target) external view returns (uint256); + /// @notice Returns when `relyTarget` has passed the timelock function schedule(address relyTarget) external view returns (uint256 timestamp); diff --git a/src/interfaces/factories/IERC7540VaultFactory.sol b/src/interfaces/factories/IERC7540VaultFactory.sol new file mode 100644 index 00000000..53931e82 --- /dev/null +++ b/src/interfaces/factories/IERC7540VaultFactory.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +interface IERC7540VaultFactory { + /// @notice Deploys new vault for `poolId`, `trancheId` and `asset`. + /// + /// @param poolId Id of the pool. Id is one of the already supported pools. + /// @param trancheId Id of the tranche. Id is one of the already supported tranches. + /// @param asset Address of the underlying asset that's getting deposited inside the pool. + /// @param tranche Address of the tranche token that's getting issues against the deposited asset. + /// @param escrow A intermediary contract that holdsa temporary funds until request is fulfilled. + /// @param investmentManager Address of a contract that manages incoming/outgoing transactions. + /// @param wards_ Address which can call methods behind authorized only. + function newVault( + uint64 poolId, + bytes16 trancheId, + address asset, + address tranche, + address escrow, + address investmentManager, + address[] calldata wards_ + ) external returns (address); + + /// @notice Removes `vault` from `who`'s authroized callers + /// + /// @param vault Address of the vault to be remove from the authorized callers list. + /// @param investmentManager Address of the manager to remove the vault from. + function denyVault(address vault, address investmentManager) external; +} diff --git a/src/interfaces/factories/ITrancheFactory.sol b/src/interfaces/factories/ITrancheFactory.sol new file mode 100644 index 00000000..be4006df --- /dev/null +++ b/src/interfaces/factories/ITrancheFactory.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +interface ITrancheFactory { + /// @notice Used to deploy new tranche tokens. + /// @dev In order to have the same address on different EVMs `salt` should be used + /// during creationg process. + /// @param poolId Id of the pool. Id is one of the already supported pools. + /// @param trancheId Id of the tranche. Id is one of the already supported tranches. + /// @param name Name of the new token. + /// @param symbol Symbol of the new token. + /// @param decimals Decimals of the new token. + /// @param trancheWards Address which can call methods behind authorized only. + function newTranche( + uint64 poolId, + bytes16 trancheId, + string memory name, + string memory symbol, + uint8 decimals, + address[] calldata trancheWards + ) external returns (address); + + /// @notice Returns the predicted address (using CREATE2) + function getAddress(uint64 poolId, bytes16 trancheId, uint8 decimals) external view returns (address); +} diff --git a/src/interfaces/factories/ITransferProxy.sol b/src/interfaces/factories/ITransferProxy.sol index b4318b2e..e984e08d 100644 --- a/src/interfaces/factories/ITransferProxy.sol +++ b/src/interfaces/factories/ITransferProxy.sol @@ -1,17 +1,36 @@ // SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.5.0; -interface ITransferProxy { - /// @dev Anyone can transfer tokens. - function transfer(address asset, uint128 amount) external; +import {IRecoverable} from "src/interfaces/IRoot.sol"; + +interface ITransferProxy is IRecoverable { + event File(bytes32 indexed what, address data); + + /// @notice Updates a contract parameter + /// @param what Accepts a bytes32 representation of 'poolManager' + function file(bytes32 what, address data) external; + + /// @notice Anyone can transfer tokens. + function transfer(address asset) external; } interface ITransferProxyFactory { + event File(bytes32 indexed what, address data); event DeployTransferProxy(bytes32 indexed destination, address proxy); - /// @dev Lookup proxy by destination address + /// @notice Updates a contract parameter + /// @param what Accepts a bytes32 representation of 'poolManager' + function file(bytes32 what, address data) external; + + /// @notice Returns the address of the linked pool manager + function poolManager() external view returns (address); + + /// @notice Lookup proxy by destination address function proxies(bytes32 destination) external view returns (address proxy); - /// @dev Deploy new transfer proxy + /// @notice Deploy new transfer proxy function newTransferProxy(bytes32 destination) external returns (address); + + /// @notice Returns the predicted address (using CREATE2) + function getAddress(bytes32 destination) external view returns (address); } diff --git a/src/interfaces/gateway/IGateway.sol b/src/interfaces/gateway/IGateway.sol index d696336e..cfd9adf2 100644 --- a/src/interfaces/gateway/IGateway.sol +++ b/src/interfaces/gateway/IGateway.sol @@ -26,8 +26,8 @@ interface IGateway { } // --- Events --- - event HandleMessage(bytes message, address adapter); - event HandleProof(bytes32 messageHash, address adapter); + event ProcessMessage(bytes message, address adapter); + event ProcessProof(bytes32 messageHash, address adapter); event ExecuteMessage(bytes message, address adapter); event SendMessage(bytes message); event RecoverMessage(address adapter, bytes message); @@ -38,7 +38,17 @@ interface IGateway { event File(bytes32 indexed what, address[] adapters); event File(bytes32 indexed what, address instance); event File(bytes32 indexed what, uint8 messageId, address manager); - event Received(address indexed sender, uint256 amount); + event File(bytes32 indexed what, address caller, bool isAllowed); + event ReceiveNativeTokens(address indexed sender, uint256 amount); + + /// @notice Returns the address of the adapter at the given id. + function adapters(uint256 id) external view returns (address); + + /// @notice Returns the address of the contract that handles the given message id. + function messageHandlers(uint8 messageId) external view returns (address); + + /// @notice Returns the timestamp when the given recovery can be executed. + function recoveries(address adapter, bytes32 messageHash) external view returns (uint256 timestamp); // --- Administration --- /// @notice Used to update an array of addresses ( state variable ) on very rare occasions. @@ -62,6 +72,14 @@ interface IGateway { /// @param data2 The value of the mapping function file(bytes32 what, uint8 data1, address data2) external; + /// @notice Used to update a mapping ( state variables ) on very rare occasions. + /// @dev Manages who is allowed to call `this.topUp` + /// + /// @param what The name of the variable to be updated - `payers` + /// @param caller Address of the payer allowed to top-up + /// @param isAllower Whether the `caller` is allowed to top-up or not + function file(bytes32 what, address caller, bool isAllower) external; + // --- Incoming --- /// @notice Handles incoming messages, proofs, and recoveries. /// @dev Assumes adapters ensure messages cannot be confirmed more than once. @@ -133,10 +151,16 @@ interface IGateway { /// and settling on the destination chain. /// @param payload Used in gas cost calculations. /// @dev Currenly the payload is not taken into consideration. - /// @return tranches An array of cost values per adapter. Each value is how much it's going to cost + /// @return perAdapter An array of cost values per adapter. Each value is how much it's going to cost /// for a message / proof to be passed through one router and executed on Centrifuge Chain /// @return total Total cost for sending one message and corresponding proofs on through all adapters - function estimate(bytes calldata payload) external view returns (uint256[] memory tranches, uint256 total); + function estimate(bytes calldata payload) external view returns (uint256[] memory perAdapter, uint256 total); + + /// @notice Used to check current state of the `caller` and whether they are allowed to call + /// `this.topUp` or not. + /// @param caller Address to check + /// @return isAllowed Whether the `caller` `isAllowed to call `this.topUp()` + function payers(address caller) external view returns (bool isAllowed); } interface IMessageHandler { diff --git a/src/interfaces/gateway/adapters/IAxelarAdapter.sol b/src/interfaces/gateway/adapters/IAxelarAdapter.sol index ad6c37bd..5f6ff5c2 100644 --- a/src/interfaces/gateway/adapters/IAxelarAdapter.sol +++ b/src/interfaces/gateway/adapters/IAxelarAdapter.sol @@ -3,6 +3,28 @@ pragma solidity >=0.5.0; import {IAdapter} from "src/interfaces/gateway/IAdapter.sol"; +interface IAxelarGateway { + function callContract(string calldata destinationChain, string calldata contractAddress, bytes calldata payload) + external; + + function validateContractCall( + bytes32 commandId, + string calldata sourceChain, + string calldata sourceAddress, + bytes32 payloadHash + ) external returns (bool); +} + +interface IAxelarGasService { + function payNativeGasForContractCall( + address sender, + string calldata destinationChain, + string calldata destinationAddress, + bytes calldata payload, + address refundAddress + ) external payable; +} + interface IAxelarAdapter is IAdapter { event File(bytes32 indexed what, uint256 value); diff --git a/src/interfaces/misc/IPrecompile.sol b/src/interfaces/misc/IPrecompile.sol new file mode 100644 index 00000000..3e22a503 --- /dev/null +++ b/src/interfaces/misc/IPrecompile.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +interface IPrecompile { + function execute( + bytes32 commandId, + string calldata sourceChain, + string calldata sourceAddress, + bytes calldata payload + ) external; +} diff --git a/src/interfaces/token/IHook.sol b/src/interfaces/token/IHook.sol index cac050c2..f4c9ffcc 100644 --- a/src/interfaces/token/IHook.sol +++ b/src/interfaces/token/IHook.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.5.0; import {IERC165} from "src/interfaces/IERC7575.sol"; @@ -16,15 +16,15 @@ string constant ERROR_MESSAGE = "transfer-blocked"; interface IHook is IERC165 { /// @notice Callback on standard ERC20 transfer. - /// @dev MUST return bytes4(keccak256("onERC20Transfer(address,address,uint256,(bytes16,bytes16))")) if - /// successful + /// @dev MUST return bytes4(keccak256("onERC20Transfer(address,address,uint256,(bytes16,bytes16))")) + /// if successful function onERC20Transfer(address from, address to, uint256 value, HookData calldata hookdata) external returns (bytes4); /// @notice Callback on authorized ERC20 transfer. - /// @dev MUST return bytes4(keccak256("onERC20Transfer(address,address,uint256,(bytes16,bytes16))")) if - /// successful + /// @dev MUST return bytes4(keccak256("onERC20AuthTransfer(address,address,address,uint256,(bytes16,bytes16))")) + /// if successful function onERC20AuthTransfer(address sender, address from, address to, uint256 value, HookData calldata hookdata) external returns (bytes4); diff --git a/src/interfaces/token/ITranche.sol b/src/interfaces/token/ITranche.sol index 4150b21e..395474ec 100644 --- a/src/interfaces/token/ITranche.sol +++ b/src/interfaces/token/ITranche.sol @@ -25,6 +25,14 @@ interface ITranche is IERC20Metadata, IERC7575Share, IERC1404 { event File(bytes32 indexed what, address data); event SetHookData(address indexed user, bytes16 data); + struct Balance { + /// @dev The user balance is limited to uint128. This is safe because the decimals are limited to 18, + /// thus the max balance is 2^128-1 / 10**18 = 3.40 * 10**20. This is also enforced on mint. + uint128 amount; + /// @dev There are 16 bytes that are used to store hook data (e.g. restrictions for users). + bytes16 hookData; + } + // --- Administration --- /// @notice returns the hook that transfers perform callbacks to /// @dev MUST comply to `IHook` interface diff --git a/src/libraries/ArrayLib.sol b/src/libraries/ArrayLib.sol index 7482b688..cf8b3d60 100644 --- a/src/libraries/ArrayLib.sol +++ b/src/libraries/ArrayLib.sol @@ -4,13 +4,15 @@ pragma solidity 0.8.26; /// @title ArrayLib library ArrayLib { function countNonZeroValues(uint16[8] memory arr) internal pure returns (uint8 count) { - for (uint256 i; i < arr.length; i++) { + uint256 elementsCount = arr.length; + for (uint256 i; i < elementsCount; i++) { if (arr[i] != 0) ++count; } } function decreaseFirstNValues(uint16[8] storage arr, uint8 numValues) internal { - for (uint256 i; i < arr.length; i++) { + uint256 elementsCount = arr.length; + for (uint256 i; i < elementsCount; i++) { if (numValues == 0) return; if (arr[i] != 0) { @@ -23,7 +25,8 @@ library ArrayLib { } function isEmpty(uint16[8] memory arr) internal pure returns (bool) { - for (uint256 i; i < arr.length; i++) { + uint256 elementsCount = arr.length; + for (uint256 i; i < elementsCount; i++) { if (arr[i] != 0) return false; } return true; diff --git a/src/libraries/BitmapLib.sol b/src/libraries/BitmapLib.sol index dc6c602b..c5e5830a 100644 --- a/src/libraries/BitmapLib.sol +++ b/src/libraries/BitmapLib.sol @@ -15,24 +15,4 @@ library BitmapLib { uint128 bitAtIndex = uint128(bitmap & (1 << index)); return bitAtIndex != 0; } - - /// @notice Get n least significant bits from the bitmap - function getLSBits(uint256 bitmap, uint256 n) internal pure returns (uint256) { - return bitmap & (2 ** n - 1); - } - - /// @notice Get n most significant bits from the bitmap - function getMSBits(uint256 bitmap, uint256 n) internal pure returns (uint256) { - return bitmap >> (256 - n); - } - - /// @notice Shift the value left - function shiftLeft(uint64 value, uint128 shift) internal pure returns (uint128) { - return uint128(value) << shift; - } - - /// @notice Concatenate uint128 values to create a uint256 value - function concat(uint128 left, uint128 right) internal pure returns (uint256) { - return uint256(uint128(left)) << 128 | uint128(right); - } } diff --git a/src/libraries/CastLib.sol b/src/libraries/CastLib.sol index 67b87954..8cb4531f 100644 --- a/src/libraries/CastLib.sol +++ b/src/libraries/CastLib.sol @@ -23,7 +23,7 @@ library CastLib { bytes memory bytesArray = new bytes(i); - for (uint8 j = 0; j < i; j++) { + for (uint8 j; j < i; j++) { bytesArray[j] = _bytes128[j]; } diff --git a/src/libraries/MathLib.sol b/src/libraries/MathLib.sol index 2ac62663..ca7bc849 100644 --- a/src/libraries/MathLib.sol +++ b/src/libraries/MathLib.sol @@ -110,6 +110,14 @@ library MathLib { return result; } + /// @notice Safe type conversion from uint256 to uint8. + function toUint8(uint256 value) internal pure returns (uint8) { + if (value > type(uint8).max) { + revert("MathLib/uint8-overflow"); + } + return uint8(value); + } + /// @notice Safe type conversion from uint256 to uint128. function toUint128(uint256 _value) internal pure returns (uint128 value) { if (_value > type(uint128).max) { diff --git a/src/libraries/SafeTransferLib.sol b/src/libraries/SafeTransferLib.sol index 56f61777..a8247ab6 100644 --- a/src/libraries/SafeTransferLib.sol +++ b/src/libraries/SafeTransferLib.sol @@ -13,8 +13,7 @@ library SafeTransferLib { /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom(address token, address from, address to, uint256 value) internal { - (bool success, bytes memory data) = - token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); + (bool success, bytes memory data) = token.call(abi.encodeCall(IERC20.transferFrom, (from, to, value))); require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeTransferLib/safe-transfer-from-failed"); } @@ -24,7 +23,7 @@ library SafeTransferLib { /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer(address token, address to, uint256 value) internal { - (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); + (bool success, bytes memory data) = token.call(abi.encodeCall(IERC20.transfer, (to, value))); require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeTransferLib/safe-transfer-failed"); } @@ -34,7 +33,17 @@ library SafeTransferLib { /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove(address token, address to, uint256 value) internal { - (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); + (bool success, bytes memory data) = token.call(abi.encodeCall(IERC20.approve, (to, value))); require(success && (data.length == 0 || abi.decode(data, (bool))), "SafeTransferLib/safe-approve-failed"); } + + /// @notice Transfers ETH to the recipient address + /// @dev Fails with `STE` + /// @dev Make sure that method that is using this function is protected from reentrancy + /// @param to The destination of the transfer + /// @param value The value to be transferred + function safeTransferETH(address to, uint256 value) internal { + (bool success,) = to.call{value: value}(new bytes(0)); + require(success, "SafeTransferLib/safe-transfer-eth-failed"); + } } diff --git a/src/libraries/SignatureLib.sol b/src/libraries/SignatureLib.sol index acd97d90..19ea2577 100644 --- a/src/libraries/SignatureLib.sol +++ b/src/libraries/SignatureLib.sol @@ -12,6 +12,8 @@ library SignatureLib { view returns (bool valid) { + require(signer != address(0), "SignatureLib/invalid-signer"); + if (signature.length == 65) { bytes32 r; bytes32 s; diff --git a/src/token/ERC20.sol b/src/token/ERC20.sol index d76a1af7..b685e458 100644 --- a/src/token/ERC20.sol +++ b/src/token/ERC20.sol @@ -19,7 +19,8 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { /// @inheritdoc IERC20 uint256 public totalSupply; - mapping(address => uint256) internal balances; + mapping(address => uint256) private balances; + /// @inheritdoc IERC20 mapping(address => mapping(address => uint256)) public allowance; /// @inheritdoc IERC20Permit @@ -36,10 +37,8 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { // --- Events --- event File(bytes32 indexed what, string data); - constructor(uint8 decimals_) { + constructor(uint8 decimals_) Auth(msg.sender) { decimals = decimals_; - wards[msg.sender] = 1; - emit Rely(msg.sender); nameHash = keccak256(bytes("Centrifuge")); versionHash = keccak256(bytes("1")); @@ -47,12 +46,16 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { _DOMAIN_SEPARATOR = EIP712Lib.calculateDomainSeparator(nameHash, versionHash); } + function _balanceOf(address user) internal view virtual returns (uint256) { + return balances[user]; + } + /// @inheritdoc IERC20 function balanceOf(address user) public view virtual returns (uint256) { - return balances[user]; + return _balanceOf(user); } - function _setBalance(address user, uint256 value) internal { + function _setBalance(address user, uint256 value) internal virtual { balances[user] = value; } @@ -79,8 +82,9 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { require(balance >= value, "ERC20/insufficient-balance"); unchecked { - balances[msg.sender] -= value; - balances[to] += value; // note: we don't need an overflow check here b/c sum of all balances == totalSupply + _setBalance(msg.sender, _balanceOf(msg.sender) - value); + // note: we don't need an overflow check here b/c sum of all balances == totalSupply + _setBalance(to, _balanceOf(to) + value); } emit Transfer(msg.sender, to, value); @@ -109,8 +113,9 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { } unchecked { - balances[from] -= value; - balances[to] += value; // note: we don't need an overflow check here b/c sum of all balances == totalSupply + _setBalance(from, _balanceOf(from) - value); + // note: we don't need an overflow check here b/c sum of all balances == totalSupply + _setBalance(to, _balanceOf(to) + value); } emit Transfer(from, to, value); @@ -133,7 +138,7 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { unchecked { // We don't need an overflow check here b/c balances[to] <= totalSupply // and there is an overflow check below - balances[to] += value; + _setBalance(to, _balanceOf(to) + value); } totalSupply = totalSupply + value; @@ -157,7 +162,7 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { unchecked { // We don't need overflow checks b/c require(balance >= value) and balance <= totalSupply - balances[from] -= value; + _setBalance(from, _balanceOf(from) - value); totalSupply = totalSupply - value; } @@ -167,7 +172,6 @@ contract ERC20 is Auth, IERC20Metadata, IERC20Permit { // --- Approve by signature --- function permit(address owner, address spender, uint256 value, uint256 deadline, bytes memory signature) public { require(block.timestamp <= deadline, "ERC20/permit-expired"); - require(owner != address(0), "ERC20/invalid-owner"); uint256 nonce; unchecked { diff --git a/src/token/RestrictionManager.sol b/src/token/RestrictionManager.sol index fd1d3174..5e426e58 100644 --- a/src/token/RestrictionManager.sol +++ b/src/token/RestrictionManager.sol @@ -28,11 +28,8 @@ contract RestrictionManager is Auth, IRestrictionManager, IHook { IRoot public immutable root; - constructor(address root_, address deployer) { + constructor(address root_, address deployer) Auth(deployer) { root = IRoot(root_); - - wards[deployer] = 1; - emit Rely(deployer); } // --- Callback from tranche token --- @@ -43,7 +40,7 @@ contract RestrictionManager is Auth, IRestrictionManager, IHook { returns (bytes4) { require(checkERC20Transfer(from, to, value, hookData), "RestrictionManager/transfer-blocked"); - return bytes4(keccak256("onERC20Transfer(address,address,uint256,(bytes16,bytes16))")); + return IHook.onERC20Transfer.selector; } /// @inheritdoc IHook @@ -54,7 +51,7 @@ contract RestrictionManager is Auth, IRestrictionManager, IHook { uint256, /* value */ HookData calldata /* hookData */ ) external pure returns (bytes4) { - return bytes4(keccak256("onERC20AuthTransfer(address,address,address,uint256,(bytes16,bytes16))")); + return IHook.onERC20AuthTransfer.selector; } // --- ERC1404 implementation --- @@ -65,15 +62,23 @@ contract RestrictionManager is Auth, IRestrictionManager, IHook { returns (bool) { if (uint128(hookData.from).getBit(FREEZE_BIT) == true && !root.endorsed(from)) { + // Source is frozen and not endorsed return false; } - bool toIsEndorsed = root.endorsed(to); - if (uint128(hookData.to).getBit(FREEZE_BIT) == true && !toIsEndorsed) { + if (root.endorsed(to) || to == address(0)) { + // Destination is endorsed and source was already checked, so the transfer is allowed + return true; + } + + uint128 toHookData = uint128(hookData.to); + if (toHookData.getBit(FREEZE_BIT) == true) { + // Destination is frozen return false; } - if (abi.encodePacked(hookData.to).toUint64(0) < block.timestamp && !toIsEndorsed) { + if (toHookData >> 64 < block.timestamp) { + // Destination is not a member return false; } @@ -121,7 +126,8 @@ contract RestrictionManager is Auth, IRestrictionManager, IHook { require(block.timestamp <= validUntil, "RestrictionManager/invalid-valid-until"); require(!root.endorsed(user), "RestrictionManager/endorsed-user-cannot-be-updated"); - uint128 hookData = validUntil.shiftLeft(64).setBit(FREEZE_BIT, isFrozen(token, user)); + uint128 hookData = uint128(validUntil) << 64; + hookData.setBit(FREEZE_BIT, isFrozen(token, user)); ITranche(token).setHookData(user, bytes16(hookData)); emit UpdateMember(token, user, validUntil); diff --git a/src/token/Tranche.sol b/src/token/Tranche.sol index 9770b474..f11b50f5 100644 --- a/src/token/Tranche.sol +++ b/src/token/Tranche.sol @@ -13,19 +13,15 @@ import { } from "src/interfaces/token/IHook.sol"; import {IERC7575Share, IERC165} from "src/interfaces/IERC7575.sol"; import {ITranche, IERC1404} from "src/interfaces/token/ITranche.sol"; -import {BitmapLib} from "src/libraries/BitmapLib.sol"; +import {MathLib} from "src/libraries/MathLib.sol"; /// @title Tranche Token /// @notice Extension of ERC20 + ERC1404 for tranche tokens, /// integrating an external hook optionally for ERC20 callbacks and ERC1404 checks. -/// -/// @dev The user balance is limited to uint128. This is safe because the decimals are limited to 18, -/// thus the max balance is 2^128-1 / 10**18 = 3.40 * 10**20. This is also enforced on mint. -/// -/// The most significant 128 bits of the uint256 balance value are used -/// to store hook data (e.g. restrictions for users). contract Tranche is ERC20, ITranche { - using BitmapLib for *; + using MathLib for uint256; + + mapping(address => Balance) private balances; /// @inheritdoc ITranche address public hook; @@ -60,20 +56,22 @@ contract Tranche is ERC20, ITranche { } // --- ERC20 overrides --- - /// @inheritdoc IERC20 - function balanceOf(address user) public view override(ERC20, IERC20) returns (uint256) { - return balances[user].getLSBits(128); + function _balanceOf(address user) internal view override returns (uint256) { + return balances[user].amount; + } + + function _setBalance(address user, uint256 value) internal override { + balances[user].amount = value.toUint128(); } /// @inheritdoc ITranche function hookDataOf(address user) public view returns (bytes16) { - return bytes16(uint128(balances[user].getMSBits(128))); + return balances[user].hookData; } /// @inheritdoc ITranche function setHookData(address user, bytes16 hookData) public authOrHook { - /// Balance values are [uint128(hookData) + uint128(balance)] - _setBalance(user, uint128(hookData).concat(uint128(balanceOf(user)))); + balances[user].hookData = hookData; emit SetHookData(user, hookData); } @@ -103,6 +101,7 @@ contract Tranche is ERC20, ITranche { /// @inheritdoc ITranche function burn(address from, uint256 value) public override(ERC20, ITranche) { super.burn(from, value); + _onTransfer(from, address(0), value); } function _onTransfer(address from, address to, uint256 value) internal { diff --git a/test/BaseTest.sol b/test/BaseTest.sol index e2972fa3..ce940e5e 100644 --- a/test/BaseTest.sol +++ b/test/BaseTest.sol @@ -47,7 +47,7 @@ contract BaseTest is Deployer, Test { // default values uint128 public defaultAssetId = 1; - uint128 public defaultPrice = 1 * 10**18; + uint128 public defaultPrice = 1 * 10 ** 18; uint8 public defaultDecimals = 8; function setUp() public virtual { @@ -154,6 +154,8 @@ contract BaseTest is Deployer, Test { centrifugeChain.allowAsset(poolId, assetId); } + poolManager.updateTranchePrice(poolId, trancheId, assetId, uint128(10 ** 18), uint64(block.timestamp)); + address vaultAddress = poolManager.deployVault(poolId, trancheId, asset); return vaultAddress; @@ -167,11 +169,13 @@ contract BaseTest is Deployer, Test { bytes16 trancheId, uint128 asset ) public returns (address) { - return deployVault(poolId, decimals, restrictionManager, tokenName, tokenSymbol, trancheId, asset, address(erc20)); + return + deployVault(poolId, decimals, restrictionManager, tokenName, tokenSymbol, trancheId, asset, address(erc20)); } function deploySimpleVault() public returns (address) { - return deployVault(5, 6, restrictionManager, "name", "symbol", bytes16(bytes("1")), defaultAssetId, address(erc20)); + return + deployVault(5, 6, restrictionManager, "name", "symbol", bytes16(bytes("1")), defaultAssetId, address(erc20)); } function deposit(address _vault, address _investor, uint256 amount) public { diff --git a/test/CryticTester.sol b/test/CryticTester.sol new file mode 100644 index 00000000..4b1ed15d --- /dev/null +++ b/test/CryticTester.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {TargetFunctions} from "test/recon-core/TargetFunctions.sol"; +import {CryticAsserts} from "@chimera/CryticAsserts.sol"; + +// echidna . --contract CryticTester --config echidna.yaml +// medusa fuzz +contract CryticTester is TargetFunctions, CryticAsserts { + constructor() payable { + setup(); + } +} diff --git a/test/fork/Fork.t.sol b/test/fork/Fork.t.sol index 884aa7d0..dfcd78ed 100644 --- a/test/fork/Fork.t.sol +++ b/test/fork/Fork.t.sol @@ -3,27 +3,53 @@ pragma solidity 0.8.26; import {Root} from "src/Root.sol"; import {InvestmentManager} from "src/InvestmentManager.sol"; +import {RestrictionManager} from "src/token/RestrictionManager.sol"; import {PoolManager} from "src/PoolManager.sol"; import {Escrow} from "src/Escrow.sol"; import {Tranche} from "src/token/Tranche.sol"; import {Gateway} from "src/gateway/Gateway.sol"; +import {CentrifugeRouter} from "src/CentrifugeRouter.sol"; +import {AxelarAdapter} from "src/gateway/adapters/axelar/Adapter.sol"; +import {GasService} from "src/gateway/GasService.sol"; import {ERC7540VaultFactory} from "src/factories/ERC7540VaultFactory.sol"; import {TrancheFactory} from "src/factories/TrancheFactory.sol"; +import {ERC7540VaultFactory} from "src/factories/ERC7540VaultFactory.sol"; +import {TransferProxyFactory} from "src/factories/TransferProxyFactory.sol"; import {Guardian} from "src/admin/Guardian.sol"; import "forge-std/Test.sol"; import "forge-std/StdJson.sol"; -interface AdapterLike { - function send(bytes memory message) external; - function wards(address ward) external view returns (uint256); -} - -interface SafeLike { +interface ISafe { function getOwners() external view returns (address[] memory); function isOwner(address signer) external view returns (bool); function getThreshold() external view returns (uint256); } +interface IAxelarContract { + function contractId() external view returns (bytes32); +} + +struct Deployment { + address root; + address guardian; + address restrictionManager; + address investmentManager; + address poolManager; + address centrifugeRouter; + address payable gateway; + address gasService; + address escrow; + address routerEscrow; + address adapter; + address trancheFactory; + address vaultFactory; + address transferProxyFactory; + address deployer; + address safe; + address axelarGateway; + address axelarGasService; +} + contract ForkTest is Test { using stdJson for string; @@ -37,120 +63,279 @@ contract ForkTest is Test { _loadDeployment("mainnet", "celo-mainnet"); // Testnet - // TODO: sepolia currently fails because the admin is missing on the DelayedAdmin - // Should be redeployed and then re-enabled here - // _loadDeployment("testnet", "ethereum-sepolia"); + // _loadDeployment("testnet", "ethereum-sepolia-demo"); } - function testBaseContractsWiredCorrectly() public { + function testContractSetup() public { if (vm.envOr("FORK_TESTS", false)) { - for (uint256 i = 0; i < deployments.length; i++) { + for (uint256 i; i < deployments.length; i++) { // Read deployment file - address root = _get(i, ".contracts.root"); - address investmentManager = _get(i, ".contracts.investmentManager"); - address poolManager = _get(i, ".contracts.poolManager"); - address payable gateway = payable(_get(i, ".contracts.gateway")); - address escrow = _get(i, ".contracts.escrow"); - address adapter = _get(i, ".contracts.adapter"); - address trancheFactory = _get(i, ".contracts.trancheFactory"); - address vaultFactory = _get(i, ".contracts.vaultFactory"); - address deployer = _get(i, ".config.deployer"); - address adminSafe = _get(i, ".config.adminSafe"); + Deployment memory deployment = _parse(i); + _loadFork(i); - // InvestmentManager - assertEq(address(InvestmentManager(investmentManager).escrow()), escrow); - assertEq(address(InvestmentManager(investmentManager).gateway()), gateway); - assertEq(address(InvestmentManager(investmentManager).poolManager()), poolManager); - assertEq(InvestmentManager(investmentManager).wards(poolManager), 1); - assertEq(Escrow(escrow).wards(investmentManager), 1); - assertEq(InvestmentManager(investmentManager).wards(root), 1); - assertEq(InvestmentManager(investmentManager).wards(deployer), 0); - assertEq(InvestmentManager(investmentManager).wards(adminSafe), 0); - - // PoolManager - assertEq(address(PoolManager(poolManager).gateway()), gateway); - assertEq(address(PoolManager(poolManager).escrow()), escrow); - assertEq(address(PoolManager(poolManager).investmentManager()), investmentManager); - assertEq(address(PoolManager(poolManager).trancheFactory()), trancheFactory); - assertEq(address(PoolManager(poolManager).vaultFactory()), vaultFactory); - assertEq(Escrow(escrow).wards(poolManager), 1); - assertEq(PoolManager(poolManager).wards(root), 1); - assertEq(PoolManager(poolManager).wards(deployer), 0); - assertEq(PoolManager(poolManager).wards(adminSafe), 0); - - // Gateway - assertEq(address(Gateway(gateway).investmentManager()), investmentManager); - assertEq(address(Gateway(gateway).poolManager()), poolManager); - assertEq(address(Gateway(gateway).root()), root); - assertEq(address(InvestmentManager(investmentManager).gateway()), gateway); - assertEq(address(PoolManager(poolManager).gateway()), gateway); - assertEq(Gateway(gateway).wards(root), 1); - assertEq(Root(root).wards(gateway), 1); - assertEq(Gateway(gateway).wards(deployer), 0); - assertEq(Gateway(gateway).wards(adminSafe), 0); - - // Escrow - assertEq(Escrow(escrow).wards(root), 1); - assertEq(Escrow(escrow).wards(deployer), 0); - assertEq(Escrow(escrow).wards(adminSafe), 0); - - // UserEscrow - - // Adapter - assertEq(AdapterLike(adapter).wards(root), 1); - assertEq(AdapterLike(adapter).wards(deployer), 0); - assertEq(AdapterLike(adapter).wards(adminSafe), 0); + _verifyRoot(deployment); + _verifyGuardian(deployment); + _verifyRestrictionManager(deployment); + _verifyInvestmentManager(deployment); + _verifyPoolmanager(deployment); + _verifyRouter(deployment); + _verifyGateway(deployment); + _verifyGasService(deployment); + _verifyEscrow(deployment); + _verifyRouterEscrow(deployment); + _verifyAxelarAdapter(deployment); + _verifyTrancheFactory(deployment); + _verifyVaultFactory(deployment); + _verifyTransferProxyFactory(deployment); } } } - function testFactoriesWiredCorrectly() public { - if (vm.envOr("FORK_TESTS", false)) { - for (uint256 i = 0; i < deployments.length; i++) { - // Read deployment file - address root = _get(i, ".contracts.root"); - address poolManager = _get(i, ".contracts.poolManager"); - address trancheFactory = _get(i, ".contracts.trancheFactory"); - address vaultFactory = _get(i, ".contracts.vaultFactory"); - address deployer = _get(i, ".config.deployer"); - address adminSafe = _get(i, ".config.adminSafe"); - _loadFork(i); + function _verifyRoot(Deployment memory deployment) internal { + address root = deployment.root; + address escrow = deployment.escrow; + address gateway = deployment.gateway; + address guardian = deployment.guardian; + address router = deployment.centrifugeRouter; + address deployer = deployment.deployer; - // TrancheFactory - assertEq(TrancheFactory(trancheFactory).wards(root), 1); - assertEq(TrancheFactory(trancheFactory).wards(deployer), 0); - assertEq(TrancheFactory(trancheFactory).wards(adminSafe), 0); - - // ERC7540VaultFactory - assertEq(ERC7540VaultFactory(vaultFactory).root(), root); - assertEq(ERC7540VaultFactory(vaultFactory).wards(root), 1); - assertEq(ERC7540VaultFactory(vaultFactory).wards(poolManager), 1); - assertEq(ERC7540VaultFactory(vaultFactory).wards(deployer), 0); - assertEq(ERC7540VaultFactory(vaultFactory).wards(adminSafe), 0); - } - } + Root _root = Root(root); + + assertEq(_root.escrow(), escrow); + + assertEq(_root.delay(), 48 hours); + assertEq(_root.paused(), false); + + assertEq(_root.wards(gateway), 1); + assertEq(_root.wards(guardian), 1); + assertEq(_root.wards(deployer), 0); + + assertTrue(_root.endorsed(router)); + assertTrue(_root.endorsed(escrow)); } - function testAdminsWiredCorrectly() public { - if (vm.envOr("FORK_TESTS", false)) { - for (uint256 i = 0; i < deployments.length; i++) { - // Read deployment file - address root = _get(i, ".contracts.root"); - address guardian = _get(i, ".contracts.guardian"); - address adminSafe = _get(i, ".config.adminSafe"); - _loadFork(i); + function _verifyGuardian(Deployment memory deployment) internal { + address guardian = deployment.guardian; + address gateway = deployment.gateway; + address root = deployment.root; + address safe = deployment.safe; - // Root - assertEq(Root(root).delay(), 48 hours); - assertEq(Root(root).paused(), false); + Guardian _guardian = Guardian(guardian); - // Guardian - assertEq(address(Guardian(guardian).root()), root); - assertEq(address(Guardian(guardian).safe()), adminSafe); - assertEq(Root(root).wards(guardian), 1); - } - } + assertEq(address(_guardian.gateway()), gateway); + assertEq(address(_guardian.root()), root); + assertEq(address(_guardian.safe()), safe); + } + + function _verifyRestrictionManager(Deployment memory deployment) internal { + address manager = deployment.restrictionManager; + address root = deployment.root; + address poolManager = deployment.poolManager; + address deployer = deployment.deployer; + + RestrictionManager _restrictionManager = RestrictionManager(manager); + + assertEq(address(_restrictionManager.root()), root); + + assertEq(_restrictionManager.wards(root), 1); + assertEq(_restrictionManager.wards(poolManager), 1); + assertEq(_restrictionManager.wards(deployer), 0); + } + + function _verifyInvestmentManager(Deployment memory deployment) internal { + address manager = deployment.investmentManager; + address root = deployment.root; + address escrow = deployment.escrow; + address gateway = deployment.gateway; + address poolManager = deployment.poolManager; + address vaultFactory = deployment.vaultFactory; + address deployer = deployment.deployer; + + InvestmentManager _investmentManager = InvestmentManager(manager); + + assertEq(address(_investmentManager.root()), root); + assertEq(address(_investmentManager.escrow()), escrow); + assertEq(address(_investmentManager.gateway()), gateway); + assertEq(address(_investmentManager.poolManager()), poolManager); + + assertEq(_investmentManager.wards(root), 1); + assertEq(_investmentManager.wards(gateway), 1); + assertEq(_investmentManager.wards(vaultFactory), 1); + assertEq(_investmentManager.wards(deployer), 0); + } + + function _verifyPoolmanager(Deployment memory deployment) internal { + address manager = deployment.poolManager; + address escrow = deployment.escrow; + address gateway = deployment.gateway; + address investmentManager = deployment.investmentManager; + address trancheFactory = deployment.trancheFactory; + address vaultFactory = deployment.vaultFactory; + address gasService = deployment.gasService; + address root = deployment.root; + address deployer = deployment.deployer; + + PoolManager _poolManager = PoolManager(manager); + + assertEq(address(_poolManager.escrow()), escrow); + assertEq(address(_poolManager.gateway()), gateway); + assertEq(address(_poolManager.investmentManager()), investmentManager); + assertEq(address(_poolManager.trancheFactory()), trancheFactory); + assertEq(address(_poolManager.vaultFactory()), vaultFactory); + assertEq(address(_poolManager.gasService()), gasService); + + assertEq(_poolManager.wards(root), 1); + assertEq(_poolManager.wards(gateway), 1); + assertEq(_poolManager.wards(deployer), 0); + } + + function _verifyRouter(Deployment memory deployment) internal { + address router = deployment.centrifugeRouter; + address escrow = deployment.routerEscrow; + address gateway = deployment.gateway; + address root = deployment.root; + address deployer = deployment.deployer; + address poolManager = deployment.poolManager; + + CentrifugeRouter _router = CentrifugeRouter(router); + + assertEq(address(_router.gateway()), gateway); + assertEq(address(_router.escrow()), escrow); + assertEq(address(_router.poolManager()), poolManager); + + assertEq(_router.wards(root), 1); + assertEq(_router.wards(deployer), 0); + } + + function _verifyGateway(Deployment memory deployment) internal { + address payable gateway = payable(deployment.gateway); + address root = deployment.root; + address poolManager = deployment.poolManager; + address investmentManager = deployment.investmentManager; + address router = deployment.centrifugeRouter; + address gasService = deployment.gasService; + address adapter = deployment.adapter; + address guardian = deployment.guardian; + address deployer = deployment.deployer; + + Gateway _gateway = Gateway(gateway); + + assertEq(address(_gateway.root()), root); + assertEq(address(_gateway.poolManager()), poolManager); + assertEq(address(_gateway.investmentManager()), investmentManager); + assertEq(address(_gateway.gasService()), gasService); + + assertTrue(_gateway.payers(router)); + assertEq(_gateway.adapters(0), adapter); + assertEq(_gateway.quorum(), 1); + assertEq(_gateway.activeSessionId(), 0); + + assertEq(_gateway.wards(root), 1); + assertEq(_gateway.wards(guardian), 1); + assertEq(_gateway.wards(deployer), 0); + } + + function _verifyGasService(Deployment memory deployment) internal { + address gasService = deployment.gasService; + address root = deployment.root; + address gateway = deployment.gateway; + address deployer = deployment.deployer; + + GasService _gasService = GasService(gasService); + + assertEq(_gasService.wards(root), 1); + assertEq(_gasService.wards(gateway), 1); + assertEq(_gasService.wards(deployer), 0); + } + + function _verifyEscrow(Deployment memory deployment) internal { + address escrow = deployment.escrow; + address root = deployment.root; + address poolManager = deployment.poolManager; + address deployer = deployment.deployer; + + Escrow _escrow = Escrow(escrow); + + assertEq(_escrow.wards(root), 1); + assertEq(_escrow.wards(poolManager), 1); + assertEq(_escrow.wards(deployer), 0); + } + + function _verifyRouterEscrow(Deployment memory deployment) internal { + address escrow = deployment.routerEscrow; + address root = deployment.root; + address router = deployment.centrifugeRouter; + address deployer = deployment.deployer; + + Escrow _routerEscrow = Escrow(escrow); + + assertEq(_routerEscrow.wards(root), 1); + assertEq(_routerEscrow.wards(router), 1); + assertEq(_routerEscrow.wards(deployer), 0); + } + + function _verifyAxelarAdapter(Deployment memory deployment) internal { + address adapter = deployment.adapter; + address gateway = deployment.gateway; + address root = deployment.root; + address deployer = deployment.deployer; + address axelarGateway = deployment.axelarGateway; + address axelarGasService = deployment.axelarGasService; + + AxelarAdapter _adapter = AxelarAdapter(adapter); + assertEq(address(_adapter.gateway()), gateway); + assertEq(address(_adapter.axelarGateway()), axelarGateway); + assertEq(address(_adapter.axelarGasService()), axelarGasService); + + assertEq(_adapter.wards(root), 1); + assertEq(_adapter.wards(deployer), 0); + + assertEq(IAxelarContract(axelarGateway).contractId(), keccak256("axelar-gateway")); + assertEq(IAxelarContract(axelarGasService).contractId(), keccak256("axelar-gas-service")); + } + + function _verifyTrancheFactory(Deployment memory deployment) internal { + address trancheFactory = deployment.trancheFactory; + address root = deployment.root; + address poolManager = deployment.poolManager; + address deployer = deployment.deployer; + + TrancheFactory _trancheFactory = TrancheFactory(trancheFactory); + + assertEq(address(_trancheFactory.root()), root); + + assertEq(_trancheFactory.wards(root), 1); + assertEq(_trancheFactory.wards(poolManager), 1); + assertEq(_trancheFactory.wards(deployer), 0); + } + + function _verifyVaultFactory(Deployment memory deployment) internal { + address vaultFactory = deployment.vaultFactory; + address root = deployment.root; + address poolManager = deployment.poolManager; + address deployer = deployment.deployer; + + ERC7540VaultFactory _vaultFactory = ERC7540VaultFactory(vaultFactory); + + assertEq(address(_vaultFactory.root()), root); + assertEq(_vaultFactory.wards(root), 1); + assertEq(_vaultFactory.wards(poolManager), 1); + assertEq(_vaultFactory.wards(deployer), 0); + } + + function _verifyTransferProxyFactory(Deployment memory deployment) internal { + address transferProxyFactory = deployment.transferProxyFactory; + address root = deployment.root; + address poolManager = deployment.poolManager; + address deployer = deployment.deployer; + + TransferProxyFactory _transferProxyFactory = TransferProxyFactory(transferProxyFactory); + assertEq(address(_transferProxyFactory.root()), root); + assertEq(address(_transferProxyFactory.poolManager()), poolManager); + + assertEq(_transferProxyFactory.wards(root), 1); + assertEq(_transferProxyFactory.wards(deployer), 0); } function testAdminSigners() public { @@ -159,13 +344,13 @@ contract ForkTest is Test { bool isTestnet = abi.decode(deployments[i].parseRaw(".isTestnet"), (bool)); if (!isTestnet) { // Read deployment file - address adminSafe = _get(i, ".config.adminSafe"); + address adminSafe = _get(i, ".config.admin"); address[] memory adminSigners = abi.decode(deployments[i].parseRaw(".config.adminSigners"), (address[])); _loadFork(i); // Check Safe signers - SafeLike safe = SafeLike(adminSafe); + ISafe safe = ISafe(adminSafe); address[] memory signers = safe.getOwners(); assertEq(signers.length, adminSigners.length); for (uint256 j = 0; j < adminSigners.length; j++) { @@ -179,37 +364,51 @@ contract ForkTest is Test { } } + // can return deterministci address based on initialization code, deployer and the constructor params. function testDeterminism() public { if (vm.envOr("FORK_TESTS", false)) { for (uint256 i = 0; i < deployments.length; i++) { - if (i == 0) { - i++; - // Skipping ethereum-mainnet for now as the tranche token factory needs an update - // TODO: remove this after migrating ethereum-mainnet - continue; - } + bool isDeterministicallyDeployed = + abi.decode(deployments[i].parseRaw(".isDeterministicallyDeployed"), (bool)); + if (!isDeterministicallyDeployed) continue; + + // Read deployment file + address root = _get(i, ".contracts.root"); + address escrow = _get(i, ".contracts.escrow"); + address routerEscrow = _get(i, ".contracts.routerEscrow"); + address restrictionManager = _get(i, ".contracts.restrictionManager"); + address trancheFactory = _get(i, ".contracts.trancheFactory"); + address transferProxyFactory = _get(i, ".contracts.transferProxyFactory"); + _loadFork(i); bool isTestnet = abi.decode(deployments[i].parseRaw(".isTestnet"), (bool)); if (!isTestnet) { - // Read deployment file - address root = _get(i, ".contracts.root"); - address escrow = _get(i, ".contracts.escrow"); - address trancheFactory = _get(i, ".contracts.trancheFactory"); - _loadFork(i); - // Check address - assertEq(root, 0x498016d30Cd5f0db50d7ACE329C07313a0420502); - assertEq(escrow, 0xd595E1483c507E74E2E6A3dE8e7D08d8f6F74936); - assertEq(trancheFactory, 0x2d60cd1527073419423B14666E2D43C1Cf28B152); - - // Check bytecode - assertEq(keccak256(root.code), 0x47102707d876a808849bf1be9c8af0e58d889c65918ee3af3a95dd54fa389070); - assertEq(keccak256(escrow.code), 0xf54c8ad5a295c7d20a91165917fb20fbcd2952c625696710f8f9a012fcc8e042); - assertEq( - keccak256(trancheFactory.code), - 0x0f2863a7a7ffa6f3db8a3aab70ded9e170752a36734eca4a0ff19dc52ec5e97b - ); + assertEq(root, 0x0C1fDfd6a1331a875EA013F3897fc8a76ada5DfC); + assertEq(escrow, 0x0000000005F458Fd6ba9EEb5f365D83b7dA913dD); + assertEq(routerEscrow, 0x0F1b890fC6774Ef9b14e99de16302E24A6e7B4F7); + assertEq(restrictionManager, 0x4737C3f62Cc265e786b280153fC666cEA2fBc0c0); + assertEq(trancheFactory, 0xFa072fB96F737bdBCEa28c921d43c34d3a4Dbb6C); + assertEq(transferProxyFactory, 0xbe55eBC29344a26550E07EF59aeF791fA3b2A817); } + + // Check bytecode + assertEq(keccak256(root.code), 0xe3b8893b70f2552e1919f152cdcf860187d2dd89387f0c9f6b6e3f19f530e741); + assertEq(keccak256(escrow.code), 0x4cbd7efe2319295d7c29c38569ab8ff94d1dce284d8f678753e3c934427f889d); + assertEq( + keccak256(routerEscrow.code), 0x4cbd7efe2319295d7c29c38569ab8ff94d1dce284d8f678753e3c934427f889d + ); + assertEq( + keccak256(restrictionManager.code), + 0xd831f92a7a47bd72b65b00b9ad7dc3b417e2da5a7c90551f0480edead15497e1 + ); + assertEq( + keccak256(trancheFactory.code), 0xba57bbc9fd815f451d25952918142f10cea1c6d90d2fa0c94e9f856a318cf2a7 + ); + assertEq( + keccak256(transferProxyFactory.code), + 0x625180e41eba3fd52bb06958a14cee7dc2b12123015a95f353fe00ca4425201d + ); } } } @@ -227,4 +426,27 @@ contract ForkTest is Test { function _get(uint256 id, string memory key) internal view returns (address) { return abi.decode(deployments[id].parseRaw(key), (address)); } + + function _parse(uint256 id) internal view returns (Deployment memory) { + return Deployment( + _get(id, ".contracts.root"), + _get(id, ".contracts.guardian"), + _get(id, ".contracts.restrictionManager"), + _get(id, ".contracts.investmentManager"), + _get(id, ".contracts.poolManager"), + _get(id, ".contracts.centrifugeRouter"), + payable(_get(id, ".contracts.gateway")), + _get(id, ".contracts.gasService"), + _get(id, ".contracts.escrow"), + _get(id, ".contracts.routerEscrow"), + _get(id, ".contracts.adapter"), + _get(id, ".contracts.trancheFactory"), + _get(id, ".contracts.erc7540VaultFactory"), + _get(id, ".contracts.transferProxyFactory"), + _get(id, ".config.deployer"), + _get(id, ".config.admin"), + _get(id, ".config.adapter.axelarGateway"), + _get(id, ".config.adapter.axelarGasService") + ); + } } diff --git a/test/integration/Admin.t.sol b/test/integration/Admin.t.sol index bf8f09c4..fa1f54f4 100644 --- a/test/integration/Admin.t.sol +++ b/test/integration/Admin.t.sol @@ -54,7 +54,7 @@ contract AdminTest is BaseTest { address recipient, uint128 amount ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(amount > 0); vm.assume(assetId != 0); vm.assume(recipient != address(0)); @@ -80,7 +80,7 @@ contract AdminTest is BaseTest { address recipient, uint128 amount ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(amount > 0); vm.assume(assetId != 0); vm.assume(recipient != address(0)); @@ -109,7 +109,7 @@ contract AdminTest is BaseTest { address recipient, uint128 amount ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(amount > 0); vm.assume(assetId != 0); vm.assume(recipient != address(investmentManager.escrow())); diff --git a/test/integration/AssetShareConversion.t.sol b/test/integration/AssetShareConversion.t.sol index 707f822a..5bdae07c 100644 --- a/test/integration/AssetShareConversion.t.sol +++ b/test/integration/AssetShareConversion.t.sol @@ -16,8 +16,8 @@ contract AssetShareConversionTest is BaseTest { ERC7540Vault vault = ERC7540Vault(vault_); ITranche tranche = ITranche(address(ERC7540Vault(vault_).share())); - assertEq(vault.priceLastUpdated(), 0); - assertEq(vault.pricePerShare(), 0); + assertEq(vault.priceLastUpdated(), block.timestamp); + assertEq(vault.pricePerShare(), 1e6); centrifugeChain.updateTranchePrice(poolId, trancheId, assetId, 1e18, uint64(block.timestamp)); assertEq(vault.priceLastUpdated(), uint64(block.timestamp)); assertEq(vault.pricePerShare(), 1e6); @@ -88,8 +88,8 @@ contract AssetShareConversionTest is BaseTest { // assert share/asset conversion assertEq(tranche.totalSupply(), 100000000); assertEq(vault.totalAssets(), 100000000000000000000); - assertEq(vault.convertToShares(100000000000000000000), 100000000); // tranche tokens have 12 less decimals than - // assets + // tranche tokens have 12 less decimals than asset + assertEq(vault.convertToShares(100000000000000000000), 100000000); assertEq(vault.convertToAssets(vault.convertToShares(100000000000000000000)), 100000000000000000000); assertEq(vault.pricePerShare(), 1e18); @@ -97,8 +97,8 @@ contract AssetShareConversionTest is BaseTest { centrifugeChain.updateTranchePrice(poolId, trancheId, assetId, 1200000000000000000, uint64(block.timestamp)); assertEq(vault.totalAssets(), 120000000000000000000); - assertEq(vault.convertToShares(120000000000000000000), 100000000); // tranche tokens have 12 less decimals than - // assets + // tranche tokens have 12 less decimals than assets + assertEq(vault.convertToShares(120000000000000000000), 100000000); assertEq(vault.convertToAssets(vault.convertToShares(120000000000000000000)), 120000000000000000000); assertEq(vault.pricePerShare(), 1.2e18); } diff --git a/test/integration/Burn.t.sol b/test/integration/Burn.t.sol index c7bb0de3..cca1efa3 100644 --- a/test/integration/Burn.t.sol +++ b/test/integration/Burn.t.sol @@ -12,8 +12,8 @@ contract BurnTest is BaseTest { ITranche tranche = ITranche(address(vault.share())); root.relyContract(address(tranche), self); // give self auth permissions - centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max); // add investor as - // member + // add investor as member + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max); tranche.mint(investor, amount); root.denyContract(address(tranche), self); // remove auth permissions from self diff --git a/test/integration/CentrifugeRouter.t.sol b/test/integration/CentrifugeRouter.t.sol index 0631d503..e26527c6 100644 --- a/test/integration/CentrifugeRouter.t.sol +++ b/test/integration/CentrifugeRouter.t.sol @@ -31,7 +31,7 @@ contract CentrifugeRouterTest is BaseTest { vm.expectRevert(bytes("ERC7540Vault/invalid-owner")); router.requestDeposit{value: 1 wei}(vault_, amount, self, self, 1 wei); - router.open(vault_); + router.enable(vault_); vm.expectRevert(bytes("InvestmentManager/transfer-not-allowed")); router.requestDeposit{value: 1 wei}(vault_, amount, self, self, 1 wei); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); @@ -42,6 +42,12 @@ contract CentrifugeRouterTest is BaseTest { router.requestDeposit{value: gas}(vault_, amount, self, self, gas); erc20.approve(vault_, amount); + address nonOwner = makeAddr("NonOwner"); + vm.deal(nonOwner, 10 ether); + vm.prank(nonOwner); + vm.expectRevert(bytes("CentrifugeRouter/invalid-owner")); + router.requestDeposit{value: gas}(vault_, amount, self, self, gas); + router.requestDeposit{value: gas}(vault_, amount, self, self, gas); assertEq(address(gateway).balance, GATEWAY_INITIAL_BALACE + GAS_BUFFER); @@ -71,28 +77,32 @@ contract CentrifugeRouterTest is BaseTest { assertApproxEqAbs(erc20.balanceOf(address(escrow)), amount, 1); } - function testOpenCloseVaults() public { + function testEnableDisableVaults() public { address vault_ = deploySimpleVault(); ERC7540Vault vault = ERC7540Vault(vault_); vm.label(vault_, "vault"); root.veto(address(router)); vm.expectRevert(bytes("ERC7540Vault/not-endorsed")); - router.open(vault_); + router.enable(vault_); assertEq(vault.isOperator(address(this), address(router)), false); + assertEq(router.isEnabled(vault_, address(this)), false); root.endorse(address(router)); - router.open(vault_); + router.enable(vault_); assertEq(vault.isOperator(address(this), address(router)), true); + assertEq(router.isEnabled(vault_, address(this)), true); root.veto(address(router)); vm.expectRevert(bytes("ERC7540Vault/not-endorsed")); - router.close(vault_); + router.disable(vault_); assertEq(vault.isOperator(address(this), address(router)), true); + assertEq(router.isEnabled(vault_, address(this)), true); root.endorse(address(router)); - router.close(vault_); + router.disable(vault_); assertEq(vault.isOperator(address(this), address(router)), false); + assertEq(router.isEnabled(vault_, address(this)), false); } function testRouterAsyncDeposit(uint256 amount) public { @@ -106,7 +116,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.mint(self, amount); erc20.approve(address(router), amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); - router.openLockDepositRequest(vault_, amount); + router.enableLockDepositRequest(vault_, amount); uint256 fuel = estimateGas(); @@ -145,7 +155,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.mint(self, amount); erc20.approve(vault_, amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); - router.open(vault_); + router.enable(vault_); uint256 fuel = estimateGas(); router.requestDeposit{value: fuel}(vault_, amount, self, self, fuel); @@ -154,9 +164,15 @@ contract CentrifugeRouterTest is BaseTest { (uint128 tranchePayout) = fulfillDepositRequest(vault, assetId, amount, self); ITranche tranche = ITranche(address(vault.share())); router.claimDeposit(vault_, self, self); + tranche.approve(address(router), tranchePayout); + + address nonOwner = makeAddr("NonOwner"); + vm.deal(nonOwner, 10 ether); + vm.prank(nonOwner); + vm.expectRevert(bytes("CentrifugeRouter/invalid-owner")); + router.requestRedeem{value: fuel}(vault_, tranchePayout, self, self, fuel); // redeem - tranche.approve(address(router), tranchePayout); router.requestRedeem{value: fuel}(vault_, tranchePayout, self, self, fuel); (uint128 assetPayout) = fulfillRedeemRequest(vault, assetId, tranchePayout, self); assertApproxEqAbs(tranche.balanceOf(self), 0, 1); @@ -177,8 +193,8 @@ contract CentrifugeRouterTest is BaseTest { uint256 fuel = estimateGas(); (ERC20 erc20X, ERC20 erc20Y, ERC7540Vault vault1, ERC7540Vault vault2) = setUpMultipleVaults(amount1, amount2); - router.open(address(vault1)); - router.open(address(vault2)); + router.enable(address(vault1)); + router.enable(address(vault2)); router.requestDeposit{value: fuel}(address(vault1), amount1, self, self, fuel); router.requestDeposit{value: fuel}(address(vault2), amount2, self, self, fuel); @@ -218,8 +234,8 @@ contract CentrifugeRouterTest is BaseTest { // deposit (ERC20 erc20X, ERC20 erc20Y, ERC7540Vault vault1, ERC7540Vault vault2) = setUpMultipleVaults(amount1, amount2); - router.open(address(vault1)); - router.open(address(vault2)); + router.enable(address(vault1)); + router.enable(address(vault2)); router.requestDeposit{value: fuel}(address(vault1), amount1, self, self, fuel); router.requestDeposit{value: fuel}(address(vault2), amount2, self, self, fuel); @@ -265,7 +281,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.mint(self, amount); erc20.approve(address(router), amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); - router.open(address(vault_)); + router.enable(address(vault_)); router.lockDepositRequest(vault_, amount, self, self); // multicall @@ -294,7 +310,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.mint(self, amount); erc20.approve(vault_, amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); - router.open(vault_); + router.enable(vault_); uint256 fuel = estimateGas(); router.requestDeposit{value: fuel}(vault_, amount, self, self, fuel); @@ -325,8 +341,8 @@ contract CentrifugeRouterTest is BaseTest { (ERC20 erc20X, ERC20 erc20Y, ERC7540Vault vault1, ERC7540Vault vault2) = setUpMultipleVaults(amount1, amount2); - router.open(address(vault1)); - router.open(address(vault2)); + router.enable(address(vault1)); + router.enable(address(vault2)); uint256 gas = estimateGas(); bytes[] memory calls = new bytes[](2); @@ -400,7 +416,7 @@ contract CentrifugeRouterTest is BaseTest { address investor = makeAddr("investor"); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max); - router.open(vault_); + router.enable(vault_); erc20.mint(investor, amount); vm.startPrank(investor); @@ -430,7 +446,7 @@ contract CentrifugeRouterTest is BaseTest { address investor = makeAddr("investor"); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), investor, type(uint64).max); - router.open(vault_); + router.enable(vault_); erc20.mint(investor, amount); vm.startPrank(investor); @@ -462,7 +478,7 @@ contract CentrifugeRouterTest is BaseTest { // Investor locks deposit request and enables permissionless lcaiming vm.startPrank(investor); erc20.approve(address(router), amount); - router.openLockDepositRequest(vault_, amount); + router.enableLockDepositRequest(vault_, amount); vm.stopPrank(); // Anyone else can execute the request and claim the deposit @@ -493,6 +509,90 @@ contract CentrifugeRouterTest is BaseTest { assertEq(erc20.balanceOf(investor), assetPayout); } + function testEnableLockDepositRequest(uint256 wrappedAmount, uint256 underlyingAmount) public { + wrappedAmount = uint128(bound(wrappedAmount, 4, MAX_UINT128)); + vm.assume(wrappedAmount % 2 == 0); + + underlyingAmount = uint128(bound(underlyingAmount, 4, MAX_UINT128)); + vm.assume(underlyingAmount % 2 == 0); + + vm.assume(wrappedAmount != underlyingAmount); + vm.assume(wrappedAmount < underlyingAmount); + + address routerEscrowAddress = address(routerEscrow); + + MockERC20Wrapper wrapper = new MockERC20Wrapper(address(erc20)); + address vault_ = deployVault( + 5, 6, restrictionManager, "name", "symbol", bytes16(bytes("1")), defaultAssetId, address(wrapper) + ); + vm.label(vault_, "vault"); + + erc20.mint(self, underlyingAmount); + erc20.approve(address(router), underlyingAmount); + wrapper.mint(self, wrappedAmount); + wrapper.approve(address(router), wrappedAmount); + + // Testing partial of wrapped asset balance + uint256 wrappedBalance = wrapper.balanceOf(self); + uint256 deposit = wrappedBalance / 2; + uint256 remainingWrapped = wrappedBalance / 2; + uint256 remainingUnderlying = erc20.balanceOf(self); + uint256 escrowBalance = deposit; + router.enableLockDepositRequest(vault_, deposit); + assertEq(wrapper.balanceOf(routerEscrowAddress), escrowBalance); + assertEq(wrapper.balanceOf(self), remainingWrapped); + assertEq(erc20.balanceOf(routerEscrowAddress), 0); + assertEq(erc20.balanceOf(self), remainingUnderlying); + + // Testing more than the wrapped asset balance + wrappedBalance = wrapper.balanceOf(self); + deposit = wrappedBalance + 1; + remainingWrapped = wrappedBalance; + remainingUnderlying = erc20.balanceOf(self) - deposit; + escrowBalance = escrowBalance + deposit; + router.enableLockDepositRequest(vault_, deposit); + assertEq(wrapper.balanceOf(routerEscrowAddress), escrowBalance); // amount was used from the underlying asset + // and wrapped + assertEq(wrapper.balanceOf(self), remainingWrapped); + assertEq(erc20.balanceOf(routerEscrowAddress), 0); + assertEq(erc20.balanceOf(self), remainingUnderlying); + + // Testing whole wrapped amount + wrappedBalance = wrapper.balanceOf(self); + deposit = wrappedBalance; + remainingUnderlying = erc20.balanceOf(self); + escrowBalance = escrowBalance + deposit; + router.enableLockDepositRequest(vault_, deposit); + assertEq(wrapper.balanceOf(routerEscrowAddress), escrowBalance); + assertEq(wrapper.balanceOf(self), 0); + assertEq(erc20.balanceOf(routerEscrowAddress), 0); + assertEq(erc20.balanceOf(self), remainingUnderlying); + + // Testing more than the underlying + uint256 underlyingBalance = erc20.balanceOf(self); + deposit = underlyingBalance + 1; + remainingUnderlying = underlyingBalance; + vm.expectRevert(bytes("SafeTransferLib/safe-transfer-from-failed")); + router.enableLockDepositRequest(vault_, deposit); + assertEq(wrapper.balanceOf(routerEscrowAddress), escrowBalance); + assertEq(wrapper.balanceOf(self), 0); + assertEq(erc20.balanceOf(routerEscrowAddress), 0); + assertEq(erc20.balanceOf(self), remainingUnderlying); + + // Testing all the underlying + deposit = erc20.balanceOf(self); + escrowBalance = escrowBalance + deposit; + router.enableLockDepositRequest(vault_, deposit); + assertEq(wrapper.balanceOf(routerEscrowAddress), escrowBalance); + assertEq(wrapper.balanceOf(self), 0); + assertEq(erc20.balanceOf(routerEscrowAddress), 0); + assertEq(erc20.balanceOf(self), 0); + + // Testing with empty balance for both wrapped and underlying + vm.expectRevert(bytes("CentrifugeRouter/zero-balance")); + router.enableLockDepositRequest(vault_, wrappedAmount); + } + function testMultipleTopUpScenarios(uint256 amount) public { amount = uint128(bound(amount, 4, MAX_UINT128)); vm.assume(amount % 2 == 0); @@ -505,7 +605,7 @@ contract CentrifugeRouterTest is BaseTest { centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); erc20.approve(vault_, amount); - router.open(vault_); + router.enable(vault_); uint256 gasLimit = estimateGas(); uint256 lessGas = gasLimit - 1; @@ -520,7 +620,7 @@ contract CentrifugeRouterTest is BaseTest { router.requestDeposit{value: lessGas}(vault_, amount, self, self, lessGas); vm.expectRevert("PoolManager/unknown-vault"); - router.requestDeposit{value: lessGas}(makeAddr("maliciousVault"), amount, self, makeAddr("owner"), lessGas); + router.requestDeposit{value: lessGas}(makeAddr("maliciousVault"), amount, self, self, lessGas); vm.expectRevert("PoolManager/unknown-vault"); router.requestDeposit{value: lessGas}(makeAddr("maliciousVault"), amount, self, self, lessGas); @@ -608,7 +708,7 @@ contract CentrifugeRouterTest is BaseTest { vm.startPrank(investor); erc20.approve(address(router), amount); vm.expectRevert(bytes("CentrifugeRouter/unauthorized-sender")); - router.openLockDepositRequest(vault_, amount); + router.enableLockDepositRequest(vault_, amount); vm.stopPrank(); } @@ -630,7 +730,7 @@ contract CentrifugeRouterTest is BaseTest { vm.startPrank(investor); erc20.approve(address(router), amount); vm.expectRevert(bytes("CentrifugeRouter/already-initiated")); - router.openLockDepositRequest(vault_, amount); + router.enableLockDepositRequest(vault_, amount); vm.stopPrank(); } diff --git a/test/integration/Deploy.t.sol b/test/integration/Deploy.t.sol index 739acf75..bfd071f5 100644 --- a/test/integration/Deploy.t.sol +++ b/test/integration/Deploy.t.sol @@ -8,6 +8,7 @@ import {MockCentrifugeChain} from "test/mocks/MockCentrifugeChain.sol"; import {Escrow} from "src/Escrow.sol"; import {Guardian} from "src/admin/Guardian.sol"; import {MockAdapter} from "test/mocks/MockAdapter.sol"; +import {MockSafe} from "test/mocks/MockSafe.sol"; import {PoolManager, Pool} from "src/PoolManager.sol"; import {ERC20} from "src/token/ERC20.sol"; import {Tranche} from "src/token/Tranche.sol"; @@ -36,6 +37,7 @@ contract DeployTest is Test, Deployer { using MathLib for uint256; uint8 constant PRICE_DECIMALS = 18; + address self; address[] accounts; PermissionlessAdapter adapter; @@ -77,6 +79,7 @@ contract DeployTest is Test, Deployer { assertEq(gasService.wards(self), 0); assertEq(gateway.wards(self), 0); assertEq(adapter.wards(self), 0); + assertEq(router.wards(self), 0); } function testAdminSetup(address nonAdmin, address nonPauser) public { @@ -96,7 +99,7 @@ contract DeployTest is Test, Deployer { address gateway_ = address(gateway); address guardian_ = address(guardian); - assertEq(gasService.wards(poolManager_), 1); + assertEq(gasService.wards(gateway_), 1); assertEq(escrow.wards(poolManager_), 1); assertEq(WardLike(vaultFactory).wards(poolManager_), 1); assertEq(WardLike(restrictionManager).wards(poolManager_), 1); @@ -134,6 +137,7 @@ contract DeployTest is Test, Deployer { assertEq(address(investmentManager.gateway()), address(gateway)); assertEq(gateway.adapters(0), address(adapter)); + assertTrue(gateway.payers(address(router))); } function testEndorsements() public { @@ -148,7 +152,7 @@ contract DeployTest is Test, Deployer { bytes16 trancheId, uint8 decimals ) public { - vm.assume(decimals <= 18 && decimals > 0); + decimals = uint8(bound(decimals, 2, 18)); uint128 price = uint128(2 * 10 ** PRICE_DECIMALS); //TODO: fuzz price uint256 amount = 1000 * 10 ** erc20.decimals(); uint64 validUntil = uint64(block.timestamp + 1000 days); @@ -268,10 +272,12 @@ contract DeployTest is Test, Deployer { poolManager.addTranche(poolId, trancheId, tokenName, tokenSymbol, decimals, hook); poolManager.addAsset(1, address(erc20)); poolManager.allowAsset(poolId, 1); + poolManager.updateTranchePrice(poolId, trancheId, 1, uint128(10 ** 18), uint64(block.timestamp)); vm.stopPrank(); poolManager.deployTranche(poolId, trancheId); address vault = poolManager.deployVault(poolId, trancheId, address(erc20)); + return vault; } diff --git a/test/integration/Deposit.t.sol b/test/integration/Deposit.t.sol index dcc15ecf..c23c347f 100644 --- a/test/integration/Deposit.t.sol +++ b/test/integration/Deposit.t.sol @@ -121,7 +121,7 @@ contract DepositTest is BaseTest { // minting or depositing more should revert vm.expectRevert(bytes("InvestmentManager/exceeds-deposit-limits")); vault.mint(1, self); - vm.expectRevert(bytes("InvestmentManager/exceeds-deposit-limits")); + vm.expectRevert(bytes("InvestmentManager/exceeds-max-deposit")); vault.deposit(2, self, self); // remainder is rounding difference @@ -168,7 +168,7 @@ contract DepositTest is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, assets, firstTranchePayout ); - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1400000000000000000); // second trigger executed collectInvest of the second 50% at a price of 1.2 @@ -177,7 +177,7 @@ contract DepositTest is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, assets, secondTranchePayout ); - (, depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1292307679384615384); // assert deposit & mint values adjusted @@ -392,7 +392,11 @@ contract DepositTest is BaseTest { // endorse router root.endorse(router); - vm.startPrank(router); // try to claim deposit on behalf of user and set the wrong user as receiver + + vm.startPrank(router); + vm.expectRevert(bytes("ERC7540Vault/cannot-set-self-as-operator")); + vault.setEndorsedOperator(address(router), true); + vault.setEndorsedOperator(address(this), true); vault.deposit(amount, receiver, address(this)); vm.stopPrank(); @@ -435,7 +439,7 @@ contract DepositTest is BaseTest { assertEq(vault.maxMint(self), firstTranchePayout); // deposit price should be ~1.2*10**18 - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1200000000000000000); // trigger executed collectInvest of the second 50% at a price of 1.4 @@ -505,7 +509,7 @@ contract DepositTest is BaseTest { assertEq(vault.maxMint(self), firstTranchePayout); // deposit price should be ~1.2*10**18 - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1200000019200000307); // trigger executed collectInvest of the second 50% at a price of 1.4 @@ -581,7 +585,7 @@ contract DepositTest is BaseTest { assertEq(vault.maxMint(self), shares); // lp price is set to the deposit price - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1200000000000000000); } @@ -627,7 +631,7 @@ contract DepositTest is BaseTest { assertEq(vault.maxMint(self), shares); // lp price is set to the deposit price - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1200000000000000000); } @@ -710,7 +714,7 @@ contract DepositTest is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, assets, firstTranchePayout ); - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1400000000000000000); // second trigger executed collectInvest of the second 50% at a price of 1.2 @@ -719,7 +723,7 @@ contract DepositTest is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, assets, secondTranchePayout ); - (, depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1292307679384615384); // assert deposit & mint values adjusted @@ -753,7 +757,7 @@ contract DepositTest is BaseTest { centrifugeChain.isFulfilledDepositRequest( vault.poolId(), vault.trancheId(), investor.toBytes32(), assetId, uint128(amount), uint128(amount) ); - vm.expectRevert(bytes("InvestmentManager/tranche-token-amount-is-zero")); + vm.expectRevert(bytes("InvestmentManager/exceeds-max-deposit")); vault.deposit(amount, investor); vm.prank(investor); diff --git a/test/integration/DepositRedeem.t.sol b/test/integration/DepositRedeem.t.sol index acfbb5e8..76df5372 100644 --- a/test/integration/DepositRedeem.t.sol +++ b/test/integration/DepositRedeem.t.sol @@ -41,7 +41,7 @@ contract DepositRedeem is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, assets, firstTranchePayout ); - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1400000000000000000); // second trigger executed collectInvest of the second 50% at a price of 1.2 @@ -50,7 +50,7 @@ contract DepositRedeem is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, assets, secondTranchePayout ); - (, depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1292307679384615384); // assert deposit & mint values adjusted diff --git a/test/integration/Determinism.t.sol b/test/integration/Determinism.t.sol new file mode 100644 index 00000000..cef6a986 --- /dev/null +++ b/test/integration/Determinism.t.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// import {Root} from "src/Root.sol"; +// import {RestrictionManager} from "src/token/RestrictionManager.sol"; +// import {Escrow} from "src/Escrow.sol"; +// import {TrancheFactory} from "src/factories/TrancheFactory.sol"; +// import {TransferProxyFactory} from "src/factories/TransferProxyFactory.sol"; +// import "forge-std/Test.sol"; + +// contract DeterminismTest is Test { +// address constant CREATE2_DEPLOYER = 0x4e59b44847b379578588920cA78FbF26c0B4956C; +// address constant MAINNET_DEPLOYER = 0x7270b20603FbB3dF0921381670fbd62b9991aDa4; +// bytes32 constant MAINNET_SALT = 0x7270b20603fbb3df0921381670fbd62b9991ada4b17953a73f70fdff36730018; +// uint256 internal constant DELAY = 48 hours; + +// function testNewDeploymentDeterminism() public { +// address escrow = +// _deploy(MAINNET_SALT, abi.encodePacked(type(Escrow).creationCode, +// abi.encode(address(MAINNET_DEPLOYER)))); +// address routerEscrow = _deploy( +// keccak256(abi.encodePacked(MAINNET_SALT, "escrow2")), +// abi.encodePacked(type(Escrow).creationCode, abi.encode(address(MAINNET_DEPLOYER))) +// ); +// address root = _deploy( +// MAINNET_SALT, +// abi.encodePacked(type(Root).creationCode, abi.encode(address(escrow), DELAY, MAINNET_DEPLOYER)) +// ); +// address restrictionManager = _deploy( +// MAINNET_SALT, +// abi.encodePacked(type(RestrictionManager).creationCode, abi.encode(address(root), MAINNET_DEPLOYER)) +// ); +// address trancheFactory = _deploy( +// MAINNET_SALT, +// abi.encodePacked(type(TrancheFactory).creationCode, abi.encode(address(root), MAINNET_DEPLOYER)) +// ); +// address transferProxyFactory = _deploy( +// MAINNET_SALT, +// abi.encodePacked(type(TransferProxyFactory).creationCode, abi.encode(address(root), MAINNET_DEPLOYER)) +// ); + +// // Check the addresses remain fixed +// assertEq(escrow, 0x0000000005F458Fd6ba9EEb5f365D83b7dA913dD, "DeterminismTest/escrow-address-mismatch"); +// assertEq( +// routerEscrow, 0x0F1b890fC6774Ef9b14e99de16302E24A6e7B4F7, +// "DeterminismTest/router-escrow-address-mismatch" +// ); +// assertEq(root, 0x0C1fDfd6a1331a875EA013F3897fc8a76ada5DfC, "DeterminismTest/root-address-mismatch"); +// assertEq( +// restrictionManager, +// 0x4737C3f62Cc265e786b280153fC666cEA2fBc0c0, +// "DeterminismTest/restriction-manager-address-mismatch" +// ); +// assertEq( +// trancheFactory, +// 0xFa072fB96F737bdBCEa28c921d43c34d3a4Dbb6C, +// "DeterminismTest/tranche-factory-address-mismatch" +// ); +// assertEq( +// transferProxyFactory, +// 0xbe55eBC29344a26550E07EF59aeF791fA3b2A817, +// "DeterminismTest/transfer-proxy-factory-address-mismatch" +// ); + +// // Check the bytecode of any of the deterministically deployed contracts has not been modified +// assertEq( +// keccak256(escrow.code), +// 0x4cbd7efe2319295d7c29c38569ab8ff94d1dce284d8f678753e3c934427f889d, +// "DeterminismTest/escrow-bytecode-mismatch" +// ); +// assertEq( +// keccak256(routerEscrow.code), +// 0x4cbd7efe2319295d7c29c38569ab8ff94d1dce284d8f678753e3c934427f889d, +// "DeterminismTest/router-escrow-bytecode-mismatch" +// ); +// assertEq( +// keccak256(root.code), +// 0xe3b8893b70f2552e1919f152cdcf860187d2dd89387f0c9f6b6e3f19f530e741, +// "DeterminismTest/root-bytecode-mismatch" +// ); +// assertEq( +// keccak256(restrictionManager.code), +// 0xd831f92a7a47bd72b65b00b9ad7dc3b417e2da5a7c90551f0480edead15497e1, +// "DeterminismTest/restriction-manager-bytecode-mismatch" +// ); +// assertEq( +// keccak256(trancheFactory.code), +// 0xba57bbc9fd815f451d25952918142f10cea1c6d90d2fa0c94e9f856a318cf2a7, +// "DeterminismTest/tranche-factory-bytecode-mismatch" +// ); +// assertEq( +// keccak256(transferProxyFactory.code), +// 0x625180e41eba3fd52bb06958a14cee7dc2b12123015a95f353fe00ca4425201d, +// "DeterminismTest/transfer-proxy-factory-bytecode-mismatch" +// ); +// } + +// /// @dev Deploy the contract using the CREATE2 Deployer Proxy (provided by anvil) +// function _deploy(bytes32 salt, bytes memory creationCode) public returns (address) { +// (bool success,) = address(CREATE2_DEPLOYER).call(abi.encodePacked(salt, creationCode)); +// require(success, "failed-deployment"); +// return _getAddress(salt, creationCode); +// } + +// /// @dev Precompute a contract address that is deployed with the CREATE2Deployer +// function _getAddress(bytes32 salt, bytes memory creationCode) internal pure returns (address) { +// return address( +// uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), CREATE2_DEPLOYER, salt, +// keccak256(creationCode))))) +// ); +// } +// } diff --git a/test/integration/Gateway.t.sol b/test/integration/Gateway.t.sol index 3b967900..5e2f5bbb 100644 --- a/test/integration/Gateway.t.sol +++ b/test/integration/Gateway.t.sol @@ -57,6 +57,19 @@ contract GatewayTest is BaseTest { assertEq(poolManager.isAllowedAsset(poolId, address(newAsset)), true); } + function testBatchedMessageWithLengthProvidedButNoMessageBytes() public { + uint64 poolId = 999; + uint128 assetId = defaultAssetId + 1; + MockERC20 newAsset = deployMockERC20("newAsset", "NEW", 18); + bytes memory _addPool = abi.encodePacked(uint8(MessagesLib.Call.AddPool), poolId); + + bytes memory _message = + abi.encodePacked(uint8(MessagesLib.Call.Batch), uint16(_addPool.length), _addPool, uint16(8)); + + vm.expectRevert(bytes("Gateway/corrupted-message")); + centrifugeChain.execute(_message); + } + function testRecursiveBatchedMessageFails() public { uint64 poolId = 999; uint128 assetId = defaultAssetId + 1; diff --git a/test/integration/LocalAdapter.sol b/test/integration/LocalAdapter.sol index a0a7dc6a..d1fc12ca 100644 --- a/test/integration/LocalAdapter.sol +++ b/test/integration/LocalAdapter.sol @@ -34,10 +34,7 @@ contract LocalAdapter is Auth, IAdapter { event File(bytes32 indexed what, address addr); event File(bytes32 indexed what, string data); - constructor() { - wards[msg.sender] = 1; - emit Rely(msg.sender); - } + constructor() Auth(msg.sender) {} // --- Administrative --- function file(bytes32 what, address data) external { diff --git a/test/integration/Operator.t.sol b/test/integration/Operator.t.sol index 66280c09..c13a7977 100644 --- a/test/integration/Operator.t.sol +++ b/test/integration/Operator.t.sol @@ -30,6 +30,10 @@ contract OperatorTest is BaseTest { vm.expectRevert(bytes("ERC7540Vault/invalid-owner")); vault.requestDeposit(amount, investor, investor); + vm.prank(investor); + vm.expectRevert(bytes("ERC7540Vault/cannot-set-self-as-operator")); + vault.setOperator(investor, true); + assertEq(vault.isOperator(investor, operator), false); vm.prank(investor); vault.setOperator(operator, true); @@ -96,20 +100,44 @@ contract OperatorTest is BaseTest { vault.DOMAIN_SEPARATOR(), keccak256( abi.encode( - vault.AUTHORIZE_OPERATOR_TYPEHASH(), controller, operator, true, deadline, bytes32("nonce") + vault.AUTHORIZE_OPERATOR_TYPEHASH(), + controller, + controller, + true, + bytes32("nonce"), + deadline ) ) ) ) ); bytes memory signature = abi.encodePacked(r, s, v); + vm.prank(controller); + vm.expectRevert(bytes("ERC7540Vault/cannot-set-self-as-operator")); + vault.authorizeOperator(controller, controller, true, bytes32("nonce"), deadline, signature); + + (v, r, s) = vm.sign( + controllerPk, + keccak256( + abi.encodePacked( + "\x19\x01", + vault.DOMAIN_SEPARATOR(), + keccak256( + abi.encode( + vault.AUTHORIZE_OPERATOR_TYPEHASH(), controller, operator, true, bytes32("nonce"), deadline + ) + ) + ) + ) + ); + signature = abi.encodePacked(r, s, v); delete r; delete s; delete v; assertEq(vault.isOperator(controller, operator), false); vm.prank(operator); - vault.authorizeOperator(controller, operator, true, deadline, bytes32("nonce"), signature); + vault.authorizeOperator(controller, operator, true, bytes32("nonce"), deadline, signature); assertEq(vault.isOperator(controller, operator), true); vm.prank(operator); @@ -221,7 +249,7 @@ contract OperatorTest is BaseTest { vm.expectRevert(bytes("ERC7540Vault/authorization-used")); vm.prank(operator); - vault.authorizeOperator(controller, operator, true, deadline, nonce, signature); + vault.authorizeOperator(controller, operator, true, nonce, deadline, signature); assertEq(vault.isOperator(controller, operator), false); } } diff --git a/test/integration/PassthroughAdapter.sol b/test/integration/PassthroughAdapter.sol index 337940a6..546e04d4 100644 --- a/test/integration/PassthroughAdapter.sol +++ b/test/integration/PassthroughAdapter.sol @@ -33,10 +33,7 @@ contract PassthroughAdapter is Auth, IAdapter { event File(bytes32 indexed what, address addr); event File(bytes32 indexed what, string data); - constructor() { - wards[msg.sender] = 1; - emit Rely(msg.sender); - } + constructor() Auth(msg.sender) {} // --- Administrative --- function file(bytes32 what, address addr) external auth { diff --git a/test/integration/Redeem.t.sol b/test/integration/Redeem.t.sol index 8be3c690..8a668cc4 100644 --- a/test/integration/Redeem.t.sol +++ b/test/integration/Redeem.t.sol @@ -80,7 +80,7 @@ contract RedeemTest is BaseTest { // withdrawing or redeeming more should revert vm.expectRevert(bytes("InvestmentManager/exceeds-redeem-limits")); vault.withdraw(2, investor, self); - vm.expectRevert(bytes("InvestmentManager/exceeds-redeem-limits")); + vm.expectRevert(bytes("InvestmentManager/exceeds-max-redeem")); vault.redeem(2, investor, self); } @@ -162,9 +162,10 @@ contract RedeemTest is BaseTest { ITranche tranche = ITranche(address(vault.share())); deposit(vault_, self, amount * 2); // deposit funds first + vm.expectRevert(bytes("InvestmentManager/no-pending-redeem-request")); + vault.cancelRedeemRequest(0, self); + vault.requestRedeem(amount, address(this), address(this)); - assertEq(tranche.balanceOf(address(escrow)), amount); - assertEq(tranche.balanceOf(self), amount); // will fail - user not member centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, uint64(block.timestamp)); @@ -173,6 +174,9 @@ contract RedeemTest is BaseTest { vault.cancelRedeemRequest(0, self); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); + assertEq(tranche.balanceOf(address(escrow)), amount); + assertEq(tranche.balanceOf(self), amount); + // check message was send out to centchain vault.cancelRedeemRequest(0, self); bytes memory cancelOrderMessage = abi.encodePacked( @@ -374,7 +378,7 @@ contract RedeemTest is BaseTest { poolId, trancheId, bytes32(bytes20(self)), _assetId, uint128(investmentAmount), shares ); - (, uint256 depositPrice,,,,,,,,) = investmentManager.investments(address(vault), self); + (,, uint256 depositPrice,,,,,,,) = investmentManager.investments(address(vault), self); assertEq(depositPrice, 1000000000000000000); // assert deposit & mint values adjusted diff --git a/test/invariant/LiquidityPoolInvariants.t.sol b/test/invariant/LiquidityPoolInvariants.t.sol deleted file mode 100644 index dbb72291..00000000 --- a/test/invariant/LiquidityPoolInvariants.t.sol +++ /dev/null @@ -1,262 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -pragma solidity 0.8.26; - -// import {BaseTest} from "test/BaseTest.sol"; -// import {InvestorHandler} from "test/invariant/handlers/Investor.sol"; -// import {EpochExecutorHandler} from "test/invariant/handlers/EpochExecutor.sol"; -// import {IERC7540Vault} from "src/interfaces/IERC7540.sol"; -// import {IERC20} from "src/interfaces/IERC20.sol"; -// import "forge-std/Test.sol"; - -// interface VaultLike is IERC7540Vault { -// function asset() external view returns (address); -// function share() external view returns (address); -// function poolId() external view returns (uint64); -// } - -// interface ITranche { -// function restrictionManager() external view returns (address); -// } - -// interface ERC20Like { -// function balanceOf(address account) external view returns (uint256); -// function rely(address user) external; -// } - -// /// @dev Goal: Set up a global state where all external inputs are statefully -// /// fuzzed through handlers, while the internal inputs controlled by -// /// actors on Centrifuge Chain is randomly configured but not fuzzed. -// contract InvestmentInvariants is BaseTest { -// uint256 public constant NUM_CURRENCIES = 1; -// uint256 public constant NUM_POOLS = 1; -// uint256 public constant NUM_INVESTORS = 1; - -// bytes16 public constant TRANCHE_ID = "1"; -// uint128 public constant CURRENCY_ID = 1; -// uint8 public constant RESTRICTION_SET = 1; - -// mapping(uint128 => address) public currencies; -// address[] public vaults; -// address[] public investors; - -// mapping(uint64 poolId => InvestorHandler handler) investorHandlers; -// mapping(uint64 poolId => EpochExecutorHandler handler) epochExecutorHandlers; - -// // Key-value store for shadow variables -// mapping(address entity => mapping(string key => uint256 value)) public shadowVariables; - -// function setUp() public override { -// super.setUp(); - -// // Generate random investment currencies -// for (uint128 assetId = 1; assetId < NUM_CURRENCIES + 1; ++assetId) { -// uint8 assetDecimals = _randomUint8(1, 18); - -// address asset = address( -// _newErc20(string(abi.encode("asset", assetId)), string(abi.encode("asset", assetId)), assetDecimals) -// ); -// currencies[assetId] = asset; -// excludeContract(asset); -// } - -// // Generate random vaults -// // TODO: multiple chains and allowing transfers between chains -// for (uint128 assetId = 1; assetId < NUM_CURRENCIES + 1; ++assetId) { -// for (uint64 poolId; poolId < NUM_POOLS; ++poolId) { -// uint8 trancheDecimals = _randomUint8(1, 18); -// address vault = deployVault( -// poolId, trancheDecimals, RESTRICTION_SET, "", "", TRANCHE_ID, assetId, currencies[assetId] -// ); -// vaults.push(vault); -// excludeContract(vault); -// excludeContract(VaultLike(vault).share()); -// excludeContract(ITranche(VaultLike(vault).share()).restrictionManager()); -// } -// } - -// // Generate investor accounts -// for (uint256 i; i < NUM_INVESTORS; ++i) { -// address investor = makeAddr(string(abi.encode("investor", _uint256ToString(i)))); -// investors.push(investor); - -// for (uint64 poolId; poolId < NUM_POOLS; ++poolId) { -// centrifugeChain.updateMember(poolId, TRANCHE_ID, investor, type(uint64).max); -// } -// } - -// // Set up investor and epoch executor handlers -// // - For each unique pool and each unique asset, 1 vault. -// // - Just 1 tranche per pool -// // - NUM_INVESTORS per vault. -// for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// VaultLike vault = VaultLike(vaults[vaultId]); - -// address asset = vault.asset(); -// InvestorHandler handler = new InvestorHandler( -// vault.poolId(), -// TRANCHE_ID, -// CURRENCY_ID, -// address(vault), -// address(centrifugeChain), -// asset, -// address(escrow), -// address(this) -// ); -// investorHandlers[vaultId] = handler; - -// EpochExecutorHandler eeHandler = new EpochExecutorHandler( -// vault.poolId(), TRANCHE_ID, CURRENCY_ID, address(centrifugeChain), address(this) -// ); -// epochExecutorHandlers[vaultId] = eeHandler; - -// address share = poolManager.getTranche(vault.poolId(), TRANCHE_ID); -// root.relyContract(share, address(this)); -// ERC20Like(asset).rely(address(handler)); // rely to mint asset -// ERC20Like(share).rely(address(handler)); // rely to mint tokens - -// targetContract(address(handler)); -// targetContract(address(eeHandler)); -// } -// } - -// // Invariant 1: tranche.balanceOf[user] <= sum(shares) -// function invariant_cannotReceiveMoreTranchesThanPayout() external { -// for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// VaultLike vault = VaultLike(vaults[vaultId]); - -// for (uint256 i; i < investors.length; ++i) { -// address investor = investors[i]; -// assertLe( -// IERC20(vault.share()).balanceOf(investor), -// getShadowVar(investor, "totalTranchesPaidOutOnInvest") -// ); -// } -// } -// } - -// // Invariant 2: asset.balanceOf[user] <= sum(assets for each redemption) -// // + sum(assets for each decreased investment) -// function invariant_cannotReceiveMoreCurrencyThanPayout() external { -// for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// for (uint256 i; i < investors.length; ++i) { -// address investor = investors[i]; -// assertLe( -// getShadowVar(investor, "totalCurrencyReceived"), -// getShadowVar(investor, "totalCurrencyPaidOutOnRedeem") -// + getShadowVar(investor, "totalCurrencyPaidOutOnDecreaseInvest") -// ); -// } -// } -// } - -// // Invariant 3: convertToAssets(totalSupply) == totalAssets -// function invariant_convertToAssetsEquivalence() external { -// for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// VaultLike vault = VaultLike(vaults[vaultId]); - -// // Does not hold if the price is 0 -// if (vault.convertToAssets(1) == 0) return; - -// if (vault.totalAssets() < type(uint128).max) { -// assertEq(vault.convertToAssets(IERC20(vault.share()).totalSupply()), vault.totalAssets()); -// } -// } -// } - -// // Invariant 4: convertToShares(totalAssets) == totalSupply -// function invariant_convertToSharesEquivalence() external { -// for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// VaultLike vault = VaultLike(vaults[vaultId]); - -// // Does not hold if the price is 0 -// if (vault.convertToAssets(1) == 0) return; - -// if (IERC20(vault.share()).totalSupply() < type(uint128).max) { -// assertEq(vault.convertToShares(vault.totalAssets()), IERC20(vault.share()).totalSupply()); -// } -// } -// } - -// // Invariant 5: vault.maxDeposit <= sum(requestDeposit) -// // function invariant_maxDepositLeDepositRequest() external { -// // for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// // VaultLike vault = VaultLike(vaults[vaultId]); -// // InvestorHandler handler = investorHandlers[vaultId]; - -// // for (uint256 i; i < investors.length; ++i) { -// // address investor = investors[i]; -// // assertLe(vault.maxDeposit(investor), getShadowVar(investor, "totalDepositRequested")); -// // } -// // } -// // } - -// // Invariant 6: vault.maxRedeem <= sum(requestRedeem) + sum(decreaseDepositRequest) -// // TODO: handle cancel behaviour -// // function invariant_maxRedeemLeRedeemRequest() external { -// // for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// // VaultLike vault = VaultLike(vaults[vaultId]); -// // InvestorHandler handler = investorHandlers[vaultId]; - -// // for (uint256 i; i < investors.length; ++i) { -// // address investor = investors[i]; -// // assertLe( -// // vault.maxRedeem(investor), -// // getShadowVar(investor, "totalRedeemRequested") -// // + getShadowVar(investor, "totalDecreaseDepositRequested") -// // ); -// // } -// // } -// // } - -// // Invariant 7: vault.depositPrice <= max(fulfillment price) -// // function invariant_depositPriceLtMaxFulfillmentPrice() external { -// // for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// // VaultLike vault = VaultLike(vaults[vaultId]); - -// // for (uint256 i; i < investors.length; ++i) { -// // address investor = investors[i]; -// // (, uint256 depositPrice,,,,,) = investmentManager.investments(address(vault), investor); - -// // assertLe(depositPrice, getShadowVar(investor, "maxDepositFulfillmentPrice")); -// // } -// // } -// // } - -// // Invariant 8: vault.redeemPrice <= max(fulfillment price) -// // function invariant_redeemPriceLtMaxFulfillmentPrice() external { -// // for (uint64 vaultId; vaultId < vaults.length; ++vaultId) { -// // VaultLike vault = VaultLike(vaults[vaultId]); - -// // for (uint256 i; i < investors.length; ++i) { -// // address investor = investors[i]; -// // (,,, uint256 redeemPrice,,,) = investmentManager.investments(address(vault), investor); - -// // assertLe(redeemPrice, getShadowVar(investor, "maxRedeemFulfillmentPrice")); -// // } -// // } -// // } - -// function getShadowVar(address entity, string memory key) public view returns (uint256) { -// return shadowVariables[entity][key]; -// } - -// function setShadowVar(address entity, string memory key, uint256 value) public { -// shadowVariables[entity][key] = value; -// } - -// function numInvestors() public view returns (uint256) { -// return investors.length; -// } - -// function _randomUint8(uint8 minValue, uint8 maxValue) internal view returns (uint8) { -// uint256 nonce = 1; - -// if (maxValue == 1) { -// return 1; -// } - -// uint8 value = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, self, nonce))) % (maxValue - -// minValue)); -// return value + minValue; -// } -// } diff --git a/test/invariant/handlers/BaseHandler.sol b/test/invariant/handlers/BaseHandler.sol deleted file mode 100644 index ebeb049d..00000000 --- a/test/invariant/handlers/BaseHandler.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -pragma solidity ^0.8.18; - -import {MockCentrifugeChain} from "test/mocks/MockCentrifugeChain.sol"; -import {MathLib} from "src/libraries/MathLib.sol"; - -import "forge-std/Test.sol"; - -interface SystemStateLike { - function numInvestors() external view returns (uint256); - function investors(uint256 index) external view returns (address); - function getShadowVar(address entity, string memory key) external view returns (uint256); - function setShadowVar(address entity, string memory key, uint256 value) external; -} - -contract BaseHandler is Test { - SystemStateLike immutable state; - - address currentInvestor; - - constructor(address state_) { - state = SystemStateLike(state_); - } - - modifier useRandomInvestor(uint256 investorIndex_) { - currentInvestor = state.investors(_bound(investorIndex_, 0, state.numInvestors() - 1)); - (, address currentPrank,) = vm.readCallers(); - if (currentPrank != currentInvestor) vm.startPrank(currentInvestor); - _; - vm.stopPrank(); - } - - // --- Shadow variables --- - function getVar(address entity, string memory key) internal view returns (uint256) { - return state.getShadowVar(entity, key); - } - - function setVar(address entity, string memory key, uint256 value) internal { - return state.setShadowVar(entity, key, value); - } - - function increaseVar(address entity, string memory key, uint256 addition) internal { - return state.setShadowVar(entity, key, state.getShadowVar(entity, key) + addition); - } - - function decreaseVar(address entity, string memory key, uint256 addition) internal { - return state.setShadowVar(entity, key, state.getShadowVar(entity, key) - addition); - } - - function setMaxVar(address entity, string memory key, uint256 value) internal { - return state.setShadowVar(entity, key, _max(state.getShadowVar(entity, key), value)); - } - - function setMinVar(address entity, string memory key, uint256 value) internal { - return state.setShadowVar(entity, key, _min(state.getShadowVar(entity, key), value)); - } - - // --- Helpers --- - /// @notice Returns the smallest of two numbers. - function _min(uint256 a, uint256 b) internal pure returns (uint256) { - return a > b ? b : a; - } - - /// @notice Returns the largest of two numbers. - function _max(uint256 a, uint256 b) internal pure returns (uint256) { - return a > b ? a : b; - } -} diff --git a/test/invariant/handlers/EpochExecutor.sol b/test/invariant/handlers/EpochExecutor.sol deleted file mode 100644 index 3c29d314..00000000 --- a/test/invariant/handlers/EpochExecutor.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -pragma solidity ^0.8.18; - -import {MockCentrifugeChain} from "test/mocks/MockCentrifugeChain.sol"; -import {MathLib} from "src/libraries/MathLib.sol"; -import {IERC7540Vault} from "src/interfaces/IERC7540.sol"; -import {BaseHandler} from "test/invariant/handlers/BaseHandler.sol"; - -interface ERC20Like { - function mint(address user, uint256 amount) external; - function approve(address spender, uint256 value) external returns (bool); - function balanceOf(address user) external view returns (uint256); -} - -interface VaultLike is IERC7540Vault { - function share() external view returns (address); - function manager() external view returns (address); -} - -contract EpochExecutorHandler is BaseHandler { - using MathLib for uint256; - using MathLib for uint128; - - uint64 poolId; - bytes16 trancheId; - uint128 assetId; - - MockCentrifugeChain immutable centrifugeChain; - - constructor(uint64 poolId_, bytes16 trancheId_, uint128 assetId_, address mockCentrifugeChain_, address state_) - BaseHandler(state_) - { - poolId = poolId_; - trancheId = trancheId_; - assetId = assetId_; - - centrifugeChain = MockCentrifugeChain(mockCentrifugeChain_); - } - - function executedCollectInvest(uint256 investorSeed, uint256 fulfillmentRatio, uint256 fulfillmentPrice) - public - useRandomInvestor(investorSeed) - { - fulfillmentRatio = bound(fulfillmentRatio, 0, 1 * 10 ** 18); // 0% to 100% - fulfillmentPrice = bound(fulfillmentPrice, 0, 2 * 10 ** 18); // 0.00 to 2.00 - - uint256 outstandingDepositRequest = - getVar(currentInvestor, "totalDepositRequested") - getVar(currentInvestor, "totalCurrencyPaidOutOnInvest"); - - if (outstandingDepositRequest == 0) { - return; - } - - uint128 assets = - uint128(outstandingDepositRequest.mulDiv(fulfillmentRatio, 1 * 10 ** 18, MathLib.Rounding.Down)); - uint128 shares = uint128(assets.mulDiv(1 * 10 ** 18, fulfillmentPrice, MathLib.Rounding.Down)); - - centrifugeChain.isFulfilledDepositRequest( - poolId, trancheId, bytes32(bytes20(currentInvestor)), assetId, assets, shares - ); - - increaseVar(currentInvestor, "totalCurrencyPaidOutOnInvest", assets); - increaseVar(currentInvestor, "totalTranchesPaidOutOnInvest", shares); - setMaxVar(currentInvestor, "maxDepositFulfillmentPrice", fulfillmentPrice); - } - - function executedCollectRedeem(uint256 investorSeed, uint256 fulfillmentRatio, uint256 fulfillmentPrice) - public - useRandomInvestor(investorSeed) - { - fulfillmentRatio = bound(fulfillmentRatio, 0, 1 * 10 ** 18); // 0% to 100% - fulfillmentPrice = bound(fulfillmentPrice, 0, 2 * 10 ** 18); // 0.00 to 2.00 - - uint256 outstandingRedeemRequest = - getVar(currentInvestor, "totalRedeemRequested") - getVar(currentInvestor, "totalTranchesPaidOutOnRedeem"); - - if (outstandingRedeemRequest == 0) { - return; - } - - uint128 shares = uint128(outstandingRedeemRequest.mulDiv(fulfillmentRatio, 1 * 10 ** 18, MathLib.Rounding.Down)); - uint128 assets = uint128(shares.mulDiv(fulfillmentPrice, 1 * 10 ** 18, MathLib.Rounding.Down)); - - centrifugeChain.isFulfilledRedeemRequest( - poolId, trancheId, bytes32(bytes20(currentInvestor)), assetId, assets, shares - ); - - increaseVar(currentInvestor, "totalTranchesPaidOutOnRedeem", shares); - increaseVar(currentInvestor, "totalCurrencyPaidOutOnRedeem", assets); - setMaxVar(currentInvestor, "maxRedeemFulfillmentPrice", fulfillmentPrice); - } - - function executedDecreaseInvestOrder(uint256 investorSeed, uint256 decreaseRatio) - public - useRandomInvestor(investorSeed) - { - decreaseRatio = bound(decreaseRatio, 0, 1 * 10 ** 18); // 0% to 100% - - if (getVar(currentInvestor, "outstandingDecreaseDepositRequested") == 0) { - return; - } - - uint128 assets = uint128( - getVar(currentInvestor, "outstandingDecreaseDepositRequested").mulDiv( - decreaseRatio, 1 * 10 ** 18, MathLib.Rounding.Down - ) - ); - - centrifugeChain.isFulfilledCancelDepositRequest( - poolId, - trancheId, - bytes32(bytes20(currentInvestor)), - assetId, - assets, - uint128(getVar(currentInvestor, "outstandingDecreaseDepositRequested") - assets) - ); - - decreaseVar(currentInvestor, "outstandingDecreaseDepositRequested", assets); - increaseVar(currentInvestor, "totalCurrencyPaidOutOnDecreaseInvest", assets); - - // An executed invest decrease indirectly leads to a redeem fulfillment at price 1.0 - setMaxVar(currentInvestor, "maxRedeemFulfillmentPrice", 1 * 10 ** 18); - } -} diff --git a/test/invariant/handlers/Investor.sol b/test/invariant/handlers/Investor.sol deleted file mode 100644 index d9abaf00..00000000 --- a/test/invariant/handlers/Investor.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-only -pragma solidity ^0.8.18; - -import {MockCentrifugeChain} from "test/mocks/MockCentrifugeChain.sol"; -import {IERC7540Vault} from "src/interfaces/IERC7540.sol"; -import {BaseHandler} from "test/invariant/handlers/BaseHandler.sol"; -import {MathLib} from "src/libraries/MathLib.sol"; - -import "forge-std/Test.sol"; - -interface ERC20Like { - function mint(address user, uint256 amount) external; - function approve(address spender, uint256 value) external returns (bool); - function balanceOf(address user) external view returns (uint256); -} - -interface VaultLike is IERC7540Vault { - function manager() external view returns (address); -} - -contract InvestorHandler is BaseHandler { - using MathLib for uint256; - using MathLib for uint128; - - uint64 poolId; - bytes16 trancheId; - uint128 assetId; - - ERC20Like immutable erc20; - ERC20Like immutable tranche; - VaultLike immutable vault; - MockCentrifugeChain immutable centrifugeChain; - address immutable escrow; - address immutable investmentManager; - - constructor( - uint64 poolId_, - bytes16 trancheId_, - uint128 assetId_, - address _vault, - address mockCentrifugeChain_, - address erc20_, - address escrow_, - address state_ - ) BaseHandler(state_) { - poolId = poolId_; - trancheId = trancheId_; - assetId = assetId_; - - vault = VaultLike(_vault); - centrifugeChain = MockCentrifugeChain(mockCentrifugeChain_); - erc20 = ERC20Like(erc20_); - tranche = ERC20Like(vault.share()); - escrow = escrow_; - investmentManager = vault.manager(); - } - - // --- Investments --- - function requestDeposit(uint256 investorSeed, uint128 amount) public useRandomInvestor(investorSeed) { - // Don't allow total outstanding deposit requests > type(uint128).max - uint256 amount_ = bound( - amount, - 0, - uint128( - type(uint128).max - getVar(currentInvestor, "totalDepositRequested") - + getVar(currentInvestor, "totalCurrencyPaidOutOnInvest") - ) - ); - if (amount == 0) return; - - vm.stopPrank(); - erc20.mint(currentInvestor, amount_); - vm.startPrank(currentInvestor); - - erc20.approve(address(vault), amount_); - - // TODO: we should also set up tests where currentInvestor != operator - vault.requestDeposit(amount_, currentInvestor, currentInvestor); - - increaseVar(currentInvestor, "totalDepositRequested", amount); - } - - function deposit(uint256 investorSeed, uint128 amount) public useRandomInvestor(investorSeed) { - uint256 amount_ = bound(amount, 0, vault.maxDeposit(currentInvestor)); - if (amount_ == 0) return; - - vault.deposit(amount_, currentInvestor); - } - - function mint(uint256 investorSeed, uint128 amount) public useRandomInvestor(investorSeed) { - uint256 amount_ = bound(amount, 0, vault.maxMint(currentInvestor)); - if (amount_ == 0) return; - - vault.mint(amount_, currentInvestor); - } - - // --- Redemptions --- - function requestRedeem(uint256 investorSeed, uint128 amount) public useRandomInvestor(investorSeed) { - uint256 amount_ = bound( - amount, - 0, - _min( - // Don't allow total outstanding redeem requests > type(uint128).max - uint128( - type(uint128).max - getVar(currentInvestor, "totalRedeemRequested") - + getVar(currentInvestor, "totalTranchesPaidOutOnRedeem") - ), - // Cannot redeem more than current balance of TT - tranche.balanceOf(currentInvestor) - ) - ); - if (amount_ == 0) return; - - vault.requestRedeem(amount_, currentInvestor, currentInvestor); - - increaseVar(currentInvestor, "totalRedeemRequested", amount_); - } - - function redeem(uint256 investorSeed, uint128 amount) public useRandomInvestor(investorSeed) { - uint256 amount_ = bound(amount, 0, vault.maxRedeem(currentInvestor)); - if (amount_ == 0) return; - - uint256 preBalance = erc20.balanceOf(currentInvestor); - vault.redeem(amount_, currentInvestor, currentInvestor); - uint256 postBalance = erc20.balanceOf(currentInvestor); - increaseVar(currentInvestor, "totalCurrencyReceived", postBalance - preBalance); - } - - function withdraw(uint256 investorSeed, uint128 amount) public useRandomInvestor(investorSeed) { - uint256 amount_ = bound(amount, 0, vault.maxWithdraw(currentInvestor)); - if (amount_ == 0) return; - - uint256 preBalance = erc20.balanceOf(currentInvestor); - vault.withdraw(amount_, currentInvestor, currentInvestor); - uint256 postBalance = erc20.balanceOf(currentInvestor); - increaseVar(currentInvestor, "totalCurrencyReceived", postBalance - preBalance); - } -} diff --git a/test/mocks/MockAdapter.sol b/test/mocks/MockAdapter.sol index 6b3d75be..09163b4d 100644 --- a/test/mocks/MockAdapter.sol +++ b/test/mocks/MockAdapter.sol @@ -14,10 +14,8 @@ contract MockAdapter is Auth, Mock { mapping(bytes => uint256) public sent; - constructor(address gateway_) { + constructor(address gateway_) Auth(msg.sender) { gateway = GatewayLike(gateway_); - - wards[msg.sender] = 1; } function execute(bytes memory _message) external { @@ -29,8 +27,8 @@ contract MockAdapter is Auth, Mock { sent[message]++; } - function estimate(bytes calldata, uint256) public view returns (uint256 estimation) { - estimation = values_uint256_return["estimate"]; + function estimate(bytes calldata, uint256 baseCost) public view returns (uint256 estimation) { + estimation = values_uint256_return["estimate"] + baseCost; } function pay(bytes calldata, address) external payable { diff --git a/test/mocks/MockERC20Wrapper.sol b/test/mocks/MockERC20Wrapper.sol index bcb8dd17..cc8d0896 100644 --- a/test/mocks/MockERC20Wrapper.sol +++ b/test/mocks/MockERC20Wrapper.sol @@ -23,7 +23,7 @@ contract MockERC20Wrapper is ERC20, Mock, IERC20Wrapper { ); // Obviously unsafe, just for testing purposes - balances[account] += value; + _setBalance(account, _balanceOf(account) + value); totalSupply = totalSupply + value; emit Transfer(address(0), account, value); @@ -32,7 +32,7 @@ contract MockERC20Wrapper is ERC20, Mock, IERC20Wrapper { function withdrawTo(address account, uint256 value) external returns (bool) { if (method_fail["withdrawTo"]) return false; - balances[msg.sender] -= value; + _setBalance(msg.sender, _balanceOf(msg.sender) - value); totalSupply = totalSupply - value; IERC20Metadata(underlying).transfer(account, value); diff --git a/test/mocks/MockGasService.sol b/test/mocks/MockGasService.sol index 17f9b1bf..38ca47f8 100644 --- a/test/mocks/MockGasService.sol +++ b/test/mocks/MockGasService.sol @@ -2,10 +2,18 @@ pragma solidity 0.8.26; import "test/mocks/Mock.sol"; +import {BytesLib} from "src/libraries/BytesLib.sol"; +import {MessagesLib} from "src/libraries/MessagesLib.sol"; contract MockGasService is Mock { - function estimate(bytes calldata) public view returns (uint256) { - return values_uint256_return["estimate"]; + using BytesLib for bytes; + + function estimate(bytes calldata payload) public view returns (uint256) { + uint8 call = payload.toUint8(0); + if (call == uint8(MessagesLib.Call.MessageProof)) { + return values_uint256_return["proof_estimate"]; + } + return values_uint256_return["message_estimate"]; } function shouldRefuel(address, bytes calldata) public returns (bool) { diff --git a/test/mocks/MockUSDC.sol b/test/mocks/MockUSDC.sol new file mode 100644 index 00000000..0a0e163f --- /dev/null +++ b/test/mocks/MockUSDC.sol @@ -0,0 +1,136 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {Auth} from "src/Auth.sol"; +import {EIP712Lib} from "src/libraries/EIP712Lib.sol"; +import {SignatureLib} from "src/libraries/SignatureLib.sol"; +import {IERC20, IERC20Metadata} from "src/interfaces/IERC20.sol"; + +/// @title ERC20 +/// @notice Standard ERC-20 implementation, with mint/burn functionality. +/// @dev Requires allowance even when from == msg.sender, to mimic +/// USDC and the OpenZeppelin ERC20 implementation. +contract MockUSDC is Auth, IERC20Metadata { + /// @inheritdoc IERC20Metadata + string public name; + /// @inheritdoc IERC20Metadata + string public symbol; + /// @inheritdoc IERC20Metadata + uint8 public immutable decimals; + /// @inheritdoc IERC20 + uint256 public totalSupply; + + mapping(address => uint256) private balances; + /// @inheritdoc IERC20 + mapping(address => mapping(address => uint256)) public allowance; + + constructor(uint8 decimals_) Auth(msg.sender) { + decimals = decimals_; + } + + function _balanceOf(address user) internal view virtual returns (uint256) { + return balances[user]; + } + + /// @inheritdoc IERC20 + function balanceOf(address user) public view virtual returns (uint256) { + return _balanceOf(user); + } + + function _setBalance(address user, uint256 value) internal virtual { + balances[user] = value; + } + + // --- ERC20 Mutations --- + /// @inheritdoc IERC20 + function transfer(address to, uint256 value) public virtual returns (bool) { + require(to != address(0) && to != address(this), "ERC20/invalid-address"); + uint256 balance = balanceOf(msg.sender); + require(balance >= value, "ERC20/insufficient-balance"); + + unchecked { + _setBalance(msg.sender, _balanceOf(msg.sender) - value); + // note: we don't need an overflow check here b/c sum of all balances == totalSupply + _setBalance(to, _balanceOf(to) + value); + } + + emit Transfer(msg.sender, to, value); + + return true; + } + + /// @inheritdoc IERC20 + function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { + return _transferFrom(msg.sender, from, to, value); + } + + function _transferFrom(address sender, address from, address to, uint256 value) internal virtual returns (bool) { + require(to != address(0) && to != address(this), "ERC20/invalid-address"); + uint256 balance = balanceOf(from); + require(balance >= value, "ERC20/insufficient-balance"); + + uint256 allowed = allowance[from][sender]; + if (allowed != type(uint256).max) { + require(allowed >= value, "ERC20/insufficient-allowance"); + unchecked { + allowance[from][sender] = allowed - value; + } + } + + unchecked { + _setBalance(from, _balanceOf(from) - value); + // note: we don't need an overflow check here b/c sum of all balances == totalSupply + _setBalance(to, _balanceOf(to) + value); + } + + emit Transfer(from, to, value); + + return true; + } + + /// @inheritdoc IERC20 + function approve(address spender, uint256 value) external returns (bool) { + allowance[msg.sender][spender] = value; + + emit Approval(msg.sender, spender, value); + + return true; + } + + // --- Mint/Burn --- + function mint(address to, uint256 value) public virtual auth { + require(to != address(0) && to != address(this), "ERC20/invalid-address"); + unchecked { + // We don't need an overflow check here b/c balances[to] <= totalSupply + // and there is an overflow check below + _setBalance(to, _balanceOf(to) + value); + } + totalSupply = totalSupply + value; + + emit Transfer(address(0), to, value); + } + + function burn(address from, uint256 value) public virtual auth { + uint256 balance = balanceOf(from); + require(balance >= value, "ERC20/insufficient-balance"); + + if (from != msg.sender) { + uint256 allowed = allowance[from][msg.sender]; + if (allowed != type(uint256).max) { + require(allowed >= value, "ERC20/insufficient-allowance"); + + unchecked { + allowance[from][msg.sender] = allowed - value; + } + } + } + + unchecked { + // We don't need overflow checks b/c require(balance >= value) and balance <= totalSupply + _setBalance(from, _balanceOf(from) - value); + totalSupply = totalSupply - value; + } + + emit Transfer(from, address(0), value); + } +} diff --git a/test/mocks/PermissionlessAdapter.sol b/test/mocks/PermissionlessAdapter.sol index e0a72267..bfd197d7 100644 --- a/test/mocks/PermissionlessAdapter.sol +++ b/test/mocks/PermissionlessAdapter.sol @@ -12,11 +12,8 @@ contract PermissionlessAdapter is Auth { event Send(bytes message); - constructor(address gateway_) { + constructor(address gateway_) Auth(msg.sender) { gateway = GatewayLike(gateway_); - - wards[msg.sender] = 1; - emit Rely(msg.sender); } // --- Incoming --- diff --git a/test/recon-aggregator/BeforeAfter.sol b/test/recon-aggregator/BeforeAfter.sol new file mode 100644 index 00000000..63f44433 --- /dev/null +++ b/test/recon-aggregator/BeforeAfter.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {Setup} from "./Setup.sol"; + +abstract contract BeforeAfter is Setup {} diff --git a/test/recon-aggregator/CryticAggregatorTester.sol b/test/recon-aggregator/CryticAggregatorTester.sol new file mode 100644 index 00000000..d2769c56 --- /dev/null +++ b/test/recon-aggregator/CryticAggregatorTester.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {TargetFunctions} from "./TargetFunctions.sol"; +import {CryticAsserts} from "@chimera/CryticAsserts.sol"; + +// echidna . --contract CryticAggregatorTester --config echidna.yaml +// medusa fuzz +contract CryticAggregatorTester is TargetFunctions, CryticAsserts { + constructor() payable { + setup(); + } +} diff --git a/test/recon-aggregator/CryticToFoundry.sol b/test/recon-aggregator/CryticToFoundry.sol new file mode 100644 index 00000000..6f22eaa9 --- /dev/null +++ b/test/recon-aggregator/CryticToFoundry.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {TargetFunctions} from "./TargetFunctions.sol"; +import {FoundryAsserts} from "@chimera/FoundryAsserts.sol"; + +contract CryticToFoundryRouter is Test, TargetFunctions, FoundryAsserts { + function setUp() public { + setup(); + } +} diff --git a/test/recon-aggregator/Properties.sol b/test/recon-aggregator/Properties.sol new file mode 100644 index 00000000..f0449754 --- /dev/null +++ b/test/recon-aggregator/Properties.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {Setup} from "./Setup.sol"; +import {ArrayLib} from "src/libraries/ArrayLib.sol"; + +abstract contract Properties is Setup { + using ArrayLib for uint16[8]; + + function invariant_noMessageReplay() public view returns (bool) { + for (uint256 i = 0; i < messages.length; i++) { + bytes32 message = keccak256(messages[i]); + if (messageReceivedCount[message] > messageSentCount[message] + messageRecoveredCount[message]) { + return false; + } + + // 1 > 0 + if (RECON_ADAPTERS > 1) { + // Solo router -> Instant confirm + // More than one, then we require 2 proofs > 1 message + + // 1 router => 1 received == 1 message sent, 0 proofs sent + // 3 routers => 1 received == 1 message sent, 2 proofs sent + if ( + messageReceivedCount[message] + > (RECON_ADAPTERS - 1) * proofSentCount[message] + messageRecoveredCount[message] + ) { + return false; + } + } + } + + return true; + } + + // When a message is executed, the total confirmation count is decreased by quorum + function invariant_counter() public view returns (bool) { + /// @audit CLAMP + /// NOTE: When routers is 1, the property breaks + if (RECON_ADAPTERS > 1) { + for (uint256 i = 0; i < messages.length; i++) { + bytes32 message = keccak256(messages[i]); + + if (routerAggregator.votes(message).countNonZeroValues() >= RECON_ADAPTERS) { + return false; + } + } + } + + return true; + } + + /// If sentCount == receivedCount -> Message must not be pending -> Message must have been cleared + // function invariant_clear_pending_logic() public view returns (bool) { + // for (uint256 i = 0; i < messages.length; i++) { + // bytes32 message = keccak256(messages[i]); + + // if (messageSentCount[message] + messageRecoveredCount[message] == messageReceivedCount[message]) { + // (, bytes memory pendingMessage) = routerAggregator.messages(message); + // if (pendingMessage.length != 0) { + // return false; // Means it's not empty + // } + // } + // } + + // return true; + // } +} diff --git a/test/recon-aggregator/Setup.sol b/test/recon-aggregator/Setup.sol new file mode 100644 index 00000000..a3c68e19 --- /dev/null +++ b/test/recon-aggregator/Setup.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {BaseSetup} from "@chimera/BaseSetup.sol"; +import {Asserts} from "@chimera/Asserts.sol"; + +import "src/gateway/Gateway.sol"; +import {MockAdapter} from "test/mocks/MockAdapter.sol"; + +// What happens if we add more adapters later? + +// Quorum = Every active router +// 1 MSG Router -> Handled if 1 Message and 2 proofs + +// 1 Proof + 1 Msg router +// 1 Message sent +// Add 1 router +// Recovery Logic -> Resend + +/** + * 1) Understand better + * 2) Increase coverage + */ +abstract contract Setup is BaseSetup, Asserts { + /// TODO: Consider shared storage + Gateway routerAggregator; + + // NOTE: Actor tracking + address gateway = address(this); + + uint256 RECON_ADAPTERS = 2; + + address[] adapters; + + // todo: create some sort of a function that is usable + bytes[] messages; + mapping(bytes32 => bool) doesMessageExists; + + mapping(bytes32 => uint256) messageSentCount; + mapping(bytes32 => uint256) proofSentCount; + + mapping(bytes32 => uint256) messageReceivedCount; + + mapping(bytes32 => uint256) messageRecoveredCount; + + // How many times does the gateway receive + // TODO: Implement + + function handle(bytes calldata message) external { + require(msg.sender == address(routerAggregator)); + + // Verify that it already exists + t(doesMessageExists[keccak256(message)], "Handle was called by aggregator with a non existant message"); + + messageReceivedCount[keccak256(message)] += 1; + } + + function setup() internal virtual override { + routerAggregator = new Gateway(address(0), address(0), address(0), address(0)); + + // Given config, add adapters + for (uint256 i = 0; i < RECON_ADAPTERS; i++) { + adapters.push(address(new MockAdapter(address(routerAggregator)))); + } + + routerAggregator.file("adapters", adapters); + } +} diff --git a/test/recon-aggregator/TargetFunctions.sol b/test/recon-aggregator/TargetFunctions.sol new file mode 100644 index 00000000..f7bf9a49 --- /dev/null +++ b/test/recon-aggregator/TargetFunctions.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {BiasedTargetFunctions} from "./targets/BiasedTargetFunctions.sol"; + +import {Properties} from "./Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +abstract contract TargetFunctions is BaseTargetFunctions, Properties, BiasedTargetFunctions { + // @todo: re-enable + // function routerAggregator_deny(address user) public { + // routerAggregator.deny(user); + // } + + function routerAggregator_disputeMessageRecovery(address router, bytes32 messageHash) public { + routerAggregator.disputeMessageRecovery(router, messageHash); + } + + function routerAggregator_executeMessageRecovery(address router, bytes memory message) public { + routerAggregator.executeMessageRecovery(router, message); + } + + // @todo: re-enable + // function routerAggregator_file(bytes32 what, address[] memory routers_) public { + // routerAggregator.file(what, routers_); + // } + + function routerAggregator_handle(bytes memory payload) public { + routerAggregator.handle(payload); + } + + // @todo: re-enable + // function routerAggregator_rely(address user) public { + // routerAggregator.rely(user); + // } + + function routerAggregator_send(bytes memory message, address source) public { + routerAggregator.send(message, source); + } +} diff --git a/test/recon-aggregator/debug/CryticToFoundryAggregator.sol b/test/recon-aggregator/debug/CryticToFoundryAggregator.sol new file mode 100644 index 00000000..7e8db95a --- /dev/null +++ b/test/recon-aggregator/debug/CryticToFoundryAggregator.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {TargetFunctions} from "../TargetFunctions.sol"; +import {FoundryAsserts} from "@chimera/FoundryAsserts.sol"; + +contract CryticToFoundryAggregator is Test, TargetFunctions, FoundryAsserts { + function setUp() public { + setup(); + } +} diff --git a/test/recon-aggregator/echidna.yaml b/test/recon-aggregator/echidna.yaml new file mode 100644 index 00000000..71aa40db --- /dev/null +++ b/test/recon-aggregator/echidna.yaml @@ -0,0 +1,8 @@ + +testMode: "assertion" +prefix: "invariant_" +coverage: true +corpusDir: "echidna" +balanceAddr: 0x1043561a8829300000 +balanceContract: 0x1043561a8829300000 +filterFunctions: [] diff --git a/test/recon-aggregator/targets/BiasedTargetFunctions.sol b/test/recon-aggregator/targets/BiasedTargetFunctions.sol new file mode 100644 index 00000000..970fe78f --- /dev/null +++ b/test/recon-aggregator/targets/BiasedTargetFunctions.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity ^0.8.0; + +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; +import {MockAdapter} from "test/mocks/MockAdapter.sol"; + +import {MessagesLib} from "src/libraries/MessagesLib.sol"; + +abstract contract BiasedTargetFunctions is BaseTargetFunctions, Properties { + mapping(uint256 => uint256) primaryIndex; + + /// @dev Add to messsages we're trying to broadcast + function registerNewMessage(bytes memory message, uint8 adapterId) public { + // @audit CLAMP Necessary to cap to adapters count as otherwise Medusa will send messages from random + adapterId %= uint8(RECON_ADAPTERS); + + require(messageSentCount[keccak256(message)] == 0); + messages.push(message); + primaryIndex[messages.length - 1] = adapterId; + doesMessageExists[keccak256(message)] = true; + } + + function sendMessage(uint8 adapterId, uint256 messageIndex) public { + bytes memory message = messages[messageIndex]; + + require(primaryIndex[messageIndex] == adapterId, "not-primary-router"); // Must be primary to send message + // require(messageSentCount[keccak256(message)] == 0); /// TODO looks off + // I think those should be: messagesSentCount[router][message] else what's the point? + MockAdapter(adapters[adapterId]).execute(message); + messageSentCount[keccak256(message)] += 1; + } + + function sendProof(uint8 adapterId, uint256 messageIndex) public { + bytes memory message = messages[messageIndex]; + require(primaryIndex[messageIndex] != adapterId); // Must not primary to send proof + // require(messageSentCount[keccak256(message)] > 0); // NOTE: Proof could be sent before or after, not sure why + // this exists + MockAdapter(adapters[adapterId]).execute(_formatMessageProof(message)); + proofSentCount[keccak256(message)] += 1; + } + + function _formatMessageProof(bytes memory message) internal pure returns (bytes memory) { + return abi.encodePacked(uint8(MessagesLib.Call.MessageProof), keccak256(message)); + } + + // TODO: Initiate Message Recover + // SEE: function testRecoverFailedMessage() public { + /** + * router2.execute( + * abi.encodePacked( + * uint8(MessagesLib.Call.InitiateMessageRecovery), keccak256(message), address(router1).toBytes32() + * ) + * ); + */ + // Store TS + // ExecuteMessageRecovery + // Check that TS >= RECOVERY_CHALLENGE_PERIOD + // Check that recovery[messageHash] is sufficiently in the future + + mapping(bytes32 => uint256) recoverMessageTime; + + function recoverMessage(uint8 calledRouterId, uint8 recoverRouterId, uint256 messageIndex) public { + messageIndex %= uint8(messages.length); + calledRouterId %= uint8(RECON_ADAPTERS); + recoverRouterId %= uint8(RECON_ADAPTERS); + + bytes memory message = messages[messageIndex]; + + // TODO: Can we call this more than once? How would it work + recoverMessageTime[keccak256(message)] = block.timestamp; + + // NOTE: Can we recover for self? + // TODO: CHECK THIS! + MockAdapter(adapters[calledRouterId]).execute( + abi.encodePacked( + uint8(MessagesLib.Call.InitiateMessageRecovery), + keccak256(message), + bytes32(bytes20(address(adapters[recoverRouterId]))) + ) + ); + } + + function executeMessageRecovery(uint8 adapterId, uint256 messageIndex) public { + adapterId %= uint8(RECON_ADAPTERS); + messageIndex %= uint8(messages.length); + address router = routerAggregator.adapters(adapterId); + + bytes memory message = messages[messageIndex]; + require(recoverMessageTime[keccak256(message)] != 0); + routerAggregator.executeMessageRecovery(router, message); + + messageRecoveredCount[keccak256(message)] += 1; + + t( + recoverMessageTime[keccak256(message)] + routerAggregator.RECOVERY_CHALLENGE_PERIOD() <= block.timestamp, + "Challenge period must have passed" + ); + } + + function disputeMessageRecovery(uint8 adapterId, uint256 messageIndex) public { + adapterId %= uint8(RECON_ADAPTERS); + messageIndex %= uint8(messages.length); + address router = routerAggregator.adapters(adapterId); + + bytes memory message = messages[messageIndex]; + routerAggregator.disputeMessageRecovery(router, keccak256(message)); + + recoverMessageTime[keccak256(message)] = 0; // Unset time + } +} diff --git a/test/recon-core/CryticToFoundry.sol b/test/recon-core/CryticToFoundry.sol new file mode 100644 index 00000000..0bef94d4 --- /dev/null +++ b/test/recon-core/CryticToFoundry.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {TargetFunctions} from "./TargetFunctions.sol"; +import {FoundryAsserts} from "@chimera/FoundryAsserts.sol"; + +import {ERC20} from "src/token/ERC20.sol"; + +contract CryticToFoundry is Test, TargetFunctions, FoundryAsserts { + function setUp() public { + setup(); + } +} diff --git a/test/recon-core/ERC7540CentrifugeProperties.sol b/test/recon-core/ERC7540CentrifugeProperties.sol new file mode 100644 index 00000000..df7e9ebb --- /dev/null +++ b/test/recon-core/ERC7540CentrifugeProperties.sol @@ -0,0 +1,261 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {Asserts} from "@chimera/Asserts.sol"; +import {Setup} from "./Setup.sol"; +import {CallTestAndUndo} from "./helpers/CallTestAndUndo.sol"; +import {ERC7540Properties} from "./ERC7540Properties.sol"; + +/// @dev ERC-7540 Properties used by Centrifuge +/// See `ERC7540Properties` for more properties that can be re-used in your project +abstract contract ERC7540CentrifugeProperties is Setup, Asserts, CallTestAndUndo, ERC7540Properties { + /// @dev Since we deploy and set addresses via handlers + // We can have zero values initially + // We have these checks to prevent false positives + // This is tightly coupled to our system + // A simpler system with no actors would not need these checks + // Although they don't hurt + // NOTE: We could also change the entire propertie to handlers and we would be ok as well + function _canCheckProperties() internal view returns (bool) { + if (TODO_RECON_SKIP_ERC7540) { + return false; + } + if (address(vault) == address(0)) { + return false; + } + if (address(trancheToken) == address(0)) { + return false; + } + if (address(restrictionManager) == address(0)) { + return false; + } + if (address(token) == address(0)) { + return false; + } + + return true; + } + + /// === CALL TARGET === /// + /// @dev These are the functions that are actually called + /// Written in this way to ensure they are non state altering + /// This helps in as it ensures these properties were "spot broken" by the sequence + /// And they did not contribute to the sequence (as some of these properties perform more than one action) + function erc7540_3_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_3, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_3"); + + return asBool; + } + + function erc7540_4_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_4, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_4"); + + return asBool; + } + + function erc7540_5_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_5, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_5"); + + return asBool; + } + + function erc7540_6_deposit_call_target(uint256 amt) public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_6_deposit, (address(vault), amt)); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_6_deposit"); + + return asBool; + } + + function erc7540_6_mint_call_target(uint256 amt) public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_6_mint, (address(vault), amt)); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_6_mint"); + + return asBool; + } + + function erc7540_6_withdraw_call_target(uint256 amt) public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_6_withdraw, (address(vault), amt)); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_6_withdraw"); + + return asBool; + } + + function erc7540_6_redeem_call_target(uint256 amt) public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_6_redeem, (address(vault), amt)); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_6_redeem"); + + return asBool; + } + + function erc7540_7_call_target(uint256 shares) public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_7, (address(vault), shares)); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_7"); + + return asBool; + } + + function erc7540_8_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_8, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_8"); + + return asBool; + } + + function erc7540_9_deposit_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_9_deposit, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_9_deposit"); + + return asBool; + } + + function erc7540_9_mint_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_9_mint, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_9_mint"); + + return asBool; + } + + function erc7540_9_withdraw_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_9_withdraw, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_9_withdraw"); + + return asBool; + } + + function erc7540_9_redeem_call_target() public returns (bool) { + bytes memory encoded = abi.encodeCall(this.erc7540_9_redeem, (address(vault))); + bool asBool = _doTestAndReturnResult(encoded); + + /// @audit We need to assert else it won't be picked up by Medusa + t(asBool, "erc7540_9_redeem"); + + return asBool; + } + + function _centrifugeSpecificPreChecks() internal { + require(msg.sender == address(this)); // Enforces external call to ensure it's not state altering + require(_canCheckProperties()); // Early revert to prevent false positives + } + + /// === IMPLEMENTATIONS === /// + /// All functions are implemented to prevent executing the ERC7540Properties + /// We simply added a check to ensure that `deployNewTokenPoolAndTranche` was called + + /// === Overridden Implementations === /// + function erc7540_3(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_3(erc7540Target); + } + + function erc7540_4(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_4(erc7540Target); + } + + function erc7540_5(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_5(erc7540Target); + } + + function erc7540_6_deposit(address erc7540Target, uint256 amt) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_6_deposit(erc7540Target, amt); + } + + function erc7540_6_mint(address erc7540Target, uint256 amt) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_6_mint(erc7540Target, amt); + } + + function erc7540_6_withdraw(address erc7540Target, uint256 amt) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_6_withdraw(erc7540Target, amt); + } + + function erc7540_6_redeem(address erc7540Target, uint256 amt) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_6_redeem(erc7540Target, amt); + } + + function erc7540_7(address erc7540Target, uint256 shares) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_7(erc7540Target, shares); + } + + function erc7540_8(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_8(erc7540Target); + } + + function erc7540_9_deposit(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_9_deposit(erc7540Target); + } + + function erc7540_9_mint(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_9_mint(erc7540Target); + } + + function erc7540_9_withdraw(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_9_withdraw(erc7540Target); + } + + function erc7540_9_redeem(address erc7540Target) public override returns (bool) { + _centrifugeSpecificPreChecks(); + + return ERC7540Properties.erc7540_9_redeem(erc7540Target); + } +} diff --git a/test/recon-core/ERC7540Properties.sol b/test/recon-core/ERC7540Properties.sol new file mode 100644 index 00000000..5201e5cd --- /dev/null +++ b/test/recon-core/ERC7540Properties.sol @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {Asserts} from "@chimera/Asserts.sol"; +import {Setup} from "./Setup.sol"; +import {IERC7540Vault} from "src/interfaces/IERC7540.sol"; +import {IERC20Metadata} from "src/interfaces/IERC20.sol"; +import "forge-std/console2.sol"; + +/// @dev ERC-7540 Properties +/// TODO: Make pointers with Reverts +/// TODO: Make pointer to Vault Like Contract for re-usability + +/// Casted to ERC7540 -> Do the operation +/// These are the re-usable ones, which do alter the state +/// And we will not call +abstract contract ERC7540Properties is Setup, Asserts { + // TODO: change to 10 ** max(token.decimals(), trancheToken.decimals()) + uint256 MAX_ROUNDING_ERROR = 10 ** 18; + + /// @dev 7540-3 convertToAssets(totalSupply) == totalAssets unless price is 0.0 + function erc7540_3(address erc7540Target) public virtual returns (bool) { + // Doesn't hold on zero price + if ( + IERC7540Vault(erc7540Target).convertToAssets( + 10 ** IERC20Metadata(IERC7540Vault(erc7540Target).share()).decimals() + ) == 0 + ) return true; + + return IERC7540Vault(erc7540Target).convertToAssets( + IERC20Metadata(IERC7540Vault(erc7540Target).share()).totalSupply() + ) == IERC7540Vault(erc7540Target).totalAssets(); + } + + /// @dev 7540-4 convertToShares(totalAssets) == totalSupply unless price is 0.0 + function erc7540_4(address erc7540Target) public virtual returns (bool) { + if ( + IERC7540Vault(erc7540Target).convertToAssets( + 10 ** IERC20Metadata(IERC7540Vault(erc7540Target).share()).decimals() + ) == 0 + ) return true; + + // convertToShares(totalAssets) == totalSupply + return _diff( + IERC7540Vault(erc7540Target).convertToShares(IERC7540Vault(erc7540Target).totalAssets()), + IERC20Metadata(IERC7540Vault(erc7540Target).share()).totalSupply() + ) <= MAX_ROUNDING_ERROR; + } + + function _diff(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : b - a; + } + + /// @dev 7540-5 max* never reverts + function erc7540_5(address erc7540Target) public virtual returns (bool) { + // max* never reverts + try IERC7540Vault(erc7540Target).maxDeposit(actor) {} + catch { + return false; + } + try IERC7540Vault(erc7540Target).maxMint(actor) {} + catch { + return false; + } + try IERC7540Vault(erc7540Target).maxRedeem(actor) {} + catch { + return false; + } + try IERC7540Vault(erc7540Target).maxWithdraw(actor) {} + catch { + return false; + } + + return true; + } + + /// == erc7540_6 == // + /// @dev 7540-6 claiming more than max always reverts + function erc7540_6_deposit(address erc7540Target, uint256 amt) public virtual returns (bool) { + // Skip 0 + if (amt == 0) { + return true; // Skip + } + + uint256 maxDep = IERC7540Vault(erc7540Target).maxDeposit(actor); + + /// @audit No Revert is proven by erc7540_5 + + uint256 sum = maxDep + amt; + if (sum == 0) { + return true; // Needs to be greater than 0, skip + } + + try IERC7540Vault(erc7540Target).deposit(maxDep + amt, actor) { + return false; + } catch { + // We want this to be hit + return true; // So we explicitly return here, as a means to ensure that this is the code path + } + + // NOTE: This code path is never hit per the above + return false; + } + + function erc7540_6_mint(address erc7540Target, uint256 amt) public virtual returns (bool) { + // Skip 0 + if (amt == 0) { + return true; + } + + uint256 maxDep = IERC7540Vault(erc7540Target).maxMint(actor); + + uint256 sum = maxDep + amt; + if (sum == 0) { + return true; // Needs to be greater than 0, skip + } + + try IERC7540Vault(erc7540Target).mint(maxDep + amt, actor) { + return false; + } catch { + // We want this to be hit + return true; // So we explicitly return here, as a means to ensure that this is the code path + } + + // NOTE: This code path is never hit per the above + return false; + } + + function erc7540_6_withdraw(address erc7540Target, uint256 amt) public virtual returns (bool) { + // Skip 0 + if (amt == 0) { + return true; + } + + uint256 maxDep = IERC7540Vault(erc7540Target).maxWithdraw(actor); + + uint256 sum = maxDep + amt; + if (sum == 0) { + return true; // Needs to be greater than 0 + } + + try IERC7540Vault(erc7540Target).withdraw(maxDep + amt, actor, actor) { + return false; + } catch { + // We want this to be hit + return true; // So we explicitly return here, as a means to ensure that this is the code path + } + + // NOTE: This code path is never hit per the above + return false; + } + + function erc7540_6_redeem(address erc7540Target, uint256 amt) public virtual returns (bool) { + // Skip 0 + if (amt == 0) { + return true; + } + + uint256 maxDep = IERC7540Vault(erc7540Target).maxRedeem(actor); + + uint256 sum = maxDep + amt; + if (sum == 0) { + return true; // Needs to be greater than 0 + } + + try IERC7540Vault(erc7540Target).redeem(maxDep + amt, actor, actor) { + return false; + } catch { + // We want this to be hit + return true; // So we explicitly return here, as a means to ensure that this is the code path + } + + return false; + } + + /// == END erc7540_6 == // + + /// @dev 7540-7 requestRedeem reverts if the share balance is less than amount + function erc7540_7(address erc7540Target, uint256 shares) public virtual returns (bool) { + if (shares == 0) { + return true; // Skip + } + + uint256 actualBal = trancheToken.balanceOf(actor); + uint256 balWeWillUse = actualBal + shares; + + if (balWeWillUse == 0) { + return true; // Skip + } + + // NOTE: Avoids more false positives + trancheToken.approve(address(erc7540Target), 0); + trancheToken.approve(address(erc7540Target), type(uint256).max); + + uint256 hasReverted; + try IERC7540Vault(erc7540Target).requestRedeem(balWeWillUse, actor, actor) { + hasReverted = 2; // Coverage + return false; + } catch { + hasReverted = 1; // 1 = has reverted + return true; + } + + return false; + } + + /// @dev 7540-8 preview* always reverts + function erc7540_8(address erc7540Target) public virtual returns (bool) { + // preview* always reverts + try IERC7540Vault(erc7540Target).previewDeposit(0) { + return false; + } catch {} + try IERC7540Vault(erc7540Target).previewMint(0) { + return false; + } catch {} + try IERC7540Vault(erc7540Target).previewRedeem(0) { + return false; + } catch {} + try IERC7540Vault(erc7540Target).previewWithdraw(0) { + return false; + } catch {} + + return true; + } + + /// == erc7540_9 == // + /// @dev 7540-9 if max[method] > 0, then [method] (max) should not revert + function erc7540_9_deposit(address erc7540Target) public virtual returns (bool) { + // Per erc7540_5 + uint256 maxDeposit = IERC7540Vault(erc7540Target).maxDeposit(actor); + + if (maxDeposit == 0) { + return true; // Skip + } + + try IERC7540Vault(erc7540Target).deposit(maxDeposit, actor) { + // Success here + return true; + } catch { + return false; + } + + return false; + } + + function erc7540_9_mint(address erc7540Target) public virtual returns (bool) { + uint256 maxMint = IERC7540Vault(erc7540Target).maxMint(actor); + + if (maxMint == 0) { + return true; // Skip + } + + try IERC7540Vault(erc7540Target).mint(maxMint, actor) { + // Success here + return true; + } catch { + return false; + } + + return false; + } + + function erc7540_9_withdraw(address erc7540Target) public virtual returns (bool) { + uint256 maxWithdraw = IERC7540Vault(erc7540Target).maxWithdraw(actor); + + if (maxWithdraw == 0) { + return true; // Skip + } + + try IERC7540Vault(erc7540Target).withdraw(maxWithdraw, actor, actor) { + // Success here + // E-1 + sumOfClaimedRedemptions[address(token)] += maxWithdraw; + return true; + } catch { + return false; + } + + return false; + } + + function erc7540_9_redeem(address erc7540Target) public virtual returns (bool) { + // Per erc7540_5 + uint256 maxRedeem = IERC7540Vault(erc7540Target).maxRedeem(actor); + + if (maxRedeem == 0) { + return true; // Skip + } + + try IERC7540Vault(erc7540Target).redeem(maxRedeem, actor, actor) returns (uint256 assets) { + // E-1 + sumOfClaimedRedemptions[address(token)] += assets; + return true; + } catch { + return false; + } + + return false; + } + + /// == END erc7540_9 == // +} diff --git a/test/recon-core/Properties.sol b/test/recon-core/Properties.sol new file mode 100644 index 00000000..21859d88 --- /dev/null +++ b/test/recon-core/Properties.sol @@ -0,0 +1,385 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {Asserts} from "@chimera/Asserts.sol"; +import {Setup} from "./Setup.sol"; +import {ERC7540CentrifugeProperties} from "./ERC7540CentrifugeProperties.sol"; + +abstract contract Properties is Setup, Asserts, ERC7540CentrifugeProperties { + // == SENTINEL == // + /// Sentinel properties are used to flag that coverage was reached + // These can be useful during development, but may also be kept at latest stages + // They indicate that salient state transitions have happened, which can be helpful at all stages of development + + /// @dev This Property demonstrates that the current actor can reach a non-zero balance + // This helps get coverage in other areas + function invariant_sentinel_tranche_balance() public returns (bool) { + if (!RECON_USE_SENTINEL_TESTS) { + return true; // Skip if setting is off + } + + if (address(trancheToken) == address(0)) { + return true; // Skip + } + // Dig until we get non-zero tranche balance + // Afaict this will never work + return trancheToken.balanceOf(actor) == 0; + } + + // == GLOBAL == // + event DebugNumber(uint256); + + // Sum of tranche tokens received on `deposit` and `mint` <= sum of fulfilledDepositRequest.shares + function invariant_global_1() public returns (bool) { + if (address(trancheToken) == address(0)) { + return true; // Skip + } + + // Mint and Deposit + return sumOfClaimedDeposits[address(trancheToken)] + // investmentManager_fulfilledDepositRequest + <= sumOfFullfilledDeposits[address(trancheToken)]; + } + + function invariant_global_2() public returns (bool) { + if (address(token) == address(0)) { + return true; // Skip + } + + // Redeem and Withdraw + return sumOfClaimedRedemptions[address(token)] + // investmentManager_handleExecutedCollectRedeem + <= mintedByCurrencyPayout[address(token)]; + } + + function invariant_global_3() public returns (bool) { + if (address(trancheToken) == address(0)) { + return true; // Skip + } + + // NOTE: By removing checked the math can overflow, then underflow back, resulting in correct calculations + // NOTE: Overflow should always result back to a rational value as trancheToken cannot overflow due to other + // functions permanently reverting + unchecked { + return trancheToken.totalSupply() + // NOTE: Includes `trancheMints` which are arbitrary mints + == trancheMints[address(trancheToken)] + executedInvestments[address(trancheToken)] + + incomingTransfers[address(trancheToken)] - outGoingTransfers[address(trancheToken)] + - executedRedemptions[address(trancheToken)]; + } + } + + /// @dev Lists out all system addresses, used to check that no dust is left behind + /// NOTE: A more advanced dust check would have 100% of actors withdraw, to ensure that the sum of operations is + /// sound + function _getSystemAddresses() internal returns (address[] memory) { + uint256 SYSTEM_ADDRESSES_LENGTH = 9; + + address[] memory systemAddresses = new address[](SYSTEM_ADDRESSES_LENGTH); + systemAddresses[0] = address(vaultFactory); + systemAddresses[1] = address(trancheFactory); + + // NOTE: Skipping escrow which instead can have non-zero bal + + systemAddresses[2] = address(investmentManager); + systemAddresses[3] = address(poolManager); + systemAddresses[4] = address(vault); + systemAddresses[5] = address(token); + systemAddresses[6] = address(trancheToken); + systemAddresses[7] = address(restrictionManager); + } + + /// @dev Can we donate to this address? + /// We explicitly preventing donations since we check for exact balances + function _canDonate(address to) internal returns (bool) { + if (to == address(escrow)) { + return false; + } + + return true; + } + + /// @dev utility to ensure the target is not in the system addresses + function _isInSystemAddress(address x) internal returns (bool) { + address[] memory systemAddresses = _getSystemAddresses(); + uint256 SYSTEM_ADDRESSES_LENGTH = systemAddresses.length; + + for (uint256 i; i < SYSTEM_ADDRESSES_LENGTH; i++) { + if (systemAddresses[i] == x) return true; + } + + return false; + } + + function invariant_global_4() public returns (bool) { + if (address(token) == address(0)) { + return true; // Skip + } + + address[] memory systemAddresses = _getSystemAddresses(); + uint256 SYSTEM_ADDRESSES_LENGTH = systemAddresses.length; + + // NOTE: Skipping root and gateway since we mocked them + for (uint256 i; i < SYSTEM_ADDRESSES_LENGTH; i++) { + if (token.balanceOf(systemAddresses[i]) > 0) { + emit DebugNumber(i); // Number to index + return false; // NOTE: We do not have donation functions so this is true unless something is off + } + } + + return true; + } + + // Sum of assets received on `claimCancelDepositRequest`<= sum of fulfillCancelDepositRequest.assets + function invariant_global_5() public returns (bool) { + if (address(token) == address(0)) { + return true; // Skip + } + + // claimCancelDepositRequest + return sumOfClaimedDepositCancelations[address(token)] + // investmentManager_fulfillCancelDepositRequest + <= cancelDepositCurrencyPayout[address(token)]; + } + + // Sum of tranche tokens received on `claimCancelRedeemRequest`<= sum of + // fulfillCancelRedeemRequest.shares + function invariant_global_6() public returns (bool) { + if (address(trancheToken) == address(0)) { + return true; // Skip + } + + // claimCancelRedeemRequest + return sumOfClaimedRedeemCancelations[address(trancheToken)] + // investmentManager_fulfillCancelRedeemRequest + <= cancelRedeemTrancheTokenPayout[address(trancheToken)]; + } + + // == TRANCHE TOKENS == // + // TT-1 + // On the function handler, both transfer, transferFrom, perhaps even mint + + // TODO: Actors + // TODO: Targets / Tranches + /// @notice Sum of balances equals total supply + function invariant_tt_2() public returns (bool) { + if (address(trancheToken) == address(0)) { + return true; // Skip + } + uint256 ACTORS_LENGTH = 1; + address[] memory actors = new address[](ACTORS_LENGTH); + actors[0] = address(this); + + uint256 acc; + + for (uint256 i; i < ACTORS_LENGTH; ++i) { + // NOTE: Accounts for scenario in which we didn't deploy the demo tranche + try trancheToken.balanceOf(actors[i]) returns (uint256 bal) { + acc += bal; + } catch {} + } + + // NOTE: This ensures that supply doesn't overflow + return acc <= trancheToken.totalSupply(); + } + + function invariant_IM_1() public returns (bool) { + if (address(investmentManager) == address(0)) { + return true; + } + if (address(vault) == address(0)) { + return true; + } + if (actor != address(this)) { + return true; // Canary for actor swaps + } + + // Get actor data + + { + (uint256 depositPrice,) = _getDepositAndRedeemPrice(); + + // NOTE: Specification | Obv this breaks when you switch pools etc.. + // NOTE: Should reset + // OR: Separate the check per actor | tranche instead of being so simple + if (depositPrice > _investorsGlobals[actor].maxDepositPrice) { + return false; + } + + if (depositPrice < _investorsGlobals[actor].minDepositPrice) { + return false; + } + } + + return true; + } + + function invariant_IM_2() public returns (bool) { + if (address(investmentManager) == address(0)) { + return true; + } + if (address(vault) == address(0)) { + return true; + } + if (actor != address(this)) { + return true; // Canary for actor swaps + } + + // Get actor data + + { + (, uint256 redeemPrice) = _getDepositAndRedeemPrice(); + + if (redeemPrice > _investorsGlobals[actor].maxRedeemPrice) { + return false; + } + + if (redeemPrice < _investorsGlobals[actor].minRedeemPrice) { + return false; + } + } + + return true; + } + + // Escrow + + /** + * The balance of currencies in Escrow is + * sum of deposit requests + * minus sum of claimed redemptions + * plus transfers in + * minus transfers out + * + * NOTE: Ignores donations + */ + function invariant_E_1() public returns (bool) { + if (address(escrow) == address(0)) { + return true; + } + if (address(token) == address(0)) { + return true; + } + + // NOTE: By removing checked the math can overflow, then underflow back, resulting in correct calculations + // NOTE: Overflow should always result back to a rational value as assets cannot overflow due to other + // functions permanently reverting + unchecked { + // The balance of tokens in Escrow is sum of deposit requests plus transfers in minus transfers out + return token.balanceOf(address(escrow)) + // Deposit Requests + Transfers In + /// @audit Minted by Asset Payouts by Investors + == ( + mintedByCurrencyPayout[address(token)] + sumOfDepositRequests[address(token)] + + sumOfTransfersIn[address(token)] + // Minus Claimed Redemptions and TransfersOut + - sumOfClaimedRedemptions[address(token)] - sumOfClaimedDepositCancelations[address(token)] + - sumOfTransfersOut[address(token)] + ); + } + } + + // Escrow + /** + * The balance of tranche tokens in Escrow + * is sum of all fulfilled deposits + * minus sum of all claimed deposits + * plus sum of all redeem requests + * minus sum of claimed + * + * NOTE: Ignores donations + */ + function invariant_E_2() public returns (bool) { + if (address(trancheToken) == address(0)) { + return true; + } + + // NOTE: By removing checked the math can overflow, then underflow back, resulting in correct calculations + // NOTE: Overflow should always result back to a rational value as trancheToken cannot overflow due to other + // functions permanently reverting + unchecked { + return trancheToken.balanceOf(address(escrow)) + == ( + sumOfFullfilledDeposits[address(trancheToken)] + sumOfRedeemRequests[address(trancheToken)] + - sumOfClaimedDeposits[address(trancheToken)] - sumOfClaimedRedeemCancelations[address(trancheToken)] + - sumOfClaimedRequests[address(trancheToken)] + ); + } + } + + /// NOTE: Example of checked overflow, unused as we have changed tracking of Tranche tokens to be based on Global_3 + function _decreaseTotalTrancheSent(address tranche, uint256 amt) internal { + uint256 cachedTotal = totalTrancheSent[tranche]; + unchecked { + totalTrancheSent[tranche] -= amt; + } + + // Check for overflow here + gte(cachedTotal, totalTrancheSent[tranche], " _decreaseTotalTrancheSent Overflow"); + } + + // TODO: Multi Actor -> Swap actors memory to actors storage + // TODO: Multi Assets -> Iterate over all existing combinations + // TODO: Broken? Why + event DebugWithString(string, uint256); + + function invariant_E_3() public returns (bool) { + if (address(vault) == address(0)) { + return true; + } + + if (actor != address(this)) { + return true; // Canary for actor swaps + } + + uint256 balOfEscrow = token.balanceOf(address(escrow)); + + // Use acc to get maxWithdraw for each actor + uint256 ACTORS_LENGTH = 1; + address[] memory actors = new address[](ACTORS_LENGTH); + actors[0] = address(this); + + uint256 acc; + + for (uint256 i; i < ACTORS_LENGTH; ++i) { + // NOTE: Accounts for scenario in which we didn't deploy the demo tranche + try vault.maxWithdraw(actors[i]) returns (uint256 amt) { + emit DebugWithString("maxWithdraw", amt); + acc += amt; + } catch {} + } + + return acc <= balOfEscrow; // Ensure bal of escrow is sufficient to fulfill requests + } + + function invariant_E_4() public returns (bool) { + if (address(vault) == address(0)) { + return true; + } + + if (actor != address(this)) { + return true; // Canary for actor swaps + } + + uint256 balOfEscrow = trancheToken.balanceOf(address(escrow)); + emit DebugWithString("balOfEscrow", balOfEscrow); + + // Use acc to get maxMint for each actor + uint256 ACTORS_LENGTH = 1; + address[] memory actors = new address[](ACTORS_LENGTH); + actors[0] = address(this); + + uint256 acc; + + for (uint256 i; i < ACTORS_LENGTH; ++i) { + // NOTE: Accounts for scenario in which we didn't deploy the demo tranche + try vault.maxMint(actors[i]) returns (uint256 amt) { + emit DebugWithString("maxMint", amt); + acc += amt; + } catch {} + } + + emit DebugWithString("acc - balOfEscrow", balOfEscrow < acc ? acc - balOfEscrow : 0); + return acc <= balOfEscrow; // Ensure bal of escrow is sufficient to fulfill requests + } +} diff --git a/test/recon-core/Setup.sol b/test/recon-core/Setup.sol new file mode 100644 index 00000000..14926d79 --- /dev/null +++ b/test/recon-core/Setup.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {BaseSetup} from "@chimera/BaseSetup.sol"; +import {Escrow} from "src/Escrow.sol"; +import {InvestmentManager} from "src/InvestmentManager.sol"; +import {PoolManager} from "src/PoolManager.sol"; +import {ERC7540Vault} from "src/ERC7540Vault.sol"; +import {Root} from "src/Root.sol"; +import {Tranche} from "src/token/Tranche.sol"; + +import {ERC7540VaultFactory} from "src/factories/ERC7540VaultFactory.sol"; +import {TrancheFactory} from "src/factories/TrancheFactory.sol"; + +import {RestrictionManager} from "src/token/RestrictionManager.sol"; +import {ERC20} from "src/token/ERC20.sol"; + +// Mocks +import {IRoot} from "src/interfaces/IRoot.sol"; + +// Storage +import {SharedStorage} from "./SharedStorage.sol"; + +abstract contract Setup is BaseSetup, SharedStorage { + // Dependencies + ERC7540VaultFactory vaultFactory; + TrancheFactory trancheFactory; + + // Handled // + Escrow public escrow; // NOTE: Restriction Manager will query it + InvestmentManager investmentManager; + PoolManager poolManager; + + // TODO: CYCLE / Make it work for variable values + ERC7540Vault vault; + ERC20 token; + Tranche trancheToken; + address actor = address(this); // TODO: Generalize + RestrictionManager restrictionManager; + + bytes16 trancheId; + uint64 poolId; + uint64 currencyId; + + // MOCKS + address centrifugeChain; + IRoot root; + + // LP request ID is always 0 + uint256 REQUEST_ID = 0; + + // MOCK++ + fallback() external payable { + // Basically we will receive `root.rely, etc..` + } + + function setup() internal virtual override { + // Put self so we can perform settings + centrifugeChain = address(this); + + // Dependencies + vaultFactory = new ERC7540VaultFactory(address(this)); + trancheFactory = new TrancheFactory(address(this), address(this)); + escrow = new Escrow(address(address(this))); + root = new Root(address(escrow), 48 hours, address(this)); + restrictionManager = new RestrictionManager(address(root), address(this)); + + root.endorse(address(escrow)); + + poolManager = new PoolManager(address(escrow), address(vaultFactory), address(trancheFactory)); + poolManager.file("gateway", address(this)); + + investmentManager = new InvestmentManager(address(root), address(escrow)); + + investmentManager.file("gateway", address(this)); + investmentManager.file("poolManager", address(poolManager)); + investmentManager.rely(address(poolManager)); + investmentManager.rely(address(vaultFactory)); + + poolManager.file("investmentManager", address(investmentManager)); + restrictionManager.rely(address(poolManager)); + + // Setup Escrow Permissions + escrow.rely(address(investmentManager)); + escrow.rely(address(poolManager)); + + // Permissions on factories + vaultFactory.rely(address(poolManager)); + trancheFactory.rely(address(poolManager)); + + // TODO: Cycling of: + // Actors and ERC7540 Vaults + } + + /** + * GLOBAL GHOST + */ + mapping(address => Vars) internal _investorsGlobals; + + struct Vars { + // See IM_1 + uint256 maxDepositPrice; + uint256 minDepositPrice; + // See IM_2 + uint256 maxRedeemPrice; + uint256 minRedeemPrice; + } + + function __globals() internal { + (uint256 depositPrice, uint256 redeemPrice) = _getDepositAndRedeemPrice(); + + // Conditionally Update max | Always works on zero + _investorsGlobals[actor].maxDepositPrice = depositPrice > _investorsGlobals[actor].maxDepositPrice + ? depositPrice + : _investorsGlobals[actor].maxDepositPrice; + _investorsGlobals[actor].maxRedeemPrice = redeemPrice > _investorsGlobals[actor].maxRedeemPrice + ? redeemPrice + : _investorsGlobals[actor].maxRedeemPrice; + + // Conditionally Update min + // On zero we have to update anyway + if (_investorsGlobals[actor].minDepositPrice == 0) { + _investorsGlobals[actor].minDepositPrice = depositPrice; + } + if (_investorsGlobals[actor].minRedeemPrice == 0) { + _investorsGlobals[actor].minRedeemPrice = redeemPrice; + } + + // Conditional update after zero + _investorsGlobals[actor].minDepositPrice = depositPrice < _investorsGlobals[actor].minDepositPrice + ? depositPrice + : _investorsGlobals[actor].minDepositPrice; + _investorsGlobals[actor].minRedeemPrice = redeemPrice < _investorsGlobals[actor].minRedeemPrice + ? redeemPrice + : _investorsGlobals[actor].minRedeemPrice; + } + + function _getDepositAndRedeemPrice() internal view returns (uint256, uint256) { + ( + uint128 maxMint, + uint128 maxWithdraw, + uint256 depositPrice, + uint256 redeemPrice, + uint128 pendingDepositRequest, + uint128 pendingRedeemRequest, + uint128 claimableCancelDepositRequest, + uint128 claimableCancelRedeemRequest, + bool pendingCancelDepositRequest, + bool pendingCancelRedeemRequest + ) = investmentManager.investments(address(vault), address(actor)); + + return (depositPrice, redeemPrice); + } +} diff --git a/test/recon-core/SharedStorage.sol b/test/recon-core/SharedStorage.sol new file mode 100644 index 00000000..2afa3822 --- /dev/null +++ b/test/recon-core/SharedStorage.sol @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +import {ERC20} from "src/token/ERC20.sol"; + +abstract contract SharedStorage { + /** + * GLOBAL SETTINGS + */ + uint8 constant RECON_MODULO_DECIMALS = 19; // NOTE: Caps to 18 + + // Reenable canary tests, to help determine if coverage goals are being met + bool constant RECON_TOGGLE_CANARY_TESTS = false; + + // Properties we did not implement and we do not want that to be flagged + bool RECON_SKIPPED_PROPERTY = true; + + // NOTE: This is to not clog up the logs + bool TODO_RECON_SKIP_ERC7540 = false; + + // Prevent flagging of properties that have been acknowledged + bool TODO_RECON_SKIP_ACKNOWLEDGED_CASES = true; + + // Disable them by setting this to false + bool RECON_USE_SENTINEL_TESTS = false; + + // Gateway Mock + bool RECON_USE_HARDCODED_DECIMALS = false; // Should we use random or hardcoded decimals? + bool RECON_USE_SINGLE_DEPLOY = true; // NOTE: Actor Properties break if you use multi cause they are + // mono-dimensional + + // Should we also enforce the exact balance check on asset / shares? + // TODO: This is broken rn + // Liquidity Pool functions + bool RECON_EXACT_BAL_CHECK = false; + + /// === INTERNAL COUNTERS === /// + // Currency ID = Currency Length + // Pool ID = Pool Length + // Tranche ID = Tranche Length . toId + uint64 CURRENCY_ID = 1; + uint64 POOL_ID = 1; + uint16 TRANCHE_COUNTER = 1; + // Hash of index + salt, but we use number to be able to cycle + bytes16 TRANCHE_ID = bytes16(bytes32(uint256(TRANCHE_COUNTER))); + + // NOTE: TODO + // ** INCOMPLETE - Deployment, Setup and Cycling of Assets, Tranches, Pools and Vaults **/ + // Step 1 + // Make Currency + ERC20[] allTokens; + /// TODO: Consider dropping + mapping(address => uint128) tokenToCurrencyId; + mapping(uint128 => address) currencyIdToToken; + + // TODO: Consider refactoring to a address of Currency or Tranche to get the rest of the details + address[] trancheTokens; // TODO: Tranche to ID + address[] vaults; // TODO: Liquidity To ID? + + // === invariant_E_1 === // + // Currency + // Indexed by Currency + /** + * See: + * - vault_requestDeposit + */ + mapping(address => uint256) sumOfDepositRequests; + /** + * See: + * - invariant_erc7540_9_r + * - invariant_erc7540_9_w + * - vault_redeem + * - vault_withdraw + */ + mapping(address => uint256) sumOfClaimedRedemptions; + + /** + * See: + * - poolManager_handleTransfer(bytes32 recipient, uint128 amount) + * - poolManager_handleTransfer(address recipient, uint128 amount) + * + * - poolManager_transfer + */ + mapping(address => uint256) sumOfTransfersIn; + + /** + * See: + * - poolManager_handleTransfer + */ + mapping(address => uint256) sumOfTransfersOut; + + // Global-1 + mapping(address => uint256) cancelRedeemTrancheTokenPayout; + // Global-2 + mapping(address => uint256) cancelDepositCurrencyPayout; + + // END === invariant_E_1 === // + + // UNSURE | TODO + // Pretty sure I need to clamp by an amount sent by the user + // Else they get like a bazillion tokens + mapping(address => bool) hasRequestedDepositCancellation; + mapping(address => bool) hasRequestedRedeemCancellation; + + // === invariant_E_2 === // + // Tranche + // Indexed by Tranche Token + + /** + * // TODO: Jeroen to review! + * // NOTE This is basically an imaginary counter + * // It's not supposed to work this way in reality + * // TODO: MUST REMOVE + * See: + * - investmentManager_fulfillCancelRedeemRequest + * - investmentManager_fulfillRedeemRequest // NOTE: Used by E_1 + */ + mapping(address => uint256) mintedByCurrencyPayout; + /** + * See: + * - investmentManager_fulfillDepositRequest + */ + mapping(address => uint256) sumOfFullfilledDeposits; + + /** + * See: + * - + */ + mapping(address => uint256) sumOfClaimedDeposits; + + /** + * See: + * - vault_requestRedeem + * - investmentManager_triggerRedeemRequest + */ + mapping(address => uint256) sumOfRedeemRequests; + + /** + * See: + * - investmentManager_fulfillRedeemRequest + */ + mapping(address => uint256) sumOfClaimedRequests; + + mapping(address => uint256) sumOfClaimedDepositCancelations; + mapping(address => uint256) sumOfClaimedRedeemCancelations; + + // END === invariant_E_2 === // + + // NOTE: OLD + mapping(address => uint256) totalCurrenciesSent; + mapping(address => uint256) totalTrancheSent; + + // These are used by invariant_global_3 + mapping(address => uint256) executedInvestments; + mapping(address => uint256) executedRedemptions; + + mapping(address => uint256) incomingTransfers; + mapping(address => uint256) outGoingTransfers; + + // NOTE: You need to decide if these should exist + mapping(address => uint256) trancheMints; + + // TODO: Global-1 and Global-2 + // Something is off + /** + * handleExecutedCollectInvest + * handleExecutedCollectRedeem + */ + + // Global-1 + mapping(address => uint256) claimedAmounts; + + // Global-2 + mapping(address => uint256) depositRequests; + + // Requests + // NOTE: We need to store request data to be able to cap the values as otherwise the + // System will enter an inconsistent state + mapping(address => mapping(address => uint256)) requestDepositAssets; + mapping(address => mapping(address => uint256)) requestRedeemShares; +} diff --git a/test/recon-core/TargetFunctions.sol b/test/recon-core/TargetFunctions.sol new file mode 100644 index 00000000..2d8f491f --- /dev/null +++ b/test/recon-core/TargetFunctions.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "./Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Dependencies +import {ERC20} from "src/token/ERC20.sol"; +import {ERC7540Vault} from "src/ERC7540Vault.sol"; + +// Component +import {TrancheTokenFunctions} from "./targets/TrancheTokenFunctions.sol"; +import {GatewayMockFunctions} from "./targets/GatewayMockFunctions.sol"; +import {RestrictionManagerFunctions} from "./targets/RestrictionManagerFunctions.sol"; +import {VaultFunctions} from "./targets/VaultFunctions.sol"; +import {PoolManagerFunctions} from "./targets/PoolManagerFunctions.sol"; +import {VaultCallbacks} from "./targets/VaultCallbacks.sol"; + +abstract contract TargetFunctions is + BaseTargetFunctions, + Properties, + TrancheTokenFunctions, + GatewayMockFunctions, + RestrictionManagerFunctions, + VaultFunctions, + PoolManagerFunctions, + VaultCallbacks +{ + /** + * TODO: Port Over tranche, liquidity pool stuff + * + * + */ + + /** + * INVESTOR FUNCTIONS + */ + function invariant_doesTokenGetDeployed() public returns (bool) { + if (RECON_TOGGLE_CANARY_TESTS) { + return allTokens.length < 10; + } + + return true; + } + + function invariant_doesTranchesGetDeployed() public returns (bool) { + if (RECON_TOGGLE_CANARY_TESTS) { + return trancheTokens.length < 10; + } + + return true; + } + + function invariant_doesVaultsGetDeployed() public returns (bool) { + if (RECON_TOGGLE_CANARY_TESTS) { + return vaults.length < 10; + } + + return true; + } +} diff --git a/test/recon-core/helpers/CallTestAndUndo.sol b/test/recon-core/helpers/CallTestAndUndo.sol new file mode 100644 index 00000000..026e369f --- /dev/null +++ b/test/recon-core/helpers/CallTestAndUndo.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +/// @dev Helpful Abstract Contract to set up stateful fuzz tests +/// By using this you can undo all state changes, without using vm.snapshot and vm.revertTo +/// Which are currently not supported by Medusa +abstract contract CallTestAndUndo { + /// @dev Convenience internal function to perform an encoded call and capture the bool return value + function _doTestAndReturnResult(bytes memory encoded) internal returns (bool) { + // Call self with encoded params + bool asBool; + try this.callAndRevertWithBoolCatch(encoded) {} + catch (bytes memory reason) { + asBool = abi.decode(reason, (bool)); + } + + return asBool; + } + + /// @dev Utility function to call self and revert, this allows compatibility with a lack of vm.snapshot + // NOTE: On failure, we return true! Since Medusa skips reverting calls and we're capturing all reverts + function callAndRevertWithBoolCatch(bytes memory theCalldata) external returns (bool) { + (bool success, bytes memory returnData) = address(this).call(theCalldata); + + if (!success) { + /// @audit Reverts return success just like a normal invariant test! + bytes memory trueValue = abi.encode(true); + assembly { + revert(add(trueValue, 0x20), trueValue) + } + } + + // Else check returnData + assembly { + revert(add(returnData, 0x20), returnData) + } + } +} diff --git a/test/recon-core/targets/GatewayMockFunctions.sol b/test/recon-core/targets/GatewayMockFunctions.sol new file mode 100644 index 00000000..32ed4680 --- /dev/null +++ b/test/recon-core/targets/GatewayMockFunctions.sol @@ -0,0 +1,254 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Src Deps | For cycling of values +import {ERC7540Vault} from "src/ERC7540Vault.sol"; +import {ERC20} from "src/token/ERC20.sol"; +import {Tranche} from "src/token/Tranche.sol"; +import {RestrictionManager} from "src/token/RestrictionManager.sol"; +import {RestrictionUpdate} from "src/interfaces/token/IRestrictionManager.sol"; +import {CastLib} from "src/libraries/CastLib.sol"; + +// @dev A way to separately code and maintain a mocked implementation of `Gateway` +// Based on +// `Gateway.handle(bytes calldata message)` +/** + * - deployNewTokenPoolAndTranche Core function that deploys a Liquidity Pool + * - poolManager_addAsset + */ +abstract contract GatewayMockFunctions is BaseTargetFunctions, Properties { + using CastLib for *; + + // Deploy new Asset + // Add Asset to Pool -> Also deploy Tranche + + bool hasDoneADeploy; + + // Pool ID = Pool ID + // Asset ID + // Tranche ID + + // Basically the real complete setup + function deployNewTokenPoolAndTranche(uint8 decimals, uint256 initialMintPerUsers) + public + returns (address newToken, address newTranche, address newVault) + { + // NOTE: TEMPORARY + require(!hasDoneADeploy); // This bricks the function for this one for Medusa + // Meaning we only deploy one token, one Pool, one tranche + + if (RECON_USE_SINGLE_DEPLOY) { + hasDoneADeploy = true; + } + + if (RECON_USE_HARDCODED_DECIMALS) { + decimals = 18; + } + + initialMintPerUsers = 1_000_000e18; + // NOTE END TEMPORARY + + decimals = decimals % RECON_MODULO_DECIMALS; + /// @audit NOTE: This works because we only deploy once!! + + newToken = addToken(decimals, initialMintPerUsers); + { + CURRENCY_ID += 1; + poolManager_addAsset(CURRENCY_ID, address(newToken)); + } + + { + POOL_ID += 1; + poolManager_addPool(POOL_ID); + poolManager_allowAsset(POOL_ID, CURRENCY_ID); + } + + { + // TODO: QA: Custom Names + string memory name = "Tranche"; + string memory symbol = "T1"; + + // TODO: Ask if we should customize decimals and permissions here + poolManager_addTranche(POOL_ID, TRANCHE_ID, name, symbol, 18, address(restrictionManager)); + } + + newTranche = poolManager_deployTranche(POOL_ID, TRANCHE_ID); + + newVault = poolManager_deployVault(POOL_ID, TRANCHE_ID, address(newToken)); + + // NOTE: Add to storage! So this will be called by other functions + // NOTE: This sets the actors + // We will cycle them through other means + // NOTE: These are all tightly coupled + // First step of uncoupling is to simply store all of them as a setting + // So we can have multi deploys + // And do parallel checks + + // O(n) + // Basically switch on new deploy + // And track all historical + + // O(n*m) + // Second Step is to store permutations + // Which means we have to switch on all permutations on all checks + + vault = ERC7540Vault(newVault); + token = ERC20(newToken); + trancheToken = Tranche(newTranche); + restrictionManager = RestrictionManager(address(trancheToken.hook())); + + trancheId = TRANCHE_ID; + poolId = POOL_ID; + currencyId = CURRENCY_ID; + + // NOTE: Iplicit return + } + + // Create a Asset + // Add it to All Pools + + // Step 2 + function poolManager_addAsset(uint128 currencyId, address currencyAddress) public { + poolManager.addAsset(currencyId, currencyAddress); + + // Only if success full + tokenToCurrencyId[currencyAddress] = currencyId; + currencyIdToToken[currencyId] = currencyAddress; + } + + // Step 5 + function poolManager_allowAsset(uint64 poolId, uint128 currencyId) public { + poolManager.allowAsset(poolId, currencyId); + } + + // Step 3 + function poolManager_addPool(uint64 poolId) public { + poolManager.addPool(poolId); + } + + // Step 4 + function poolManager_addTranche( + uint64 poolId, + bytes16 trancheId, + string memory tokenName, + string memory tokenSymbol, + uint8 decimals, + address hook + ) public { + poolManager.addTranche(poolId, trancheId, tokenName, tokenSymbol, decimals, address(restrictionManager)); + } + + // Step 9 + function poolManager_deployTranche(uint64 poolId, bytes16 trancheId) public returns (address) { + return poolManager.deployTranche(poolId, trancheId); + } + + // Step 10 + function poolManager_deployVault(uint64 poolId, bytes16 trancheId, address currency) public returns (address) { + return poolManager.deployVault(poolId, trancheId, currency); + } + + /** + * NOTE: All of these are implicitly clamped! + */ + function poolManager_updateMember(uint64 validUntil) public { + poolManager.updateRestriction( + poolId, trancheId, abi.encodePacked(uint8(RestrictionUpdate.UpdateMember), actor.toBytes32(), validUntil) + ); + } + + // TODO: Price is capped at u64 to test overflows + function poolManager_updateTranchePrice(uint64 price, uint64 computedAt) public { + poolManager.updateTranchePrice(poolId, trancheId, currencyId, price, computedAt); + } + + function poolManager_updateTrancheMetadata(string memory tokenName, string memory tokenSymbol) public { + poolManager.updateTrancheMetadata(poolId, trancheId, tokenName, tokenSymbol); + } + + function poolManager_freeze() public { + poolManager.updateRestriction( + poolId, trancheId, abi.encodePacked(uint8(RestrictionUpdate.Freeze), actor.toBytes32()) + ); + } + + function poolManager_unfreeze() public { + poolManager.updateRestriction( + poolId, trancheId, abi.encodePacked(uint8(RestrictionUpdate.Unfreeze), actor.toBytes32()) + ); + } + + function poolManager_disallowAsset() public { + poolManager.disallowAsset(poolId, currencyId); + } + + // TODO: Rely / Permissions + // Only after all system is setup + function root_scheduleRely(address target) public { + root.scheduleRely(target); + } + + function root_cancelRely(address target) public { + root.cancelRely(target); + } + + function addToken(uint8 decimals, uint256 initialMintPerUsers) public returns (address) { + ERC20 newToken = new ERC20(decimals % RECON_MODULO_DECIMALS); // NOTE: we revert on <1 and >18 + + allTokens.push(newToken); + + // TODO: If you have multi actors add them here + newToken.mint(actor, initialMintPerUsers); + + return address(newToken); + } + + function getMoreToken(uint8 tokenIndex, uint256 newTokenAmount) public { + // Token Id + ERC20 newToken = allTokens[tokenIndex % allTokens.length]; + + // TODO: Consider minting to actors + newToken.mint(address(this), newTokenAmount); + } + + // Step 2 = poolManager_addAsset - GatewayMockFunctions + // Step 3 = poolManager_addPool - GatewayMockFunctions + // Step 4 = poolManager_addTranche - GatewayMockFunctions + + // Step 5 = poolManager_allowAsset - GatewayMockFunctions + + //// + // A pool can belong to a tranche + // A Vault can belong to a tranche and a currency + + // Step 6 + function deployTranche(uint64 poolId, bytes16 trancheId) public returns (address) { + address newTranche = poolManager.deployTranche(poolId, trancheId); + + trancheTokens.push(newTranche); + } + + // Step 7 is copied from step 5, ignore + + // Step 8, deploy the pool + function deployVault(uint64 poolId, bytes16 trancheId, address currency) public returns (address) { + address newVault = poolManager.deployVault(poolId, trancheId, currency); + + vaults.push(newVault); + } + + // Extra 9 - Remove liquidity Pool + function removeVault(uint64 poolId, bytes16 trancheId, address currency) public { + // TODO: Pick one from above + poolManager.removeVault(poolId, trancheId, currency); + } +} + +/// 2 Enter Functions +/// 2 Cancel Functions +/// 4 Callback functions diff --git a/test/recon-core/targets/PoolManagerFunctions.sol b/test/recon-core/targets/PoolManagerFunctions.sol new file mode 100644 index 00000000..7329d605 --- /dev/null +++ b/test/recon-core/targets/PoolManagerFunctions.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Dependencies +import {ERC20} from "src/token/ERC20.sol"; +import {ERC7540Vault} from "src/ERC7540Vault.sol"; +import {Domain} from "src/interfaces/IPoolManager.sol"; + +// Only for Tranche +abstract contract PoolManagerFunctions is BaseTargetFunctions, Properties { + // TODO: Add currencies e.g. function poolManager_transfer(address currency, bytes32 recipient, uint128 amount) + // public { + function poolManager_transfer(bytes32 recipient, uint128 amount) public { + // Currency + token.approve(address(poolManager), amount); + + bool hasReverted; + uint256 balB4Actor = token.balanceOf(actor); + uint256 balB4Escrow = token.balanceOf(address(escrow)); + try poolManager.transferAssets(address(token), recipient, amount) { + sumOfTransfersIn[address(token)] += amount; + } catch { + hasReverted = true; + } + + if (!hasReverted) { + uint256 balAfterActor = token.balanceOf(actor); + uint256 balAfterEscrow = token.balanceOf(address(escrow)); + + t(balAfterActor <= balB4Actor, "Actor has spent Currnecy"); + t(balAfterEscrow >= balB4Escrow, "Escrow has received Currnecy"); + // Check for delta balances + t((balB4Actor - balAfterActor) == (balAfterEscrow - balB4Escrow), "PM-1 & PM-2"); + } + } + + uint128 absoluteTokensToTransfer; + + // //// TODO: DECIDE HOW TO KEEP THESE + function poolManager_handleTransfer(bytes32 recipient, uint128 amount) public { + token.approve(address(poolManager), amount); + poolManager.transferAssets(address(token), recipient, amount); + sumOfTransfersIn[address(token)] += amount; + + /// === CLAMP === /// + absoluteTokensToTransfer += amount; + } + + function poolManager_handleTransfer(address recipient, uint128 amount) public { + /// === CLAMP === /// + // Avoids donations to system address + require(!_isInSystemAddress(recipient)); + require(_canDonate(recipient)); // Prevent donation to escrow for E_1 + + /// === CLAMP === /// + amount %= absoluteTokensToTransfer + 1; + absoluteTokensToTransfer -= amount; + + poolManager.handleTransfer(currencyId, recipient, amount); + + // E-1 + sumOfTransfersOut[address(token)] += amount; + } + + function poolManager_handleTransfer(uint128 amount) public { + /// === CLAMP === /// + amount %= absoluteTokensToTransfer + 1; + absoluteTokensToTransfer -= amount; + + poolManager.handleTransfer(currencyId, actor, amount); + sumOfTransfersOut[address(token)] += amount; + } + + // TODO: Live comparison of TotalSupply of tranche token + // With our current storage value + + // TODO: Clamp / Target specifics + // TODO: Actors / Randomness + // TODO: Overflow stuff + function poolManager_handleTransferTrancheTokens(uint128 amount) public { + poolManager.handleTransferTrancheTokens(poolId, trancheId, actor, amount); + // TF-12 mint tranche tokens from user, not tracked in escrow + + // Track minting for Global-3 + incomingTransfers[address(trancheToken)] += amount; + } + + function poolManager_transferTrancheTokensToEVM( + uint64 destinationChainId, + bytes32 destinationAddress, + uint128 amount + ) public { + uint256 balB4 = trancheToken.balanceOf(actor); + + // Clamp + if (amount > balB4) { + amount %= uint128(balB4); + } + + // Exact approval + trancheToken.approve(address(poolManager), amount); + + poolManager.transferTrancheTokens(poolId, trancheId, Domain.EVM, destinationChainId, destinationAddress, amount); + // TF-11 burns tranche tokens from user, not tracked in escrow + + // Track minting for Global-3 + outGoingTransfers[address(trancheToken)] += amount; + + uint256 balAfterActor = trancheToken.balanceOf(actor); + + t(balAfterActor <= balB4, "PM-3-A"); + t(balB4 - balAfterActor == amount, "PM-3-A"); + } +} diff --git a/test/recon-core/targets/RestrictionManagerFunctions.sol b/test/recon-core/targets/RestrictionManagerFunctions.sol new file mode 100644 index 00000000..57a84ba8 --- /dev/null +++ b/test/recon-core/targets/RestrictionManagerFunctions.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Dependencies +import {ERC20} from "src/token/ERC20.sol"; +import {ERC7540Vault} from "src/ERC7540Vault.sol"; + +// Only for Tranche +abstract contract RestrictionManagerFunctions is BaseTargetFunctions, Properties { + /** + * RESTRICTION MANAGER + */ + // NOTE: Same idea that we cycle through values via modifier + + // TODO: Actory Cycling + function restrictionManager_updateMemberBasic(uint64 validUntil) public { + restrictionManager.updateMember(address(trancheToken), actor, validUntil); + } + + // TODO: We prob want to keep one generic + // And one with limited actors + function restrictionManager_updateMember(address user, uint64 validUntil) public { + restrictionManager.updateMember(address(trancheToken), user, validUntil); + } + + // TODO: Actor Cycling + function restrictionManager_freeze(address user) public { + restrictionManager.freeze(address(trancheToken), actor); + } + + function restrictionManager_unfreeze(address user) public { + restrictionManager.unfreeze(address(trancheToken), actor); + } + + /** + * END RESTRICTION MANAGER + */ +} diff --git a/test/recon-core/targets/TargetSwitchingFunctions.sol b/test/recon-core/targets/TargetSwitchingFunctions.sol new file mode 100644 index 00000000..deef3e37 --- /dev/null +++ b/test/recon-core/targets/TargetSwitchingFunctions.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// @dev A way to change targets +// NOTE: There are many combinations +// NOTE: Using these functions helps you easily keep track of what's going on +abstract contract TargetSwitchingFunctions is BaseTargetFunctions, Properties { + // Cycle through actors + function changeActor(uint8 actorIndex) public { + // Given actor swap to new actor + // TODO + } + + // // changePool + // [pool][tranchesByCurrencies][INDEX] // changeTrancheForPool + // [pool][tranchesByCurrencies][INDEX] // changeCurrencyForPool -> %= the Index + + // Cycle through Pools + function changePool() public { + // Given Pool, swap to new pool + // Pool is easy + // But given a Pool, we need to set a Tranche and a Currency + // So we check if they exist, and use them + + // If they don't, we still switch + // But we will need medusa to deploy a new Tranche (and currency) + } + + // TODO: Consider adding ways to deploy + // TODO: Check if it's worth having incorrect settings as a means to explore them + + // Cycle through Tranches -> Changes the Tranche ID without changing the currency + function changeTrancheForPool() public {} + + // Changes the Currency being used + // Keeps the Same Pool + // Since it changes the currency, it also changes the tranche + function changeCurrencyForPool() public {} +} diff --git a/test/recon-core/targets/TrancheTokenFunctions.sol b/test/recon-core/targets/TrancheTokenFunctions.sol new file mode 100644 index 00000000..8356c54c --- /dev/null +++ b/test/recon-core/targets/TrancheTokenFunctions.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Dependencies +import {ERC20} from "src/token/ERC20.sol"; +import {ERC7540Vault} from "src/ERC7540Vault.sol"; + +// Only for Tranche +abstract contract TrancheTokenFunctions is BaseTargetFunctions, Properties { + function trancheToken_transfer(address to, uint256 value) public { + require(_canDonate(to), "never donate to escrow"); + + // Clamp + value = between(value, 0, trancheToken.balanceOf(actor)); + + bool hasReverted; + + try trancheToken.transfer(to, value) { + // NOTE: We're not checking for specifics! + } catch { + // NOTE: May revert for a myriad of reasons! + hasReverted = true; + } + + // TT-1 Always revert if one of them is frozen + if ( + restrictionManager.isFrozen(address(trancheToken), to) == true + || restrictionManager.isFrozen(address(trancheToken), actor) == true + ) { + t(hasReverted, "TT-1 Must Revert"); + } + + // Not a member | NOTE: Non member actor and from can move tokens? + (bool isMember,) = restrictionManager.isMember(address(trancheToken), to); + if (!isMember) { + t(hasReverted, "TT-3 Must Revert"); + } + } + + // NOTE: We need this for transferFrom to work + function trancheToken_approve(address spender, uint256 value) public { + trancheToken.approve(spender, value); + } + + // Check + function trancheToken_transferFrom(address from, address to, uint256 value) public { + require(_canDonate(to), "never donate to escrow"); + + value = between(value, 0, trancheToken.balanceOf(from)); + + bool hasReverted; + try trancheToken.transferFrom(from, to, value) { + // NOTE: We're not checking for specifics! + } catch { + // NOTE: May revert for a myriad of reasons! + hasReverted = true; + } + + // TT-1 Always revert if one of them is frozen + if ( + restrictionManager.isFrozen(address(trancheToken), to) == true + || restrictionManager.isFrozen(address(trancheToken), from) == true + ) { + t(hasReverted, "TT-1 Must Revert"); + } + + // Not a member | NOTE: Non member actor and from can move tokens? + (bool isMember,) = restrictionManager.isMember(address(trancheToken), to); + if (!isMember) { + t(hasReverted, "TT-3 Must Revert"); + } + } + + function trancheToken_mint(address to, uint256 value) public { + require(_canDonate(to), "never donate to escrow"); + + bool hasReverted; + + try trancheToken.mint(to, value) { + trancheMints[address(trancheToken)] += value; + } catch { + hasReverted = true; + } + + if (restrictionManager.isFrozen(address(trancheToken), to) == true) { + t(hasReverted, "TT-1 Must Revert"); + } + + // Not a member + (bool isMember,) = restrictionManager.isMember(address(trancheToken), to); + if (!isMember) { + t(hasReverted, "TT-3 Must Revert"); + } + } +} diff --git a/test/recon-core/targets/VaultCallbacks.sol b/test/recon-core/targets/VaultCallbacks.sol new file mode 100644 index 00000000..f9e66a5e --- /dev/null +++ b/test/recon-core/targets/VaultCallbacks.sol @@ -0,0 +1,227 @@ +/// Callbacks for ERC7540Vault + +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Src Deps | For cycling of values +import {ERC7540Vault} from "src/ERC7540Vault.sol"; +import {ERC20} from "src/token/ERC20.sol"; +import {Tranche} from "src/token/Tranche.sol"; +import {RestrictionManager} from "src/token/RestrictionManager.sol"; + +/// @dev Separate the 5 Callbacks that go from Gateway to InvestmentManager +/** + */ +abstract contract VaultCallbacks is BaseTargetFunctions, Properties { + /// @dev Callback to requestDeposit + function investmentManager_fulfillDepositRequest( + uint128 currencyPayout, + uint128 trancheTokenPayout, + uint128 decreaseByAmount + ) public { + /// === CLAMP `currencyPayout` === /// + { + ( + uint128 maxMint, + uint128 maxWithdraw, + uint256 depositPrice, + uint256 redeemPrice, + uint128 pendingDepositRequest, + uint128 pendingRedeemRequest, + uint128 claimableCancelDepositRequest, + uint128 claimableCancelRedeemRequest, + bool pendingCancelDepositRequest, + bool pendingCancelRedeemRequest + ) = investmentManager.investments(address(vault), address(actor)); + + /// @audit DANGEROUS TODO: Clamp so we ensure we never give remaining above what was sent, fully trusted + /// value + // remainingInvestOrder %= + // Need to cap currencyPayout by the amount in the escrow? + // TO ASK Should currency payout be capped to the amount? + if (pendingDepositRequest == 0) { + /// @audit NOTHING REQUESTED = WE STOP + return; + } else { + // TODO(@hieronx): revisit clamps here + currencyPayout %= pendingDepositRequest; // Needs to be capped at this value + } + } + + investmentManager.fulfillDepositRequest( + poolId, trancheId, actor, currencyId, currencyPayout, trancheTokenPayout + ); + + // E-2 | Global-1 + sumOfFullfilledDeposits[address(trancheToken)] += trancheTokenPayout; + + // Track mint + executedInvestments[address(trancheToken)] += trancheTokenPayout; + + __globals(); + } + + /// @dev Callback to requestRedeem + function investmentManager_fulfillRedeemRequest(uint128 currencyPayout, uint128 trancheTokenPayout) public { + /// === CLAMP `trancheTokenPayout` === /// + { + ( + uint128 maxMint, + uint128 maxWithdraw, + uint256 depositPrice, + uint256 redeemPrice, + uint128 pendingDepositRequest, + uint128 pendingRedeemRequest, + uint128 claimableCancelDepositRequest, + uint128 claimableCancelRedeemRequest, + bool pendingCancelDepositRequest, + bool pendingCancelRedeemRequest + ) = investmentManager.investments(address(vault), address(actor)); + + /// @audit DANGEROUS TODO: Clamp so we ensure we never give remaining above what was sent, fully trusted + /// value + // remainingInvestOrder %= + // Need to cap currencyPayout by the amount in the escrow? + // TO ASK Should currency payout be capped to the amount? + if (pendingRedeemRequest == 0) { + /// @audit NOTHING REQUESTED = WE STOP + return; + } else { + // TODO(@hieronx): revisit clamps here + trancheTokenPayout %= pendingRedeemRequest; // Needs to be capped at this value + // remainingRedeemOrder = pendingRedeemRequest - trancheTokenPayout; /// @audit Replaced by + // decreaseByAmount + } + } + + // TODO: Re check + // // TODO: test_invariant_erc7540_10_w_recon + token.mint(address(escrow), currencyPayout); + mintedByCurrencyPayout[address(token)] += currencyPayout; + // /// @audit We mint payout here which has to be paid by the borrowers + // // END TODO test_invariant_erc7540_10_w_recon + + investmentManager.fulfillRedeemRequest(poolId, trancheId, actor, currencyId, currencyPayout, trancheTokenPayout); + + sumOfClaimedRequests[address(trancheToken)] += trancheTokenPayout; + + // NOTE: Currency moves from escrow to user escrow, we do not track that at this time + + // Track burn + executedRedemptions[address(trancheToken)] += trancheTokenPayout; + + __globals(); + } + + uint256 totalCurrencyPayout; + + /// @dev Callback to `cancelDepositRequest` + /// @dev NOTE: Tranche -> decreaseByAmount is linear! + function investmentManager_fulfillCancelDepositRequest(uint128 currencyPayout) public { + /// === CLAMP `currencyPayout` === /// + // Require that the actor has done the request + require(vault.pendingCancelDepositRequest(0, actor)); + { + ( + uint128 maxMint, + uint128 maxWithdraw, + uint256 depositPrice, + uint256 redeemPrice, + uint128 pendingDepositRequest, + uint128 pendingRedeemRequest, + uint128 claimableCancelDepositRequest, + uint128 claimableCancelRedeemRequest, + bool pendingCancelDepositRequest, + bool pendingCancelRedeemRequest + ) = investmentManager.investments(address(vault), address(actor)); + + /// @audit DANGEROUS TODO: Clamp so we ensure we never give remaining above what was sent, fully trusted + /// value + // remainingInvestOrder %= + // Need to cap currencyPayout by the amount in the escrow? + // TO ASK Should currency payout be capped to the amount? + if (pendingDepositRequest == 0) { + /// @audit NOTHING REQUESTED = WE STOP + return; + } else { + currencyPayout %= pendingDepositRequest + 1; // Needs to be capped at this value + totalCurrencyPayout += currencyPayout; + /// @audit TODO Remove totalCurrencyPayout + } + } + // Need to cap remainingInvestOrder by the shares? + + // TODO: Would they set the order to a higher value? + investmentManager.fulfillCancelDepositRequest( + poolId, trancheId, actor, currencyId, currencyPayout, currencyPayout + ); + /// @audit Reduced by: currencyPayout + + cancelDepositCurrencyPayout[address(token)] += currencyPayout; + + __globals(); + } + + /// @dev Callback to `cancelRedeemRequest` + /// @dev NOTE: Tranche -> decreaseByAmount is linear! + function investmentManager_fulfillCancelRedeemRequest(uint128 trancheTokenPayout) public { + // Require that the actor has done the request + + /// === CLAMP `trancheTokenPayout` === /// + require(vault.pendingCancelRedeemRequest(0, actor)); + + { + ( + uint128 maxMint, + uint128 maxWithdraw, + uint256 depositPrice, + uint256 redeemPrice, + uint128 pendingDepositRequest, + uint128 pendingRedeemRequest, + uint128 claimableCancelDepositRequest, + uint128 claimableCancelRedeemRequest, + bool pendingCancelDepositRequest, + bool pendingCancelRedeemRequest + ) = investmentManager.investments(address(vault), address(actor)); + + /// @audit DANGEROUS TODO: Clamp so we ensure we never give remaining above what was sent, fully trusted + /// value + // remainingInvestOrder %= + // Need to cap currencyPayout by the amount in the escrow? + // TO ASK Should currency payout be capped to the amount? + if (pendingRedeemRequest == 0) { + /// @audit NOTHING REQUESTED = WE STOP + return; + } else { + trancheTokenPayout %= pendingRedeemRequest + 1; // Needs to be capped at this value + } + } + + investmentManager.fulfillCancelRedeemRequest(poolId, trancheId, actor, currencyId, trancheTokenPayout); + /// @audit trancheTokenPayout + + cancelRedeemTrancheTokenPayout[address(trancheToken)] += trancheTokenPayout; + + __globals(); + } + + // NOTE: TODO: We should remove this and consider a separate test, if we go by the FSM + // FSM -> depps + // function investmentManager_triggerRedeemRequest(uint128 trancheTokenAmount) public { + // uint256 balB4 = trancheToken.balanceOf(actor); + + // investmentManager.triggerRedeemRequest(poolId, trancheId, actor, currencyId, trancheTokenAmount); + + // uint256 balAfter = trancheToken.balanceOf(actor); + + // // E-2 /// @audit TODO: Forcefully moves tokens from user to here only if a transfer happened + // sumOfRedeemRequests[(address(trancheToken))] += balB4 - balAfter; + + // __globals(); + // } +} diff --git a/test/recon-core/targets/VaultFunctions.sol b/test/recon-core/targets/VaultFunctions.sol new file mode 100644 index 00000000..d86aacb2 --- /dev/null +++ b/test/recon-core/targets/VaultFunctions.sol @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: AGPL-3.0-only +pragma solidity 0.8.26; + +// Recon Deps +import {BaseTargetFunctions} from "@chimera/BaseTargetFunctions.sol"; +import {Properties} from "../Properties.sol"; +import {vm} from "@chimera/Hevm.sol"; + +// Dependencies +import {ERC20} from "src/token/ERC20.sol"; +import {ERC7540Vault} from "src/ERC7540Vault.sol"; + +/** + * A collection of handlers that interact with the Liquidity Pool + * NOTE: The following external functions have been skipped + * - requestDepositWithPermit + * - vault_emitDepositClaimable + * - vault_emitRedeemClaimable + * - vault_file + */ +abstract contract VaultFunctions is BaseTargetFunctions, Properties { + /// @dev Get the balance of the current token and actor + function _getTokenAndBalanceForVault() internal view returns (uint256) { + // Token + uint256 amt = token.balanceOf(actor); + + return amt; + } + + // === REQUEST === // + function vault_requestDeposit(uint256 assets) public { + assets = between(assets, 0, _getTokenAndBalanceForVault()); + + token.approve(address(vault), assets); + address to = actor; // NOTE: We transfer to self for now + + // B4 Balances + uint256 balanceB4 = token.balanceOf(actor); + uint256 balanceOfEscrowB4 = token.balanceOf(address(escrow)); + + bool hasReverted; + try vault.requestDeposit(assets, to, actor) { + // TF-1 + sumOfDepositRequests[address(token)] += assets; + + requestDepositAssets[actor][address(token)] += assets; + } catch { + hasReverted = true; + } + + // If not member + (bool isMember,) = restrictionManager.isMember(address(trancheToken), actor); + if (!isMember) { + t(hasReverted, "LP-1 Must Revert"); + } + + if ( + restrictionManager.isFrozen(address(trancheToken), actor) == true + || restrictionManager.isFrozen(address(trancheToken), to) == true + ) { + t(hasReverted, "LP-2 Must Revert"); + } + + if (!poolManager.isAllowedAsset(poolId, address(token))) { + // TODO: Ensure this works via actor switch + t(hasReverted, "LP-3 Must Revert"); + } + + // After Balances and Checks + uint256 balanceAfter = token.balanceOf(actor); + uint256 balanceOfEscrowAfter = token.balanceOf(address(escrow)); + + // NOTE: We only enforce the check if the tx didn't revert + if (!hasReverted) { + // Extra check + // NOTE: Unchecked so we get broken property and debug faster + uint256 deltaUser = balanceB4 - balanceAfter; + uint256 deltaEscrow = balanceOfEscrowAfter - balanceOfEscrowB4; + + if (RECON_EXACT_BAL_CHECK) { + eq(deltaUser, assets, "Extra LP-1"); + } + + eq(deltaUser, deltaEscrow, "7540-11"); + } + } + + function vault_requestRedeem(uint256 shares) public { + address to = actor; // TODO: donation / changes + + // B4 Balances + uint256 balanceB4 = trancheToken.balanceOf(actor); + uint256 balanceOfEscrowB4 = trancheToken.balanceOf(address(escrow)); + + trancheToken.approve(address(vault), shares); + + bool hasReverted; + try vault.requestRedeem(shares, to, actor) { + sumOfRedeemRequests[address(trancheToken)] += shares; // E-2 + requestRedeemShares[actor][address(trancheToken)] += shares; + } catch { + hasReverted = true; + } + + if ( + restrictionManager.isFrozen(address(trancheToken), actor) == true + || restrictionManager.isFrozen(address(trancheToken), to) == true + ) { + t(hasReverted, "LP-2 Must Revert"); + } + + // After Balances and Checks + uint256 balanceAfter = trancheToken.balanceOf(actor); + uint256 balanceOfEscrowAfter = trancheToken.balanceOf(address(escrow)); + + // NOTE: We only enforce the check if the tx didn't revert + if (!hasReverted) { + // Extra check + unchecked { + uint256 deltaUser = balanceB4 - balanceAfter; + uint256 deltaEscrow = balanceOfEscrowAfter - balanceOfEscrowB4; + emit DebugNumber(deltaUser); + emit DebugNumber(shares); + emit DebugNumber(deltaEscrow); + + if (RECON_EXACT_BAL_CHECK) { + eq(deltaUser, shares, "Extra LP-1"); + } + + eq(deltaUser, deltaEscrow, "7540-12"); + } + } + } + + // === CANCEL === // + + function vault_cancelDepositRequest() public { + vault.cancelDepositRequest(REQUEST_ID, actor); + } + + function vault_cancelRedeemRequest() public { + vault.cancelRedeemRequest(REQUEST_ID, actor); + } + + function vault_claimCancelDepositRequest() public { + address to = actor; // NOTE: We transfer to self for now + + uint256 assets = vault.claimCancelDepositRequest(REQUEST_ID, to, actor); + sumOfClaimedDepositCancelations[address(token)] += assets; + } + + function vault_claimCancelRedeemRequest() public { + address to = actor; // NOTE: We transfer to self for now + + uint256 shares = vault.claimCancelRedeemRequest(REQUEST_ID, to, actor); + sumOfClaimedRedeemCancelations[address(trancheToken)] += shares; + } + + function vault_deposit(uint256 assets) public { + // Bal b4 + uint256 trancheUserB4 = trancheToken.balanceOf(actor); + uint256 trancheEscrowB4 = trancheToken.balanceOf(address(escrow)); + + uint256 shares = vault.deposit(assets, address(this)); + + // Processed Deposit | E-2 | Global-1 + sumOfClaimedDeposits[address(trancheToken)] += shares; + + // Bal after + uint256 trancheUserAfter = trancheToken.balanceOf(actor); + uint256 trancheEscrowAfter = trancheToken.balanceOf(address(escrow)); + + // Extra check | // TODO: This math will prob overflow + // NOTE: Unchecked so we get broken property and debug faster + unchecked { + uint256 deltaUser = trancheUserAfter - trancheUserB4; // B4 - after -> They pay + uint256 deltaEscrow = trancheEscrowB4 - trancheEscrowAfter; // After - B4 -> They gain + emit DebugNumber(deltaUser); + emit DebugNumber(assets); + emit DebugNumber(deltaEscrow); + + if (RECON_EXACT_BAL_CHECK) { + eq(deltaUser, assets, "Extra LP-2"); + } + + eq(deltaUser, deltaEscrow, "7540-13"); + } + } + + // Given a random value, see if the other one would yield more shares or lower cost + // Not only check view + // Also do it and test it via revert test + // TODO: Mint Deposit Arb Test + // TODO: Withdraw Redeem Arb Test + + // TODO: See how these go + // TODO: Receiver -> Not this + function vault_mint(uint256 shares) public { + address to = actor; // TODO: donation / changes + + // Bal b4 + uint256 trancheUserB4 = trancheToken.balanceOf(actor); + uint256 trancheEscrowB4 = trancheToken.balanceOf(address(escrow)); + + vault.mint(shares, to); + + // Processed Deposit | E-2 + sumOfClaimedDeposits[address(trancheToken)] += shares; + + // Bal after + uint256 trancheUserAfter = trancheToken.balanceOf(actor); + uint256 trancheEscrowAfter = trancheToken.balanceOf(address(escrow)); + + // Extra check | // TODO: This math will prob overflow + // NOTE: Unchecked so we get broken property and debug faster + unchecked { + uint256 deltaUser = trancheUserAfter - trancheUserB4; // B4 - after -> They pay + uint256 deltaEscrow = trancheEscrowB4 - trancheEscrowAfter; // After - B4 -> They gain + emit DebugNumber(deltaUser); + emit DebugNumber(shares); + emit DebugNumber(deltaEscrow); + + if (RECON_EXACT_BAL_CHECK) { + eq(deltaUser, shares, "Extra LP-2"); + } + + eq(deltaUser, deltaEscrow, "7540-13"); + } + } + + // TODO: Params + function vault_redeem(uint256 shares) public { + address to = actor; // TODO: donation / changes + + // Bal b4 + uint256 tokenUserB4 = token.balanceOf(actor); + uint256 tokenEscrowB4 = token.balanceOf(address(escrow)); + + uint256 assets = vault.redeem(shares, actor, to); + + // E-1 + sumOfClaimedRedemptions[address(token)] += assets; + + // Bal after + uint256 tokenUserAfter = token.balanceOf(actor); + uint256 tokenEscrowAfter = token.balanceOf(address(escrow)); + + // Extra check | // TODO: This math will prob overflow + // NOTE: Unchecked so we get broken property and debug faster + unchecked { + uint256 deltaUser = tokenUserAfter - tokenUserB4; + + // TODO: NOTE FOT extra, verifies the transfer amount matches the returned amount + t(deltaUser == assets, "FoT-1"); + + uint256 deltaEscrow = tokenEscrowB4 - tokenEscrowAfter; + emit DebugNumber(deltaUser); + emit DebugNumber(shares); + emit DebugNumber(deltaEscrow); + + if (RECON_EXACT_BAL_CHECK) { + eq(deltaUser, shares, "Extra LP-3"); + } + + eq(deltaUser, deltaEscrow, "7540-14"); + } + } + + // TODO: Params + function vault_withdraw(uint256 assets) public { + address to = actor; // TODO: donation / changes + + // Bal b4 + uint256 tokenUserB4 = token.balanceOf(actor); + uint256 tokenEscrowB4 = token.balanceOf(address(escrow)); + + uint256 shares = vault.withdraw(assets, actor, to); + + // E-1 + sumOfClaimedRedemptions[address(token)] += assets; + + // Bal after + uint256 tokenUserAfter = token.balanceOf(actor); + uint256 tokenEscrowAfter = token.balanceOf(address(escrow)); + + // Extra check | // TODO: This math will prob overflow + // NOTE: Unchecked so we get broken property and debug faster + unchecked { + uint256 deltaUser = tokenUserAfter - tokenUserB4; + uint256 deltaEscrow = tokenEscrowB4 - tokenEscrowAfter; + emit DebugNumber(deltaUser); + emit DebugNumber(assets); + emit DebugNumber(deltaEscrow); + + if (RECON_EXACT_BAL_CHECK) { + eq(deltaUser, assets, "Extra LP-3"); + } + + eq(deltaUser, deltaEscrow, "7540-14"); + } + } +} diff --git a/test/unit/CentrifugeRouter.t.sol b/test/unit/CentrifugeRouter.t.sol index 8455a84d..e033ad42 100644 --- a/test/unit/CentrifugeRouter.t.sol +++ b/test/unit/CentrifugeRouter.t.sol @@ -9,6 +9,7 @@ import {CentrifugeRouter} from "src/CentrifugeRouter.sol"; import {MockERC20Wrapper} from "test/mocks/MockERC20Wrapper.sol"; import {CastLib} from "src/libraries/CastLib.sol"; import {Domain} from "src/interfaces/IPoolManager.sol"; +import {ITransferProxyFactory} from "src/interfaces/factories/ITransferProxy.sol"; interface Authlike { function rely(address) external; @@ -66,7 +67,7 @@ contract CentrifugeRouterTest is BaseTest { vm.expectRevert("ERC7540Vault/invalid-owner"); router.requestDeposit{value: gas}(vault_, amount, self, self, gas); - router.open(vault_); + router.enable(vault_); vm.expectRevert("CentrifugeRouter/insufficient-funds"); router.requestDeposit(vault_, amount, self, self, gas); @@ -130,7 +131,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.mint(self, amount); erc20.approve(address(router), amount); - router.open(vault_); + router.enable(vault_); router.lockDepositRequest(vault_, amount, self, self); assertEq(erc20.balanceOf(address(routerEscrow)), amount); assertEq(vault.pendingCancelDepositRequest(0, self), false); @@ -141,15 +142,21 @@ contract CentrifugeRouterTest is BaseTest { vm.expectRevert("CentrifugeRouter/insufficient-funds"); router.cancelDepositRequest(vault_, fuel); + vm.expectRevert("CentrifugeRouter/insufficient-funds"); + router.cancelDepositRequest(vault_, fuel); + vm.expectRevert("Gateway/cannot-topup-with-nothing"); router.cancelDepositRequest{value: fuel}(vault_, 0); - // vm.expectRevert("Gateway/not-enough-gas-funds"); - // router.cancelDepositRequest{value: fuel}(vault_, fuel - 1); + vm.expectRevert("InvestmentManager/no-pending-deposit-request"); + router.cancelDepositRequest{value: fuel}(vault_, fuel); + + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); + router.executeLockedDepositRequest{value: fuel}(vault_, self, fuel); + assertEq(vault.pendingDepositRequest(0, self), amount); router.cancelDepositRequest{value: fuel}(vault_, fuel); - assertEq(vault.pendingCancelDepositRequest(0, self), true); - assertEq(erc20.balanceOf(address(routerEscrow)), amount); + assertTrue(vault.pendingCancelDepositRequest(0, self)); } function testClaimCancelDepositRequest() public { @@ -164,7 +171,7 @@ contract CentrifugeRouterTest is BaseTest { centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); uint256 gas = estimateGas() + GAS_BUFFER; - router.open(vault_); + router.enable(vault_); router.requestDeposit{value: gas}(vault_, amount, self, self, gas); assertEq(erc20.balanceOf(address(escrow)), amount); @@ -196,7 +203,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.approve(address(vault_), amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); uint256 gas = estimateGas(); - router.open(vault_); + router.enable(vault_); router.requestDeposit{value: gas}(vault_, amount, self, self, gas); IERC20 share = IERC20(address(vault.share())); centrifugeChain.isFulfilledDepositRequest( @@ -231,7 +238,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.approve(address(vault_), amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); uint256 gas = estimateGas(); - router.open(vault_); + router.enable(vault_); router.requestDeposit{value: gas}(vault_, amount, self, self, gas); IERC20 share = IERC20(address(vault.share())); centrifugeChain.isFulfilledDepositRequest( @@ -270,7 +277,7 @@ contract CentrifugeRouterTest is BaseTest { erc20.approve(address(vault_), amount); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); uint256 gas = estimateGas() + GAS_BUFFER; - router.open(vault_); + router.enable(vault_); router.requestDeposit{value: gas}(vault_, amount, self, self, gas); IERC20 share = IERC20(address(vault.share())); centrifugeChain.isFulfilledDepositRequest( @@ -382,6 +389,35 @@ contract CentrifugeRouterTest is BaseTest { assertEq(erc20.balanceOf(address(escrow)), amount); } + function testTransferAssetsUsingTransferProxy() public { + address vault_ = deploySimpleVault(); + vm.label(vault_, "vault"); + + uint256 amount = 100 * 10 ** 18; + bytes32 recipient = address(2).toBytes32(); + + uint256 fuel = estimateGas(); + vm.deal(address(this), 10 ether); + + address proxy = ITransferProxyFactory(transferProxyFactory).newTransferProxy(recipient); + erc20.mint(address(proxy), amount); + + vm.expectRevert("CentrifugeRouter/insufficient-funds"); + router.transferAssetsFromProxy(proxy, address(erc20), fuel); + + vm.expectRevert("Gateway/cannot-topup-with-nothing"); + router.transferAssetsFromProxy{value: fuel}(proxy, address(erc20), 0); + + vm.expectRevert("Gateway/not-enough-gas-funds"); + router.transferAssetsFromProxy{value: fuel}(proxy, address(erc20), fuel - 1); + + assertEq(erc20.balanceOf(address(escrow)), 0); + + router.transferAssetsFromProxy{value: fuel}(proxy, address(erc20), fuel); + + assertEq(erc20.balanceOf(address(escrow)), amount); + } + function testTranferTrancheTokensToAddressDestination() public { address vault_ = deploySimpleVault(); vm.label(vault_, "vault"); @@ -393,6 +429,7 @@ contract CentrifugeRouterTest is BaseTest { address destinationAddress = makeAddr("destinationAddress"); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), address(this), type(uint64).max); + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), destinationAddress, type(uint64).max); vm.prank(address(root)); share.mint(self, 100 * 10 ** 18); @@ -428,9 +465,12 @@ contract CentrifugeRouterTest is BaseTest { uint256 amount = 100 * 10 ** 18; uint64 destinationChainId = 2; - bytes32 destinationAddress = makeAddr("destinationAddress").toBytes32(); + address destinationAddress = makeAddr("destinationAddress"); + bytes32 destinationAddressAsBytes32 = destinationAddress.toBytes32(); centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), address(this), type(uint64).max); + // centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), address(router), type(uint64).max); + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), destinationAddress, type(uint64).max); vm.prank(address(root)); share.mint(self, 100 * 10 ** 18); @@ -439,34 +479,39 @@ contract CentrifugeRouterTest is BaseTest { uint256 fuel = estimateGas(); vm.expectRevert("CentrifugeRouter/insufficient-funds"); - router.transferTrancheTokens(vault_, Domain.EVM, destinationChainId, destinationAddress, uint128(amount), fuel); + router.transferTrancheTokens( + vault_, Domain.EVM, destinationChainId, destinationAddressAsBytes32, uint128(amount), fuel + ); vm.expectRevert("Gateway/cannot-topup-with-nothing"); router.transferTrancheTokens{value: fuel}( - vault_, Domain.EVM, destinationChainId, destinationAddress, uint128(amount), 0 + vault_, Domain.EVM, destinationChainId, destinationAddressAsBytes32, uint128(amount), 0 ); vm.expectRevert("Gateway/not-enough-gas-funds"); router.transferTrancheTokens{value: fuel}( - vault_, Domain.EVM, destinationChainId, destinationAddress, uint128(amount), fuel - 1 + vault_, Domain.EVM, destinationChainId, destinationAddressAsBytes32, uint128(amount), fuel - 1 ); router.transferTrancheTokens{value: fuel}( - vault_, Domain.EVM, destinationChainId, destinationAddress, uint128(amount), fuel + vault_, Domain.EVM, destinationChainId, destinationAddressAsBytes32, uint128(amount), fuel ); assertEq(share.balanceOf(address(router)), 0); assertEq(share.balanceOf(address(this)), 0); } - function testOpenAndClose() public { + function testEnableAndDisable() public { address vault_ = deploySimpleVault(); vm.label(vault_, "vault"); assertFalse(ERC7540Vault(vault_).isOperator(self, address(router))); - router.open(vault_); + assertEq(router.isEnabled(vault_, self), false); + router.enable(vault_); assertTrue(ERC7540Vault(vault_).isOperator(self, address(router))); - router.close(vault_); + assertEq(router.isEnabled(vault_, self), true); + router.disable(vault_); assertFalse(ERC7540Vault(vault_).isOperator(self, address(router))); + assertEq(router.isEnabled(vault_, self), false); } function testWrap() public { @@ -528,6 +573,36 @@ contract CentrifugeRouterTest is BaseTest { assertEq(estimated, gatewayEstimated); } + function testIfUserIsPermittedToExecuteRequests() public { + uint256 amount = 100 * 10 ** 18; + address vault_ = deploySimpleVault(); + vm.label(vault_, "vault"); + ERC7540Vault vault = ERC7540Vault(vault_); + + vm.deal(self, 1 ether); + erc20.mint(self, amount); + erc20.approve(address(router), amount); + + bool canUserExecute = router.hasPermissions(vault_, self); + assertFalse(canUserExecute); + + router.lockDepositRequest(vault_, amount, self, self); + assertEq(erc20.balanceOf(address(routerEscrow)), amount); + + uint256 gasLimit = router.estimate("irrelevant_payload"); + + vm.expectRevert(bytes("InvestmentManager/transfer-not-allowed")); + router.executeLockedDepositRequest{value: gasLimit}(vault_, self, gasLimit); + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), self, type(uint64).max); + + canUserExecute = router.hasPermissions(vault_, self); + assertTrue(canUserExecute); + + router.executeLockedDepositRequest{value: gasLimit}(vault_, self, gasLimit); + assertEq(erc20.balanceOf(address(routerEscrow)), 0); + assertEq(erc20.balanceOf(address(escrow)), amount); + } + function estimateGas() internal view returns (uint256 total) { (, total) = gateway.estimate(PAYLOAD_FOR_GAS_ESTIMATION); } diff --git a/test/unit/ERC7540Vault.t.sol b/test/unit/ERC7540Vault.t.sol index 96954b40..13e89c7f 100644 --- a/test/unit/ERC7540Vault.t.sol +++ b/test/unit/ERC7540Vault.t.sol @@ -68,7 +68,7 @@ contract ERC7540VaultTest is BaseTest { vm.expectRevert(bytes("MathLib/uint128-overflow")); vault.convertToAssets(amount); - vm.expectRevert(bytes("MathLib/uint128-overflow")); + vm.expectRevert(bytes("InvestmentManager/exceeds-max-deposit")); vault.deposit(amount, randomUser, self); vm.expectRevert(bytes("MathLib/uint128-overflow")); @@ -77,7 +77,7 @@ contract ERC7540VaultTest is BaseTest { vm.expectRevert(bytes("MathLib/uint128-overflow")); vault.withdraw(amount, randomUser, self); - vm.expectRevert(bytes("MathLib/uint128-overflow")); + vm.expectRevert(bytes("InvestmentManager/exceeds-max-redeem")); vault.redeem(amount, randomUser, self); erc20.mint(address(this), amount); @@ -94,7 +94,7 @@ contract ERC7540VaultTest is BaseTest { bytes4 erc7540Redeem = 0x620ee8e4; bytes4 erc7540CancelDeposit = 0x8bf840e3; bytes4 erc7540CancelRedeem = 0xe76cffc7; - bytes4 erc7741 = 0xb78caa48; + bytes4 erc7741 = 0xa9e50872; bytes4 erc7714 = 0x78d77ecb; vm.assume( diff --git a/test/unit/PoolManager.t.sol b/test/unit/PoolManager.t.sol index bcd71b58..b0e87028 100644 --- a/test/unit/PoolManager.t.sol +++ b/test/unit/PoolManager.t.sol @@ -6,6 +6,7 @@ import {CastLib} from "src/libraries/CastLib.sol"; import {Domain} from "src/interfaces/IPoolManager.sol"; import {IRestrictionManager} from "src/interfaces/token/IRestrictionManager.sol"; import {MockHook} from "test/mocks/MockHook.sol"; +import {RestrictionUpdate} from "src/interfaces/token/IRestrictionManager.sol"; contract PoolManagerTest is BaseTest { using CastLib for *; @@ -60,8 +61,6 @@ contract PoolManagerTest is BaseTest { function testAddPool(uint64 poolId) public { centrifugeChain.addPool(poolId); - (uint256 createdAt) = poolManager.pools(poolId); - assertEq(createdAt, block.timestamp); vm.expectRevert(bytes("PoolManager/pool-already-added")); centrifugeChain.addPool(poolId); @@ -78,7 +77,7 @@ contract PoolManagerTest is BaseTest { string memory tokenSymbol, uint8 decimals ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(bytes(tokenName).length <= 128); vm.assume(bytes(tokenSymbol).length <= 32); @@ -99,20 +98,20 @@ contract PoolManagerTest is BaseTest { centrifugeChain.addTranche(poolId, trancheId, tokenName, tokenSymbol, 19, hook); centrifugeChain.addTranche(poolId, trancheId, tokenName, tokenSymbol, decimals, hook); + assertTrue(poolManager.canTrancheBeDeployed(poolId, trancheId)); vm.expectRevert(bytes("PoolManager/tranche-already-exists")); centrifugeChain.addTranche(poolId, trancheId, tokenName, tokenSymbol, decimals, hook); - (,,, address _hook) = poolManager.undeployedTranches(poolId, trancheId); - assertEq(_hook, hook); - poolManager.deployTranche(poolId, trancheId); + assertFalse(poolManager.canTrancheBeDeployed(poolId, trancheId)); Tranche tranche = Tranche(poolManager.getTranche(poolId, trancheId)); assertEq(tokenName, tranche.name()); assertEq(tokenSymbol, tranche.symbol()); assertEq(decimals, tranche.decimals()); + assertEq(hook, tranche.hook()); vm.expectRevert(bytes("PoolManager/tranche-already-deployed")); centrifugeChain.addTranche(poolId, trancheId, tokenName, tokenSymbol, decimals, hook); @@ -125,7 +124,7 @@ contract PoolManagerTest is BaseTest { string memory tokenSymbol, uint8 decimals ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(!hasDuplicates(trancheIds)); vm.assume(bytes(tokenName).length <= 128); vm.assume(bytes(tokenSymbol).length <= 32); @@ -153,7 +152,7 @@ contract PoolManagerTest is BaseTest { uint128 assetId ) public { vm.assume(assetId > 0); - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(bytes(tokenName).length <= 128); vm.assume(bytes(tokenSymbol).length <= 32); @@ -209,7 +208,7 @@ contract PoolManagerTest is BaseTest { bytes16 trancheId, uint128 assetId ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(assetId > 0); vm.assume(bytes(tokenName).length <= 128); vm.assume(bytes(tokenSymbol).length <= 32); @@ -313,6 +312,7 @@ contract PoolManagerTest is BaseTest { // fund this account with amount centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), address(this), validUntil); + centrifugeChain.incomingTransferTrancheTokens( vault.poolId(), vault.trancheId(), uint64(block.chainid), address(this), amount ); @@ -519,6 +519,33 @@ contract PoolManagerTest is BaseTest { centrifugeChain.updateTrancheHook(poolId, trancheId, newHook); } + function testUpdateRestriction() public { + address vault_ = deploySimpleVault(); + ERC7540Vault vault = ERC7540Vault(vault_); + uint64 poolId = vault.poolId(); + bytes16 trancheId = vault.trancheId(); + ITranche tranche = ITranche(address(ERC7540Vault(vault_).share())); + + bytes memory update = abi.encodePacked(uint8(RestrictionUpdate.Freeze), makeAddr("User").toBytes32()); + + vm.expectRevert(bytes("PoolManager/unknown-token")); + poolManager.updateRestriction(100, bytes16(bytes("100")), update); + + vm.expectRevert(bytes("Auth/not-authorized")); + vm.prank(randomUser); + poolManager.updateRestriction(poolId, trancheId, update); + + address hook = tranche.hook(); + poolManager.updateTrancheHook(poolId, trancheId, address(0)); + + vm.expectRevert(bytes("PoolManager/invalid-hook")); + poolManager.updateRestriction(poolId, trancheId, update); + + poolManager.updateTrancheHook(poolId, trancheId, hook); + + poolManager.updateRestriction(poolId, trancheId, update); + } + function testAllowAsset() public { uint128 assetId = defaultAssetId; uint64 poolId = 1; @@ -556,7 +583,7 @@ contract PoolManagerTest is BaseTest { bytes16 trancheId, uint128 price ) public { - decimals = uint8(bound(decimals, 1, 18)); + decimals = uint8(bound(decimals, 2, 18)); vm.assume(poolId > 0); vm.assume(trancheId > 0); vm.assume(assetId > 0); @@ -604,14 +631,16 @@ contract PoolManagerTest is BaseTest { root.relyContract(address(poolManager), address(this)); - vm.expectRevert(bytes("PoolManager/pool-does-not-exist")); - poolManager.removeVault(poolId + 1, trancheId, asset); - vm.expectRevert(bytes("PoolManager/tranche-does-not-exist")); poolManager.removeVault(poolId, bytes16(0), asset); poolManager.removeVault(poolId, trancheId, asset); - assertEq(poolManager.getVault(poolId, trancheId, asset), address(0)); + + vm.expectRevert(bytes("PoolManager/vault-not-deployed")); + poolManager.removeVault(poolId, trancheId, asset); + + vm.expectRevert(bytes("PoolManager/unknown-vault")); + poolManager.getVault(poolId, trancheId, asset); assertEq(investmentManager.wards(vault_), 0); assertEq(tranche.wards(vault_), 0); assertEq(tranche.allowance(address(escrow), vault_), 0); @@ -654,13 +683,94 @@ contract PoolManagerTest is BaseTest { // Remove old vault poolManager.removeVault(poolId, trancheId, asset); - assertEq(poolManager.getVault(poolId, trancheId, asset), address(0)); + vm.expectRevert(bytes("PoolManager/unknown-vault")); + poolManager.getVault(poolId, trancheId, asset); // Deploy new vault address newVault = poolManager.deployVault(poolId, trancheId, asset); assertEq(poolManager.getVault(poolId, trancheId, asset), newVault); } + function testGetVaultByAssetId() public { + address vault_ = deploySimpleVault(); + ERC7540Vault vault = ERC7540Vault(vault_); + uint64 poolId = vault.poolId(); + bytes16 trancheId = vault.trancheId(); + address asset = address(vault.asset()); + uint128 assetId = poolManager.assetToId(asset); + + assertEq(poolManager.getVault(poolId, trancheId, assetId), vault_); + } + + function testGetVaultByAsset() public { + address vault_ = deploySimpleVault(); + ERC7540Vault vault = ERC7540Vault(vault_); + uint64 poolId = vault.poolId(); + bytes16 trancheId = vault.trancheId(); + address asset = address(vault.asset()); + + assertEq(poolManager.getVault(poolId, trancheId, asset), vault_); + } + + function testGetInvalidVaultByAssetIdFails() public { + address vault_ = deploySimpleVault(); + ERC7540Vault vault = ERC7540Vault(vault_); + uint64 poolId = vault.poolId(); + bytes16 trancheId = vault.trancheId(); + vm.expectRevert(bytes("PoolManager/unknown-vault")); + poolManager.getVault(poolId, trancheId, defaultAssetId + 1); + } + + function testGetInvalidVaultByAssetFails() public { + address vault_ = deploySimpleVault(); + ERC7540Vault vault = ERC7540Vault(vault_); + uint64 poolId = vault.poolId(); + bytes16 trancheId = vault.trancheId(); + vm.expectRevert(bytes("PoolManager/unknown-vault")); + poolManager.getVault(poolId, trancheId, address(1)); + } + + function testPoolManagerCannotTransferTrancheTokensOnAccountRestrictions(uint128 amount) public { + uint64 validUntil = uint64(block.timestamp + 7 days); + address destinationAddress = makeAddr("destinationAddress"); + vm.assume(amount > 0); + + address vault_ = deploySimpleVault(); + ERC7540Vault vault = ERC7540Vault(vault_); + ITranche tranche = ITranche(address(ERC7540Vault(vault_).share())); + tranche.approve(address(poolManager), amount); + + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), destinationAddress, validUntil); + centrifugeChain.updateMember(vault.poolId(), vault.trancheId(), address(this), validUntil); + assertTrue(tranche.checkTransferRestriction(address(0), address(this), 0)); + assertTrue(tranche.checkTransferRestriction(address(0), destinationAddress, 0)); + + // Fund this address with amount + centrifugeChain.incomingTransferTrancheTokens( + vault.poolId(), vault.trancheId(), uint64(block.chainid), address(this), amount + ); + assertEq(tranche.balanceOf(address(this)), amount); + + // fails for invalid tranche token + uint64 poolId = vault.poolId(); + bytes16 trancheId = vault.trancheId(); + + centrifugeChain.freeze(poolId, trancheId, address(this)); + assertFalse(tranche.checkTransferRestriction(address(this), destinationAddress, 0)); + + vm.expectRevert(bytes("RestrictionManager/transfer-blocked")); + poolManager.transferTrancheTokens( + poolId, trancheId, Domain.EVM, uint64(block.chainid), destinationAddress.toBytes32(), amount + ); + assertEq(tranche.balanceOf(address(this)), amount); + + centrifugeChain.unfreeze(poolId, trancheId, address(this)); + poolManager.transferTrancheTokens( + poolId, trancheId, Domain.EVM, uint64(block.chainid), destinationAddress.toBytes32(), amount + ); + assertEq(tranche.balanceOf(address(escrow)), 0); + } + // helpers function hasDuplicates(bytes16[4] calldata array) internal pure returns (bool) { uint256 length = array.length; diff --git a/test/unit/factories/TrancheTokenFactory.t.sol b/test/unit/factories/TrancheTokenFactory.t.sol index c106e282..75b6d13d 100644 --- a/test/unit/factories/TrancheTokenFactory.t.sol +++ b/test/unit/factories/TrancheTokenFactory.t.sol @@ -111,6 +111,7 @@ contract FactoryTest is Test { address token = trancheFactory.newTranche(poolId, trancheId, name, symbol, decimals, trancheWards); assertEq(address(token), predictedAddress); + assertEq(trancheFactory.getAddress(poolId, trancheId, decimals), address(token)); } function testDeployingDeterministicAddressTwiceReverts( diff --git a/test/unit/factories/TransferProxyFactory.t.sol b/test/unit/factories/TransferProxyFactory.t.sol index 7bd4d597..1a418b0c 100644 --- a/test/unit/factories/TransferProxyFactory.t.sol +++ b/test/unit/factories/TransferProxyFactory.t.sol @@ -3,23 +3,46 @@ pragma solidity 0.8.26; import {TransferProxy, TransferProxyFactory} from "src/factories/TransferProxyFactory.sol"; import {ERC20} from "src/token/ERC20.sol"; +import {MockUSDC} from "test/mocks/MockUSDC.sol"; +import {MockGateway} from "test/mocks/MockGateway.sol"; import {MockPoolManager} from "test/mocks/MockPoolManager.sol"; -import "forge-std/Test.sol"; +import {ITransferProxyFactory} from "src/interfaces/factories/ITransferProxy.sol"; +import "test/BaseTest.sol"; -contract TransferProxyFactoryTest is Test { - MockPoolManager poolManager; - TransferProxyFactory factory; - ERC20 erc20; +contract TransferProxyFactoryTest is BaseTest { + function testFile() public { + ITransferProxyFactory factory = ITransferProxyFactory(transferProxyFactory); - function setUp() public { - poolManager = new MockPoolManager(); - factory = new TransferProxyFactory(address(poolManager)); - erc20 = new ERC20(18); + root.denyContract(address(factory), self); + vm.expectRevert(bytes("Auth/not-authorized")); + factory.file("poolManager", self); + + root.relyContract(address(factory), self); + factory.file("poolManager", self); + + assertEq(address(factory.poolManager()), self); + + vm.expectRevert(bytes("TransferProxyFactory/file-unrecognized-param")); + factory.file("random", self); + + TransferProxy proxy = TransferProxy(factory.newTransferProxy("")); + + vm.expectRevert(bytes("Auth/not-authorized")); + proxy.file("poolManager", self); + + root.relyContract(address(proxy), self); + proxy.file("poolManager", self); + + assertEq(address(proxy.poolManager()), self); + + vm.expectRevert(bytes("TransferProxy/file-unrecognized-param")); + proxy.file("random", self); } function testTransferProxy(bytes32 destination, bytes32 otherDestination) public { vm.assume(destination != otherDestination); + ITransferProxyFactory factory = ITransferProxyFactory(transferProxyFactory); TransferProxy proxy = TransferProxy(factory.newTransferProxy(destination)); assertEq(factory.poolManager(), address(poolManager)); assertEq(factory.proxies(destination), address(proxy)); @@ -33,17 +56,82 @@ contract TransferProxyFactoryTest is Test { erc20.mint(address(this), 100); erc20.transfer(address(proxy), 100); - assertEq(poolManager.values_address("currency"), address(0)); - assertEq(poolManager.values_bytes32("recipient"), ""); - assertEq(poolManager.values_uint128("amount"), 0); + vm.expectRevert(bytes("PoolManager/unknown-asset")); + proxy.transfer(address(erc20)); + + poolManager.addAsset(1, address(erc20)); + + assertEq(erc20.balanceOf(address(proxy)), 100); + assertEq(erc20.balanceOf(address(escrow)), 0); // Transfers are processed as expected - proxy.transfer(address(erc20), 100); - assertEq(poolManager.values_address("currency"), address(erc20)); - assertEq(poolManager.values_bytes32("recipient"), destination); - assertEq(poolManager.values_uint128("amount"), 100); + proxy.transfer(address(erc20)); // Proxies are unique per destination assertTrue(factory.newTransferProxy(otherDestination) != address(proxy)); + + assertEq(erc20.balanceOf(address(proxy)), 0); + assertEq(erc20.balanceOf(address(escrow)), 100); + } + + function testTransferProxyWithUSDC(bytes32 destination) public { + ITransferProxyFactory factory = ITransferProxyFactory(transferProxyFactory); + TransferProxy proxy = TransferProxy(factory.newTransferProxy(destination)); + + MockUSDC usdc = new MockUSDC(6); + usdc.mint(address(this), 100); + usdc.transfer(address(proxy), 100); + poolManager.addAsset(1, address(usdc)); + + assertEq(usdc.balanceOf(address(proxy)), 100); + assertEq(usdc.balanceOf(address(escrow)), 0); + + // Transfers are processed as expected + proxy.transfer(address(usdc)); + + assertEq(usdc.balanceOf(address(proxy)), 0); + assertEq(usdc.balanceOf(address(escrow)), 100); + } + + function testTransferProxyRecovery(bytes32 destination) public { + ITransferProxyFactory factory = ITransferProxyFactory(transferProxyFactory); + TransferProxy proxy = TransferProxy(factory.newTransferProxy(destination)); + + address to = makeAddr("RecoveryAddress"); + + erc20.mint(address(this), 100); + erc20.transfer(address(proxy), 100); + + assertEq(erc20.balanceOf(address(proxy)), 100); + + vm.expectRevert(bytes("Auth/not-authorized")); + proxy.recoverTokens(address(erc20), to, 100); + + root.recoverTokens(address(proxy), address(erc20), to, 100); + + assertEq(erc20.balanceOf(address(proxy)), 0); + assertEq(erc20.balanceOf(to), 100); + } + + function testTransferProxyShouldBeDeterministic(bytes32 destination) public { + address predictedAddress = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xff), + transferProxyFactory, + destination, + keccak256(abi.encodePacked(type(TransferProxy).creationCode, abi.encode(destination))) + ) + ) + ) + ) + ); + ITransferProxyFactory factory = ITransferProxyFactory(transferProxyFactory); + TransferProxy proxy = TransferProxy(factory.newTransferProxy(destination)); + + assertEq(address(proxy), predictedAddress); + assertEq(factory.getAddress(destination), address(proxy)); } } diff --git a/test/unit/gateway/GasService.t.sol b/test/unit/gateway/GasService.t.sol index 7b6ec212..5f848e2d 100644 --- a/test/unit/gateway/GasService.t.sol +++ b/test/unit/gateway/GasService.t.sol @@ -88,7 +88,7 @@ contract GasServiceTest is Test { function testEstimateFunction(bytes calldata message) public { vm.assume(message.length > 1); - vm.assume(message.toUint8(0) != uint8(MessagesLib.Call.MessageProof)); + vm.assume(message.toUint8(0) != uint8(MessagesLib.Call.MessageProof) && message.toUint8(0) <= 28); bytes memory proof = abi.encodePacked(uint8(MessagesLib.Call.MessageProof), keccak256(message)); uint256 messageCost = service.estimate(message); diff --git a/test/unit/gateway/Gateway.t.sol b/test/unit/gateway/Gateway.t.sol index 3ca2d15b..2c68c8ba 100644 --- a/test/unit/gateway/Gateway.t.sol +++ b/test/unit/gateway/Gateway.t.sol @@ -18,6 +18,12 @@ contract GatewayTest is Test { uint256 constant INITIAL_BALANCE = 1 ether; + uint256 constant FIRST_ADAPTER_ESTIMATE = 1.5 gwei; + uint256 constant SECOND_ADAPTER_ESTIMATE = 1 gwei; + uint256 constant THIRD_ADAPTER_ESTIMATE = 0.5 gwei; + uint256 constant BASE_MESSAGE_ESTIMATE = 0.75 gwei; + uint256 constant BASE_PROOF_ESTIMATE = 0.25 gwei; + address self; MockRoot root; @@ -36,12 +42,13 @@ contract GatewayTest is Test { Gateway gateway; function setUp() public { + self = address(this); root = new MockRoot(); investmentManager = new MockManager(); poolManager = new MockManager(); gasService = new MockGasService(); gateway = new Gateway(address(root), address(poolManager), address(investmentManager), address(gasService)); - + gateway.file("payers", self, true); gasService.setReturn("shouldRefuel", true); vm.deal(address(gateway), INITIAL_BALANCE); @@ -54,11 +61,12 @@ contract GatewayTest is Test { adapter4 = new MockAdapter(address(gateway)); vm.label(address(adapter4), "MockAdapter4"); - adapter1.setReturn("estimate", uint256(1.5 gwei)); - adapter2.setReturn("estimate", uint256(1.25 gwei)); - adapter3.setReturn("estimate", uint256(0.75 gwei)); + adapter1.setReturn("estimate", FIRST_ADAPTER_ESTIMATE); + adapter2.setReturn("estimate", SECOND_ADAPTER_ESTIMATE); + adapter3.setReturn("estimate", THIRD_ADAPTER_ESTIMATE); - gasService.setReturn("estimate", uint256(0.5 gwei)); + gasService.setReturn("message_estimate", BASE_MESSAGE_ESTIMATE); + gasService.setReturn("proof_estimate", BASE_PROOF_ESTIMATE); oneMockAdapter.push(address(adapter1)); @@ -83,8 +91,6 @@ contract GatewayTest is Test { nineMockAdapters.push(address(adapter1)); nineMockAdapters.push(address(adapter1)); nineMockAdapters.push(address(adapter1)); - - self = address(this); } // --- Administration --- @@ -148,7 +154,9 @@ contract GatewayTest is Test { } // --- Dynamic managers --- - function testCustomManager() public { + function testCustomManager(uint8 existingMessageId) public { + existingMessageId = uint8(bound(existingMessageId, 0, 28)); + uint8 messageId = 40; address[] memory adapters = new address[](1); adapters[0] = address(adapter1); @@ -164,6 +172,9 @@ contract GatewayTest is Test { assertEq(mgr.received(message), 0); + vm.expectRevert(bytes("Gateway/hardcoded-message-id")); + gateway.file("message", existingMessageId, address(mgr)); + gateway.file("message", messageId, address(mgr)); vm.prank(address(adapter1)); gateway.handle(message); @@ -174,39 +185,26 @@ contract GatewayTest is Test { function testFileAdapters() public { gateway.file("adapters", threeMockAdapters); + assertEq(gateway.quorum(), 3); assertEq(gateway.adapters(0), address(adapter1)); assertEq(gateway.adapters(1), address(adapter2)); assertEq(gateway.adapters(2), address(adapter3)); assertEq(gateway.activeSessionId(), 0); - vm.expectRevert(bytes("")); - assertEq(gateway.adapters(3), address(0)); - - (uint8 validadapter1Id, uint8 validadapter1Quorum,) = gateway.activeAdapters(address(adapter1)); - assertEq(validadapter1Id, 1); - assertEq(validadapter1Quorum, 3); - (uint8 validadapter2Id, uint8 validadapter2Quorum,) = gateway.activeAdapters(address(adapter2)); - assertEq(validadapter2Id, 2); - assertEq(validadapter2Quorum, 3); - (uint8 validadapter3Id, uint8 validadapter3Quorum,) = gateway.activeAdapters(address(adapter3)); - assertEq(validadapter3Id, 3); - assertEq(validadapter3Quorum, 3); - (uint8 invalidadapter4Id, uint8 invalidadapter4Quorum,) = gateway.activeAdapters(address(adapter4)); - assertEq(invalidadapter4Id, 0); - assertEq(invalidadapter4Quorum, 0); - gateway.file("adapters", fourMockAdapters); - (uint8 validadapter4Id, uint8 validadapter4Quorum,) = gateway.activeAdapters(address(adapter4)); - assertEq(validadapter4Id, 4); - assertEq(validadapter4Quorum, 4); + assertEq(gateway.quorum(), 4); + assertEq(gateway.adapters(0), address(adapter1)); + assertEq(gateway.adapters(1), address(adapter2)); + assertEq(gateway.adapters(2), address(adapter3)); assertEq(gateway.adapters(3), address(adapter4)); - assertEq(gateway.activeSessionId(), 0); + assertEq(gateway.activeSessionId(), 1); gateway.file("adapters", threeMockAdapters); - (invalidadapter4Id, invalidadapter4Quorum,) = gateway.activeAdapters(address(adapter4)); - assertEq(invalidadapter4Id, 0); - assertEq(invalidadapter4Quorum, 0); - assertEq(gateway.activeSessionId(), 1); + assertEq(gateway.quorum(), 3); + assertEq(gateway.adapters(0), address(adapter1)); + assertEq(gateway.adapters(1), address(adapter2)); + assertEq(gateway.adapters(2), address(adapter3)); + assertEq(gateway.activeSessionId(), 2); vm.expectRevert(bytes("")); assertEq(gateway.adapters(3), address(0)); @@ -399,10 +397,11 @@ contract GatewayTest is Test { function testPrepayment() public { uint256 topUpAmount = 1 gwei; - vm.expectRevert(bytes("Gateway/only-endorsed-can-topup")); + gateway.file("payers", self, false); + vm.expectRevert(bytes("Gateway/only-payers-can-top-up")); gateway.topUp{value: topUpAmount}(); - root.setReturn("endorsed_user", true); + gateway.file("payers", self, true); vm.expectRevert(bytes("Gateway/cannot-topup-with-nothing")); gateway.topUp{value: 0}(); @@ -418,8 +417,6 @@ contract GatewayTest is Test { bytes memory message = abi.encodePacked(uint8(MessagesLib.Call.AddPool), uint64(1)); bytes memory proof = _formatMessageProof(message); - root.setReturn("endorsed_user", true); - uint256 balanceBeforeTx = address(gateway).balance; uint256 topUpAmount = 10 wei; @@ -447,8 +444,6 @@ contract GatewayTest is Test { bytes memory message = abi.encodePacked(uint8(MessagesLib.Call.AddPool), uint64(1)); bytes memory proof = _formatMessageProof(message); - root.setReturn("endorsed_user", true); - uint256 balanceBeforeTx = address(gateway).balance; (uint256[] memory tranches, uint256 total) = gateway.estimate(message); @@ -479,8 +474,6 @@ contract GatewayTest is Test { bytes memory message = abi.encodePacked(uint8(MessagesLib.Call.AddPool), uint64(1)); bytes memory proof = _formatMessageProof(message); - root.setReturn("endorsed_user", true); - uint256 balanceBeforeTx = address(gateway).balance; (uint256[] memory tranches, uint256 total) = gateway.estimate(message); @@ -861,6 +854,25 @@ contract GatewayTest is Test { assertEq(token.balanceOf(receiver), amount); } + function testEstimate() public { + gateway.file("adapters", threeMockAdapters); + + bytes memory message = abi.encodePacked(uint8(MessagesLib.Call.AddPool), uint64(1)); + + uint256 firstRouterEstimate = FIRST_ADAPTER_ESTIMATE + BASE_MESSAGE_ESTIMATE; + uint256 secondRouterEstimate = SECOND_ADAPTER_ESTIMATE + BASE_PROOF_ESTIMATE; + uint256 thirdRouterEstimate = THIRD_ADAPTER_ESTIMATE + BASE_PROOF_ESTIMATE; + uint256 totalEstimate = firstRouterEstimate + secondRouterEstimate + thirdRouterEstimate; + + (uint256[] memory tranches, uint256 total) = gateway.estimate(message); + + assertEq(tranches.length, 3); + assertEq(tranches[0], firstRouterEstimate); + assertEq(tranches[1], secondRouterEstimate); + assertEq(tranches[2], thirdRouterEstimate); + assertEq(total, totalEstimate); + } + function assertVotes(bytes memory message, uint16 r1, uint16 r2, uint16 r3) internal { uint16[8] memory votes = gateway.votes(keccak256(message)); assertEq(votes[0], r1); diff --git a/test/unit/libraries/MathLib.t.sol b/test/unit/libraries/MathLib.t.sol index 4d149f85..f25307f7 100644 --- a/test/unit/libraries/MathLib.t.sol +++ b/test/unit/libraries/MathLib.t.sol @@ -46,7 +46,6 @@ contract MathLibTest is Test { function testToUint128(uint256 x) public { x = bound(x, 0, type(uint128).max); - MathLib.toUint128(x); assertEq(x, uint256(MathLib.toUint128(x))); } @@ -55,4 +54,16 @@ contract MathLibTest is Test { vm.expectRevert("MathLib/uint128-overflow"); MathLib.toUint128(uint256(type(uint128).max) + x); } + + function testToUint8(uint256 x) public { + x = bound(x, 0, type(uint8).max); + + assertEq(x, uint256(MathLib.toUint8(x))); + } + + function testToUint8Overflow(uint256 x) public { + vm.assume(x > type(uint8).max); + vm.expectRevert("MathLib/uint8-overflow"); + MathLib.toUint8(x); + } } diff --git a/verify.sh b/verify.sh index 8bbec090..97f1f3ba 100755 --- a/verify.sh +++ b/verify.sh @@ -58,6 +58,5 @@ echo "investmentManager: $investmentManager" echo "poolManager: $poolManager" echo "restrictionManager: $restrictionManager" echo "token decimals: $decimals" -forge verify-contract --constructor-args $(cast abi-encode "constructor(address, address)" $root $deployer) --watch --etherscan-api-key $ETHERSCAN_KEY $contract_address src/token/RestrictionManager.sol:RestrictionManager --verifier-url $VERIFIER_URL --chain $CHAIN_ID forge verify-contract --constructor-args $(cast abi-encode "constructor(uint8)" $decimals) --watch --etherscan-api-key $ETHERSCAN_KEY $share src/token/Tranche.sol:Tranche --verifier-url $VERIFIER_URL --chain $CHAIN_ID forge verify-contract --constructor-args $(cast abi-encode "constructor(uint64,bytes16,address,address,address,address,address)" $poolId $trancheId $asset $share $root $escrow $investmentManager) --watch --etherscan-api-key $ETHERSCAN_KEY $contract_address src/ERC7540Vault.sol:ERC7540Vault --verifier-url $VERIFIER_URL --chain $CHAIN_ID