From 90a0f6aee79b4a38e1b63b32f9627f21b1162fbb Mon Sep 17 00:00:00 2001 From: ChaoticWalrus <93558947+ChaoticWalrus@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:39:31 -0700 Subject: [PATCH] merge `m2-mainnet` into `mainnet` branch (#498) * final * fixed yml * init * add event * Update EPmgr docs with final missing functions, and update README to reflect withdrawal queue refactor! * pushn * added new storage * changed name * added logic * fixed storage gap * changed variable name * changed variable name * Update docs with latest EigenPod change * add validation; pending storage gap checks * fixed most tests * fixed * added multiple queuedwithdrawals function * made update outside of loop * add gap support; reorganize storage representation * fix syntax highlighting * fixed all tests * remove stale comments * fixed * fixed tests * init * dedupe EigenPod and Withdrawals * add README for storage validation script * fix README formatting * fixed * removed bls pubkeycompendium deployment from m2 deployment script * fix layouts for EPM and SM * event fix (#272) * made some corrections * done * added underflow handling * cleaned up all warnings * Remove Middleware from Core (#260) * remove middleware from core * remove go files from ffi * use stub * delete Prover rules for `BLSRegistryCoordinatorWithIndices` (#261) these are getting migrated to a separate repo * add weird fix * move stub to mocks * remove additional interfaces from imports * port over alexs interface change * add back whitelister * add back script per PR comment --------- Co-authored-by: steven Co-authored-by: ChaoticWalrus <93558947+ChaoticWalrus@users.noreply.github.com> * split the tests again * Revert "split the tests again" This reverts commit bf48e9d3204e5d6a16afac4c0e8b666af3b809a5. * skeleton refactor * init * Update DelegationManager.md * Update EigenPod.md * Update BeaconChainProofs.md * all tests working * cleanup * init * require cannot q withdrawal for 0 strategies and update docs * copilot crazy grammar * finished EPM unit tests * fix tree diagram typos * fix _checkPodDeployed function * split max pod revert tests * fuzz removeShares tests * update initializePodWithShares to not use stdStorage * added reg test * add error messages on asserts * tidy up * chore: have DelegationManager use stub interface instead of full interface Should help to resolve some of the import hell that we are experiencing. * initial cleanup of SM tests, added deployments to UnitTestSetup file * Using `EigenLayerUnitTestSetup` for deployment * remove middleware interfaces from this repo this commit also removes a ton of detritus from existing tests, which appears to have functionally been doing absolutely nothing. * init * change 31 to 32 * all tests working * close out tests * cleanup * fixed balance update code * rectified test * removed test import * fixed * removed other references to hysterisis * Separate into base and setup deploy contracts * made updates consistent * renamed function test names, removed unused variables * Update DelegationManager.md * chore: remove never-used storage at end of storage layout and increase __gap size to compensate This storage is at the end of the used slots in the storage layout, and was never used either on testnet or mainnet. Therefore, it should be able to be safety deleted without consequence. This commit also increases the size of the __gap variable to compensate for the removed storage. * Update EigenPod.md * clarified as effective not actual balance * removed inline comment * chore: fix compiler warnings This commit addresses a compiler warning in the DelegationManager contract, and fixes compiler warnings in various test files. These warnings were all ultimately due to unused variables. I've also added some comments to the EigenPod.t.sol file about the strange address-collision-reversion behavior that we're currently working around (since the workaround was related to an 'unused' variable). * changed proof gen repo commands * made the changes to createPod() * EigenPodManager Unit Test Refactor (#290) * skeleton refactor * finished EPM unit tests * fix tree diagram typos * fix _checkPodDeployed function * split max pod revert tests * fuzz removeShares tests * update initializePodWithShares to not use stdStorage * add error messages on asserts * fix tree file name * add share adjustment tests * create temp file for pod and pod manager unit tests * remove unused constant in EPM unit test * added fuzzing) * fixed * fixed * fixed tests * chore: fix compilation error a forbidden implicit type conversion slipped in, which was causing build errors. this minimal commit fixes the issue. * reording the indexes in-order, added a few extra comments * commenting * remove reeneterer from utils setUp() * remove strategy deployments in the setUp() helper * init * all tests working * cleanup * tidy up * added the previous PR changes to new branch * added new expectEmit checks * changes * CI err fix * chore: filter fuzzed inputs to fix 3 flaky test failures (#306) * chore: filter fuzzed inputs to fix 2 flaky test failures 1) failure in a test that appears to be due to the fuzzed 'withdrawer' matching a Strategy's address -- see run here https://github.com/Layr-Labs/eigenlayer-contracts/actions/runs/6672856290/job/18137522930#step:5:46 2) failure in a test when the fuzzed 'staker' address matches a fixed operator address which we are using (the reverting behavior is intended in this case) * fix one more flaky test failure with fuzzed input filtering this test fails (appropriately) when the `notUnpauser` input is fuzzed to the ProxyAdmin address * Fixed import errors and updated `setUp()` * Removed strategies from utils helper setup * Removed Utils.sol as its only functions is only used in StrategyManagerUnit.t.sol * formatting * Chore/fix flaky test failures (#308) * chore: filter fuzzed inputs to fix 2 flaky test failures 1) failure in a test that appears to be due to the fuzzed 'withdrawer' matching a Strategy's address -- see run here https://github.com/Layr-Labs/eigenlayer-contracts/actions/runs/6672856290/job/18137522930#step:5:46 2) failure in a test when the fuzzed 'staker' address matches a fixed operator address which we are using (the reverting behavior is intended in this case) * fix one more flaky test failure with fuzzed input filtering this test fails (appropriately) when the `notUnpauser` input is fuzzed to the ProxyAdmin address * fix one more flaky test failure this failed in the following run: https://github.com/Layr-Labs/eigenlayer-contracts/actions/runs/6697166090/job/18196461283#step:5:116 I dug into it and this was ultimately because the fuzzed `staker` param matched the ProxyAdmin address * init * Added tree file * Update README.md * Update README.md * Update README.md * Updated tree file to match code paths rather than test cases * tree branches for add/remove strategies * cleanup and typo * removed unused internal functions * check `_isDepositedStrategy()` after removing shares from all strats * chore: turn require statements into assertEq(), assertTrue(), assertFalse() * chore: changed startPrank() -> prank() where reasonable Sometimes having a wrapping startPrank() and stopPrank() code segment is useful to easily recognize which address is being pranked for those calls, especially when we prank again afterwards. That said, certain tests with single function calls could be cleaner with simply `prank()` * fix: missed stopPrank() to delete * chore: specific revert messages * chore: removed event checks, additional tests, rename variable Removed some of the StrategyAddedToDepositWhitelist event checks in the tests to cleanup. Added additional unit tests for addStrategiesToDepositWhitelist including adding already existing whitelisted strategies and ensuring events aren't emitted there. * fix: removed unneeded eigenpod doc, it's entirely captured already by EigenPodManager.md * remove balance update proof functionality * chore: github compatability and tree branching convention * add comment explaining validator fields proof for balance update * chore: remove bytes casing * test: check storage variables after intialize() * fix: tree file, nonce doesn't increment for depositIntoStrategy() * Filter addresses for EPM and EP fuzz tests (#312) * Filter proxy admin address for EPM fuzz tests * filter zero address on EP unit tests * comment out failing tests; compiling * added proofs * test: additional coverage andfilterFuzzInput modifier Tests added: - initialize() storage variables properly - depositIntoStrategyWithSignature() revert when token transfer fails - removeShares() reverts with 0 shares - removeShares() with removeAmount less than deposit - addShares() with MAX_STAKER_STRATEGY_LIST_LENGTH strategies - removeStrategiesFromDepositWhitelist() doesn't emit event on non-whitelisted strategy - removeStrategiesFromDepositWhitelist() emits event on removing whitelisted strategy Also added some small commenting, renamed tests, and updated tree file * update EigenPod unit and integration tests * update docs to reflect balance update refactor * remove unused functions from ProofParsing test util * changes * bug fix * eigenpod test file changes * changes * removed extra func * chore: migrate BitmapUtils and BN254 to middleware * chore: add correct M2 Goerli deployment info (#320) * feat(linting): add commit linter (#296) * ci(linting): apply linting to CI and update docs for it * chore: remove git-patch for applying these changes * fix: typo and mistake in git url * ci: force fail fast to be false * ci: remove fail fast behavior * ci: move fail-fast option --------- Co-authored-by: steven * EigenPod Unit Test Refactor (#317) * chore: delete unused files (#321) minor cleanup of some unused files; should help to clarify things a bit * Docs: Note edge case for not completing a queued withdrawal for EigenPod (#324) * fix: remove redudant command (#322) Co-authored-by: steven * chore: fix broken links and clean up readme (#326) * chore: use a fixed prover version (#327) Certora will be introducing v5 soon, which is expected to include breaking changes. Fixing the version at v4.13.1 should allow continuity until we make changes to upgrade. * chore: update DelegationManager docs to reflect plural queueWithdrawals function (#330) * chore: switch implementation addresses in README table to M2 versions (#328) * chore: switch implementation addresses in README table to M2 versions * chore: fix link/"preview" text for updated links * chore: fix misplaced link text (oops!) * chore: fix misplaced text for _another_ link my bad, don't know how I made this mistake 2x * test: create integration test framework (#335) See `/integration/README.md` for details on how it works --------- Co-authored-by: Yash Patil * feat: interface change for mw sigchecker * init * test: support native eth in integration tests (#340) see PR for changelog * eigenpod and eigenpodmanager integration tests (#347) * base * add base setup file * readd refactored file * pending withdrawal tests * add withdrawal test scaffold * push * finish withdrawal tests; pending additional proof sizes * remove old EigenPod unit test file; transfer integration tests to EP test file * update tree file * add tests for proofs <32 ETH * remove unused files and test comments * remove stale comment * base setup * add more base test cases * fix: update setup file pod address * buggy * test: fix setup * pause tests * some changes * test: add verify WC test * test: add withdrawal tests * nit changes --------- Co-authored-by: Yash Patil * test: implement random withdrawal generator (#349) see PR for changes/notes * Test: DelegationManager unit tests refactor (#332) * refactor: initial changes - Commented out and moved 'integration-like' withdrawal tests to Delegation.t.sol - import paths are absolute - fixed solidity version - Inheriting EigenLayerUnitTestSetup helper contract now (deploys mocks contracts, pauserRegistry, etc) * test: initial tree file * refactor: revert tree file back to # syntax while wip * test: update setup file; add initialization + setter tests * test: minor tree file updates * test: adding to tree file * test: fixed `mananger` typo * test: add register operator cases * test: add modify operator tests * test: add share adjustment tests * test: add undelegate unit tests * test: update tree file for withdrawals * test: delegateTo unit tests * fix: error from changed internal helper * test: delegateToBySignature unit tests * fix: update tree file * test: minor cleanup * test: add pausing tests * test: remove unused helper functions * test: update all tests to use defaultOperator * test: remove old tests and formatting - formatted tree file - formatted unit test file - removed old tests that have been readded and refactored - removed bytes casting for revert strings test: remove getPods file * fix: remove duplicated logic - removed assumes out of internal helpers - removed a lot of dup tree branching for readability - small nit fixes * fix: delegateToBySignature tree cleanup --------- Co-authored-by: Yash Patil * test: update eigen pod unit tests with new balance update functionality * feat: enable AVS update metadata uri (#354) * feat:enable AVS update metadata uri * test: add unit test * test: fuzz staker address != delegationApprover (#360) Failing fuzz test was result of fuzzed staker address being the same address as delegationApprover address * feat: add Certora Prover to m2-mainnet CI (#359) * fix: update rpc on withdrawal migrationt tests (#362) * Feat: Remove set withdrawal delay (#355) * feat: remove setWithdrawalDelayBlocks() removing ability to modify withdrawalDelayBlocks, will only be initialized once * fix: fixed delegation.initialize() calls - Added `initializedWithdrawalDelayBlocks` to initialize params - Added regression test for initializing> MAX_WITHDRAWAL_DELAY_BLOCKS - DelegationUnit.t.sol, small fix for internal function `_registerOperatorWith1271DelegationApprover` * chore: emit WithdrawalDelayBlocksSet * Integration Tests: Scenarios 2-3 (#350) * test: support random balance updates in integration tests (#364) - also adds user-level logging * Fix: update balance update not pod caller revert test (#366) * chore: repo cleanup (#365) - update main and docs README - update DelegationManager docs to remove method - remove stake update pushes from DelegationManager - deprecate stakeRegistry storage variable in DelegationManager - turn Slasher into a Stub - remove Slasher tests * chore: migrate to certora prover v5 (#369) - switch from fixed v4.13.1 to floating / latest version - implement minimal changes that (hopefully) make existing specs work with v5 * chore: update README, docs, and prune old files (#371) * chore: update README, docs, and prune old files * fix: add integration test reference to README * docs: fix withdrawal router comment * feat: support avs<>operator mapping with new APIs (#363) * feat: support avs<>operator mapping with new APIs and events * feat: more formal verification for eigenpods (#368) * add draft Prover rules + invariants for EigenPod contract includes new spec, script, and harness files * feat: add invariant for withdrawn validators having zero restaked balance * chore: try to tune script to fix timeout errors Prover runs for the EigenPod spec have been hitting timeouts (e.g. [here](https://prover.certora.com/output/83341/c0f1187dfb5f413caeea598ff85d82dd?anonymousKey=ee5301c2dbc2262a0d274d81ef2944c321faae0e))-- this commit is an attempt to fix these timeouts * chore: relax script parameters to try to address Prover timeouts see documentation (https://docs.certora.com/en/latest/docs/prover/cli/options.html) to understand these flags * feat: add envfree functions and a couple draft rules to EPM spec * chore: add a couple more 'envfree' functions to EigenPod spec * feat: add draft for key invariant (commented out due to compiler failures) see comments for more context on this. also included are 2 new harnessed functions * chore: remove `hashing_length_bound` in script this should make rules non-vacuous; by using different summaries we can still solve timeouts * chore: add a ton more summarization, and fix hook deals with timeouts much more effectively, and the hook works now. the `baseInvariant` rule is still broken -- see comment in the axiom definition * chore: add more dispatching and filter parametric contracts * feat: new (draft) rule to capture more of EigenPods' accounting model * fix: use correct summarization syntax * feat: hack together solution for ignoring special case the summarization of the `EigenPod. _sendETH()` function appears to still be broken I've commented this out and the rule now passes (at least from running locally), but this is definitely suboptimal am leaving several TODOs for now. * add draft Prover rules + invariants for EigenPod contract includes new spec, script, and harness files * feat: add invariant for withdrawn validators having zero restaked balance * chore: try to tune script to fix timeout errors Prover runs for the EigenPod spec have been hitting timeouts (e.g. [here](https://prover.certora.com/output/83341/c0f1187dfb5f413caeea598ff85d82dd?anonymousKey=ee5301c2dbc2262a0d274d81ef2944c321faae0e))-- this commit is an attempt to fix these timeouts * chore: relax script parameters to try to address Prover timeouts see documentation (https://docs.certora.com/en/latest/docs/prover/cli/options.html) to understand these flags * feat: add envfree functions and a couple draft rules to EPM spec * chore: add a couple more 'envfree' functions to EigenPod spec * feat: add draft for key invariant (commented out due to compiler failures) see comments for more context on this. also included are 2 new harnessed functions * chore: remove `hashing_length_bound` in script this should make rules non-vacuous; by using different summaries we can still solve timeouts * chore: add a ton more summarization, and fix hook deals with timeouts much more effectively, and the hook works now. the `baseInvariant` rule is still broken -- see comment in the axiom definition * chore: add more dispatching and filter parametric contracts * feat: new (draft) rule to capture more of EigenPods' accounting model * fix: use correct summarization syntax * feat: hack together solution for ignoring special case the summarization of the `EigenPod. _sendETH()` function appears to still be broken I've commented this out and the rule now passes (at least from running locally), but this is definitely suboptimal am leaving several TODOs for now. * chore: repo cleanup (#365) - update main and docs README - update DelegationManager docs to remove method - remove stake update pushes from DelegationManager - deprecate stakeRegistry storage variable in DelegationManager - turn Slasher into a Stub - remove Slasher tests * chore: migrate to certora prover v5 (#369) - switch from fixed v4.13.1 to floating / latest version - implement minimal changes that (hopefully) make existing specs work with v5 * add draft Prover rules + invariants for EigenPod contract includes new spec, script, and harness files * feat: add invariant for withdrawn validators having zero restaked balance * chore: try to tune script to fix timeout errors Prover runs for the EigenPod spec have been hitting timeouts (e.g. [here](https://prover.certora.com/output/83341/c0f1187dfb5f413caeea598ff85d82dd?anonymousKey=ee5301c2dbc2262a0d274d81ef2944c321faae0e))-- this commit is an attempt to fix these timeouts * chore: relax script parameters to try to address Prover timeouts see documentation (https://docs.certora.com/en/latest/docs/prover/cli/options.html) to understand these flags * feat: add envfree functions and a couple draft rules to EPM spec * chore: add a couple more 'envfree' functions to EigenPod spec * feat: add draft for key invariant (commented out due to compiler failures) see comments for more context on this. also included are 2 new harnessed functions * chore: remove `hashing_length_bound` in script this should make rules non-vacuous; by using different summaries we can still solve timeouts * chore: add a ton more summarization, and fix hook deals with timeouts much more effectively, and the hook works now. the `baseInvariant` rule is still broken -- see comment in the axiom definition * chore: add more dispatching and filter parametric contracts * feat: new (draft) rule to capture more of EigenPods' accounting model * fix: use correct summarization syntax * feat: hack together solution for ignoring special case the summarization of the `EigenPod. _sendETH()` function appears to still be broken I've commented this out and the rule now passes (at least from running locally), but this is definitely suboptimal am leaving several TODOs for now. * feat: add draft for key invariant (commented out due to compiler failures) see comments for more context on this. also included are 2 new harnessed functions * chore: add a ton more summarization, and fix hook deals with timeouts much more effectively, and the hook works now. the `baseInvariant` rule is still broken -- see comment in the axiom definition * chore: add more dispatching and filter parametric contracts * feat: new (draft) rule to capture more of EigenPods' accounting model * chore: fix merge artifacts / regen deletion of unused code --------- Co-authored-by: Alex <18387287+wadealexc@users.noreply.github.com> * fix: update docs and ensure important state changing methods are pausable (#372) * docs: update eigenpod docs and add new dmgr functions * docs: update createPod function sig * chore: ensure complete coverage of pausability * Test: Add back missing withdrawal tests to DelegationUnit.t.sol (#370) * test: revert tests * test: withdrawal tests * chore: rename helper * fix: several typos in the docs (#356) * fix typo EigenPodManager.md * fix typo AVS-Guide.md * fix typo DeployOpenEigenLayer.s.sol * fix typo README.md --------- Co-authored-by: ChaoticWalrus <93558947+ChaoticWalrus@users.noreply.github.com> * remove munged (#373) * fix: make Prover CI run correctly (#376) * Documentation Fixes: Grammar, Typos, and Prepositions (#377) * fix typo: Change 'now' to 'more' in EigenLayer middleware documentation link description * fix missing preposition in documentation: change 'according the their' to 'according to their' * fixed grammatical errors in documentation: Changed 'lets' to 'let's' and 'who's' to 'whose' in the example sentence about Merkle trees * made forceUndelegate queue a withdrawal for each strategy (#345) * changes * added back comments * chore: fix tests to work with modified behavior (#378) * chore: fix tests to work with modified behavior integration tests in particular are now slightly more flexible * fix: remove memory overwrite * docs: update dmgr docs --------- Co-authored-by: wadealexc --------- Co-authored-by: ChaoticWalrus <93558947+ChaoticWalrus@users.noreply.github.com> Co-authored-by: wadealexc * Fix m2 deploy from scratch script m2 mainnet (#379) * remove slasher checks from M2_Deploy_From_Scratch as they are no longer valid for m2-mainnet release * update anvil config file for M2_deploy_from_scratch script to work * Test: Delegation Integration tests (#358) * Fix: flaky integration tests (#384) * docs: update deployment lists for new mainnet and testnet strats (#404) * fixed comment * fix: update links in outdated issue templates (#390) * feat: add m2-mainnet-fixes to m2-mainnet (#409) * Fix: Update registration documentation & type hash (#383) * feat: strategy configs (#392) * Fix: flaky integration tests (#384) * feat: strat settings * Fix: flaky integration tests (#384) * feat: strat settings * feat: withdrawalDelayBlocks per strategy * fix: set deprecated storage to private * fix: pr review changes * fix: require string * docs: updated * refactor: rename creditTransfersDisabled * fix: doc typos * docs: add new methods and fix formatting * fix: nits and getWithdrawals view * docs: add link --------- Co-authored-by: Yash Patil <40046473+ypatil12@users.noreply.github.com> Co-authored-by: wadealexc * fix: update forge CI to include contract size checks (#402) * fix: add contract size check * fix: ignore harness build size * refactor: decouple AVS<>Operator mapping from DelegationManager (#403) * refactor: initial draft * fix: revert require chages * fix: small nits * fix: operator<>AVS mapping tests (#407) * test: added back avsRegistration tests * fix: fuzz runs 4096 * fix: broken fuzz test * docs: add docs for AVSDirectory (#408) * Feat: Add events for beacon chain balance updates & move deposit event * script update (#412) * fix: middleware script (#414) * Deneb Mainnet Patch (#395) * init commit * updated testFullWithdrawalFlow to deneb spec * added two proof paths * added both capella and deneb testS * added testFullWithdrawalFlowCapellaWithdrawalAgainstDenebRoot * added event * fixed storage gap * uncommented testsg * fix: remove line * fixed tesst * added a setter in the EPM for deneForkTimetamp * tests still broken * cleanup * added modifier * fixing tests * tests working * added tests * comments * fixed failing test * fix flaky test * removed modifier --------- Co-authored-by: gpsanant * feat: simplify fork timestamp setting logic (#416) * feat: simplify fork timestamp setting logic * test: fix tests to account for only setting timestamp once --------- Co-authored-by: wadealexc * Goerli implementation script (#413) * Create GoerliUpgrade2.s.sol * preprod deploy * Update GV2_preprod_deployment_2024_30_1.json * nit: comments * avs directory already deployed * preprod deploy * chore: fix numerous compiler warnings from script + test files (#419) warnings were for unused or shadowed variables, or functions that could have stricter mutability * docs: fixed comment * Revert "fixed comment" This reverts commit c3d7bff04ca5c980068286264e63f1719e0d0c0c. * Fixed comments (#422) * fix: fixed comment * fix: removed dead space * fix: removed extraneous the * fix: edited another comment * feat: view func for avssync (#423) * fix: failing certora-ci (#410) * fix: try installing solc-select * fix: addShares selector * fix: add staker address to DEPOSIT typehash (#424) This provides additional signature replay protection for the `StrategyManager.depositIntoStrategyWithSignature` method Specifically, it addresses the issue outlined in https://mirror.xyz/curiousapple.eth/pFqAdW2LiJ-6S4sg_u1z08k4vK6BCJ33LcyXpnNb8yU where some ERC1271 wallets might be vulnerable to "replays" of signatures While the theoretical "damage" would be ~zero (allowing someone to deposit and credit the deposit to a user), adding this field to the typehash seems to be best practice, at least. * Testnet Deploy (#425) * fix: updated beacon chain proof docs and correct error message (#427) * fix: updated doc * fix: changed more incorrect references fo verifyBalanceUpdates * fix: changed more incorrect references fo verifyBalanceUpdates * fix: fixed image * fix: fixed incorrect comment * docs: fix formatting --------- Co-authored-by: wadealexc * feat: slight refactor to make better use of strategybase hooks (#428) * feat: slight refactor to make better use of strategybase hooks * docs: add clarifying comment * test: unit tests for strat config (#426) * fix: use correct license (#431) this should be MIT licensed; looks like this was missed * docs: update README to point to deployment info (#432) * fix: include missing field from TYPEHASH calculation (#435) `delegationApprover` was missing from the `DELEGATION_APPROVAL_TYPEHASH` definition * fix: disable initializers in constructor (#436) * chore: beacon proof constants cleanup (#437) * fix: removed misc constants * feat: prevent queuing withdrawals to other addresses (#438) * fix: add back setMinWithdrawalDelayBlocks (#439) * fix:add back withdrawal delay * docs: update docs with new function --------- Co-authored-by: wadealexc * feat: cancel AVS registration salt (#434) * feat: cancel salt * fix: require that salt cannot be cancelled twice --------- Co-authored-by: wadealexc * test: fix borked test after rebase --------- Co-authored-by: Yash Patil <40046473+ypatil12@users.noreply.github.com> Co-authored-by: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Co-authored-by: quaq <56312047+0x0aa0@users.noreply.github.com> Co-authored-by: kachapah <60323455+Sidu28@users.noreply.github.com> Co-authored-by: gpsanant Co-authored-by: ChaoticWalrus <93558947+ChaoticWalrus@users.noreply.github.com> Co-authored-by: SiddyJ * docs: add common user flows to docs (#445) * updated m2_deploy_from_scratch to use avsDirectory (#449) * test: fix flaky delegation approver test (#450) * chore: update license (#451) - clarify wording about change dates - rename the "licensed work" for greater specificity * chore: Cleanup script/ directory (#454) * chore: spring cleaning * fix: test deployment path * chore: revert back to relative paths * docs: add sigP report (#460) * fix(ci): pin commitlint version (#466) * feat: track active validator count in pods (#474) * chore: remove maxPods (#463) * chore: remove maxPods * docs: update docs * refactor: set to private * feat: holesky deploy scripts (#473) * script: parser script helpers * feat: holesky deploy scripts * fix: config * fix: ops multisig whitelister * feat: track active validator count in pods (#474) * chore: remove maxPods (#463) * chore: remove maxPods * docs: update docs * refactor: set to private * script: parser script helpers * feat: holesky deploy scripts * fix: config * fix: ops multisig whitelister * refactor: maxpods removal * feat: preprod deployment * refactor: reuse other script --------- Co-authored-by: Alex <18387287+wadealexc@users.noreply.github.com> * fix: certora prover ci (#477) * fix: fallback args * fix: updated storage syntax * fix: off-by-one error (#479) * fix: off-by-one error strict inequality could cause funds that were part of a withdrawal in the block where `mostRecentWithdrawalTimestamp` gets set to become stuck. changing to non-strict inequality fixes the issue. * chore: add regression test for off-by-one error added a function to the harness contract to make this test possible confirmed fails with previous behavior, but passes with new behavior * chore: delete confusing test it's unclear quite what this is supposed to be checking will follow-up with a more reasonable test for what I think this is trying to do * chore: add test to check that "too early" proof fails should replace the confusingly named + deleted `testDeployEigenPodTooSoon` test * docs: reinstate contract addresses to their former glory (#478) * docs: reinstate contract addresses to their former glory * add updated contract addresses for holesky * welcome home boys, we've missed you * docs: fix typo * docs: add missing strategy contracts * feat: m2 mainnet upgrade script (#480) * feat: m2-mainnet upgrade script * chore: remove test output * feat: add upgrade queue test (#481) this commit also imports various tx-queuing-related utils * feat: fix encoding & complete M2 upgrade queuing test * chore: adjustments to ordering, use parsed address * fix: correct genesis time * fix: max restake gwei config --------- Co-authored-by: ChaoticWalrus <93558947+ChaoticWalrus@users.noreply.github.com> * merge `dev` into `m2-mainnet` branch (#499) * feat: add m2 upgrade output file (#482) * feat: add m2 upgrade output file * fix: consistent writing + reading of deployment params naming should now be consistent, so the ExistingDeploymentParser should work with unmodified script outputs * feat: appropriately parse new implementation addresses `test_queueUpgrade` now more accurately models the upgrade, and no longer simulates implementation deployment * chore: appropriate timelock ETA * chore: add a couple more "sanity" checks these are performed after the upgrade is simulated * chore: minor testing fixes (#486) * chore: filter fork upgrade test out of default `forge t` * chore: fix flaky test this test failed when the fuzzed 'withdrawer' param collided with the sender. by pranking the sender address, the 'assume' statement at the start of the test now has its desired behavior * test: updated fork integration tests (#483) * test: clean pr for fork testing * test: upgrade tests * fix: gh secrets * fix: remove lsts that error * test: clean up fork testing (#487) --------- Co-authored-by: Alex <18387287+wadealexc@users.noreply.github.com> * chore: fork test via environment and custom foundry profile (#490) * chore: remove parallel tests * feat: trigger fork tests via env var and lower fuzz runs * mainnet fork tests are now triggered by setting the FOUNDRY_PROFILE to forktest * forktest profile uses lower fuzz runs to reduce RPC load * CI workflow is split into unit tests, integration tests, and integration forktests * fix: remove no-match from CI * fix: flaky unit test and also continue running tests if one job fails * fix: try a different job order * test: double the fork test runs since daddy alchemy is serving * docs: update integration test README with fork test info * chore: update the pragma from =0.8.12 to ^0.8.12 (#485) * chore: update the pragma from =0.8.12 to ^0.8.12 * test: add deprecated interface pragmas and fix flaky test --------- Co-authored-by: wadealexc * docs: fix broken link (#493) * fix: m2_deploy_from_scratch script for devnet (#495) * fix: m2_deploy_from_scratch script for devnet * feat: added github action to make sure deploy script is kept up-to-date * fix(github-action): missing submodules in checkout step * feat: update mainnet implementation addresses (#497) * feat: update mainnet implementation addresses additionally, add the EigenLayerBeaconOracle to table * chore: correct shortened addresses for new implementations * chore: remove duplicate entry, more consistent format * chore: link to correct commit in table * chore: holesky strats * fix: update eigenpod beacon --------- Co-authored-by: 8sunyuan --------- Co-authored-by: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Co-authored-by: Alex <18387287+wadealexc@users.noreply.github.com> Co-authored-by: steven <12021290+stevennevins@users.noreply.github.com> Co-authored-by: wadealexc Co-authored-by: Samuel Laferriere Co-authored-by: 8sunyuan --------- Co-authored-by: sidu28 <60323455+Sidu28@users.noreply.github.com> Co-authored-by: Yash Patil <40046473+ypatil12@users.noreply.github.com> Co-authored-by: gpsanant Co-authored-by: Gautham Anant <32277907+gpsanant@users.noreply.github.com> Co-authored-by: wadealexc Co-authored-by: Yash Patil Co-authored-by: Alex <18387287+wadealexc@users.noreply.github.com> Co-authored-by: Samuel Laferriere Co-authored-by: quaq <56312047+0x0aa0@users.noreply.github.com> Co-authored-by: steven <12021290+stevennevins@users.noreply.github.com> Co-authored-by: steven Co-authored-by: pandabadger <33740825+pandabadger@users.noreply.github.com> Co-authored-by: 8sunyuan Co-authored-by: Gajesh Naik Co-authored-by: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Co-authored-by: Bowen Li Co-authored-by: iwantanode <87604944+tudorpintea999@users.noreply.github.com> Co-authored-by: teryanarmen <61996358+teryanarmen@users.noreply.github.com> Co-authored-by: joao <22820692+joaolago1113@users.noreply.github.com> Co-authored-by: SiddyJ Co-authored-by: Peter Straus <153843855+krauspt@users.noreply.github.com> --- .env.example | 5 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/ISSUE_TEMPLATE/task.md | 2 +- .github/workflows/certora-prover.yml | 17 +- .github/workflows/commitlint.yml | 23 + .github/workflows/run-deploy-scripts.yml | 38 + .github/workflows/slither.yml | 24 + .github/workflows/test.yml | 39 - .github/workflows/testinparallel.yml | 65 + .gitignore | 15 +- .husky/commit-msg | 4 + .prettierrc | 16 + .solhint.json | 9 +- .solhintignore | 1 + CONTRIBUTING.md | 36 + LICENSE | 11 +- README.md | 162 +- ...ime - Core Audit - v2.0 FINAL - Feb'24.pdf | Bin 0 -> 371573 bytes ...ase_2_Security_Assessment_Report_v2_1.pdf} | Bin 350366 -> 353960 bytes certora/.gitignore | 1 - certora/Makefile | 25 - certora/applyHarness.patch | 17 - .../harnesses/DelegationManagerHarness.sol | 41 +- certora/harnesses/EigenPodHarness.sol | 40 + certora/harnesses/EigenPodManagerHarness.sol | 24 + certora/harnesses/PausableHarness.sol | 6 +- certora/harnesses/SlasherHarness.sol | 54 +- certora/harnesses/StrategyManagerHarness.sol | 64 +- .../harnesses/StructuredLinkedListHarness.sol | 2 +- certora/harnesses/properties.md | 10 - .../scripts/core/verifyDelegationManager.sh | 14 +- certora/scripts/core/verifySlasher.sh | 20 - certora/scripts/core/verifyStrategyManager.sh | 18 +- .../libraries/verifyStructuredLinkedList.sh | 5 +- certora/scripts/permissions/verifyPausable.sh | 7 +- certora/scripts/pods/verifyEigenPod.sh | 23 + certora/scripts/pods/verifyEigenPodManager.sh | 19 + .../scripts/strategies/verifyStrategyBase.sh | 16 +- certora/specs/core/DelegationManager.spec | 180 +- certora/specs/core/Slasher.spec | 91 +- certora/specs/core/StrategyManager.spec | 171 +- .../specs/libraries/StructuredLinkedList.spec | 44 +- certora/specs/permissions/Pausable.spec | 26 +- certora/specs/pods/EigenPod.spec | 245 ++ certora/specs/pods/EigenPodManager.spec | 98 + certora/specs/properties.md | 48 - certora/specs/strategies/StrategyBase.spec | 32 +- commitlint.config.js | 1 + docs/EigenLayer-delegation-flow.md | 31 - docs/EigenLayer-deposit-flow.md | 41 - docs/EigenLayer-tech-spec.md | 127 - docs/EigenLayer-withdrawal-flow.md | 37 - docs/EigenPods.md | 74 - docs/Guaranteed-stake-updates.md | 136 - docs/Middleware-registration-operator-flow.md | 15 - docs/README.md | 173 + docs/core/AVSDirectory.md | 80 + docs/core/DelegationManager.md | 437 +++ docs/core/EigenPodManager.md | 719 ++++ docs/core/StrategyManager.md | 351 ++ docs/core/proofs/BeaconChainProofs.md | 66 + docs/docgen/core/DelegationManager.md | 208 - docs/docgen/core/DelegationManagerStorage.md | 102 - docs/docgen/core/Slasher.md | 470 --- docs/docgen/core/StrategyManager.md | 666 ---- docs/docgen/core/StrategyManagerStorage.md | 160 - .../interfaces/IBLSPublicKeyCompendium.md | 40 - docs/docgen/interfaces/IBLSRegistry.md | 84 - docs/docgen/interfaces/IBeaconChainOracle.md | 129 - docs/docgen/interfaces/IDelayedService.md | 19 - .../interfaces/IDelayedWithdrawalRouter.md | 118 - docs/docgen/interfaces/IDelegationManager.md | 128 - docs/docgen/interfaces/IDelegationTerms.md | 24 - docs/docgen/interfaces/IETHPOSDeposit.md | 60 - docs/docgen/interfaces/IEigenPod.md | 215 -- docs/docgen/interfaces/IEigenPodManager.md | 155 - docs/docgen/interfaces/IPausable.md | 83 - docs/docgen/interfaces/IPauserRegistry.md | 20 - docs/docgen/interfaces/IPaymentManager.md | 268 -- docs/docgen/interfaces/IQuorumRegistry.md | 220 -- docs/docgen/interfaces/IRegistry.md | 15 - docs/docgen/interfaces/ISafe.md | 37 - docs/docgen/interfaces/IServiceManager.md | 58 - docs/docgen/interfaces/ISlasher.md | 249 -- docs/docgen/interfaces/IStrategy.md | 183 - docs/docgen/interfaces/IStrategyManager.md | 345 -- docs/docgen/interfaces/IVoteWeigher.md | 34 - docs/docgen/interfaces/IWhitelister.md | 46 - docs/docgen/libraries/BN254.md | 215 -- docs/docgen/libraries/BeaconChainProofs.md | 427 --- docs/docgen/libraries/BytesLib.md | 88 - docs/docgen/libraries/Endian.md | 27 - docs/docgen/libraries/Merkle.md | 85 - docs/docgen/libraries/MiddlewareUtils.md | 12 - docs/docgen/libraries/StructuredLinkedList.md | 442 --- .../middleware/BLSPublicKeyCompendium.md | 51 - docs/docgen/middleware/BLSRegistry.md | 303 -- docs/docgen/middleware/BLSSignatureChecker.md | 193 - docs/docgen/middleware/PaymentManager.md | 456 --- docs/docgen/middleware/RegistryBase.md | 461 --- docs/docgen/middleware/VoteWeigherBase.md | 120 - .../middleware/VoteWeigherBaseStorage.md | 104 - .../middleware/example/ECDSARegistry.md | 205 - .../middleware/example/HashThreshold.md | 151 - .../docgen/operators/MerkleDelegationTerms.md | 129 - docs/docgen/permissions/Pausable.md | 167 - docs/docgen/permissions/PauserRegistry.md | 72 - docs/docgen/pods/BeaconChainOracle.md | 202 - docs/docgen/pods/DelayedWithdrawalRouter.md | 201 - docs/docgen/pods/EigenPod.md | 345 -- docs/docgen/pods/EigenPodManager.md | 260 -- docs/docgen/pods/EigenPodPausingConstants.md | 44 - docs/docgen/strategies/StrategyBase.md | 300 -- docs/docgen/strategies/StrategyWrapper.md | 222 -- docs/{ => experimental}/AVS-Guide.md | 54 +- docs/images/EL_delegating.png | Bin 50925 -> 46920 bytes .../Complete Withdrawal as Shares.png | Bin 0 -> 68315 bytes .../Complete Withdrawal as Tokens.png | Bin 0 -> 193954 bytes .../Staker Flow Diagrams/Delegating.png | Bin 0 -> 61308 bytes .../Staker Flow Diagrams/Depositing.png | Bin 0 -> 219382 bytes .../Partial Withdrawals.png | Bin 0 -> 101971 bytes .../Staker Flow Diagrams/Queue Withdrawal.png | Bin 0 -> 71050 bytes .../Staker Flow Diagrams/Validator Exits.png | Bin 0 -> 88354 bytes docs/images/Withdrawal_Credential_Proof.png | Bin 0 -> 41481 bytes docs/images/Withdrawal_Proof.png | Bin 0 -> 83903 bytes docs/images/samplemerkle.png | Bin 0 -> 18663 bytes docs/images/staterootproof.png | Bin 0 -> 28999 bytes foundry.toml | 17 +- package-lock.json | 3404 ++++++++++++++++- package.json | 10 +- script/Allocate.s.sol | 67 - script/BecomeOperator.s.sol | 13 - script/DepositAndDelegate.s.sol | 35 - script/EigenLayerParser.sol | 48 - script/M2_Deploy.s.sol | 75 - script/M2_deploy.config.json | 12 - script/configs/M1_deploy_goerli.config.json | 59 - .../{ => devnet}/M1_deploy_devnet.config.json | 2 +- .../M2_deploy_from_scratch.anvil.config.json | 32 + .../goerli/M1_deploy_goerli.config.json | 54 + .../Holesky_current_deployment.config.json | 55 + ...M2_deploy_from_scratch.holesky.config.json | 46 + .../M2_deploy_preprod.holesky.config.json | 58 + .../M1_deploy_mainnet.config.json | 8 +- ...2_deploy_from_scratch.mainnet.config.json} | 11 +- .../mainnet/M2_mainnet_upgrade.config.json | 46 + .../Mainnet_current_deployment.config.json | 63 + .../Mainnet_current_eigenPods.config.json | 46 + .../devnet/M2_Deploy_From_Scratch.s.sol | 617 +++ .../goerli}/GoerliUpgrade1.s.sol | 25 +- script/deploy/goerli/GoerliUpgrade2.s.sol | 129 + .../holesky/M2_Deploy_From_Scratch.s.sol | 206 + script/deploy/holesky/M2_Deploy_Preprod.s.sol | 50 + script/{ => deploy/mainnet}/M1_Deploy.s.sol | 327 +- script/deploy/mainnet/M2Deploy.s.sol | 543 +++ .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 345 ++ script/misc/DeployGoerliStrategy.s.sol | 53 - script/output/M2_deployment_data.json | 9 - .../{ => devnet}/M1_MOCK_deployment_data.json | 0 .../M2_from_scratch_deployment_data.json | 34 + .../goerli/GV2_deployment_2024_6_2.json | 30 + .../GV2_preprod_deployment_2024_30_1.json | 30 + .../M1_deployment_goerli_2023_3_23.json | 0 .../goerli/M2_deployment_data_goerli.json | 19 + .../M2_preprod_deployment_from_scratch.json | 33 + script/output/goerli/deployment_output.json | 29 + .../M1_deployment_mainnet_2023_6_9.json | 39 + .../mainnet/M2_mainnet_upgrade.output.json | 35 + script/utils/Allocator.sol | 14 - script/utils/ExistingDeploymentParser.sol | 653 +++- script/utils/Multisend.sol | 61 + script/utils/TimelockEncoding.sol | 108 + script/utils/TxEncodingInterfaces.sol | 28 + script/utils/validateStorage/README.md | 23 + .../utils/validateStorage/validateStorage.ts | 262 ++ .../utils/validateStorage/validateUpgrade.sh | 75 + script/whitelist/Staker.sol | 8 +- script/whitelist/Whitelister.sol | 170 - .../delegationFaucet/DelegationFaucet.sol | 216 ++ .../DelegationFaucetStaker.sol | 26 + .../DeployDelegationFaucet.sol | 84 + slither.config.json | 2 +- src/contracts/core/AVSDirectory.sol | 183 + src/contracts/core/AVSDirectoryStorage.sol | 46 + src/contracts/core/DelegationManager.sol | 1150 ++++-- .../core/DelegationManagerStorage.sol | 95 +- src/contracts/core/Slasher.sol | 591 +-- src/contracts/core/StrategyManager.sol | 894 ++--- src/contracts/core/StrategyManagerStorage.sol | 66 +- src/contracts/interfaces/IAVSDirectory.sol | 67 + .../interfaces/IBLSPublicKeyCompendium.sol | 33 - src/contracts/interfaces/IBLSRegistry.sol | 47 - .../interfaces/IBeaconChainOracle.sol | 59 +- src/contracts/interfaces/IDelayedService.sol | 17 - .../interfaces/IDelayedWithdrawalRouter.sol | 17 +- .../interfaces/IDelegationFaucet.sol | 42 + .../interfaces/IDelegationManager.sol | 471 ++- src/contracts/interfaces/IDelegationTerms.sol | 26 - src/contracts/interfaces/IETHPOSDeposit.sol | 2 +- src/contracts/interfaces/IEigenPod.sol | 214 +- src/contracts/interfaces/IEigenPodManager.sol | 144 +- src/contracts/interfaces/IPausable.sol | 13 +- src/contracts/interfaces/IPauserRegistry.sol | 6 +- src/contracts/interfaces/IPaymentManager.sol | 180 - src/contracts/interfaces/IQuorumRegistry.sol | 156 - src/contracts/interfaces/IRegistry.sol | 14 - src/contracts/interfaces/IServiceManager.sol | 32 - src/contracts/interfaces/ISignatureUtils.sol | 27 + src/contracts/interfaces/ISlasher.sol | 84 +- src/contracts/interfaces/ISocketUpdater.sol | 21 + src/contracts/interfaces/IStrategy.sol | 16 +- src/contracts/interfaces/IStrategyManager.sol | 262 +- src/contracts/interfaces/IVoteWeigher.sol | 25 - src/contracts/interfaces/IWhitelister.sol | 27 +- src/contracts/libraries/BN254.sol | 325 -- src/contracts/libraries/BeaconChainProofs.sol | 456 ++- src/contracts/libraries/BytesArrayBitmaps.sol | 274 -- src/contracts/libraries/BytesLib.sol | 30 +- .../libraries/EIP1271SignatureUtils.sol | 41 + src/contracts/libraries/Endian.sol | 6 +- src/contracts/libraries/Merkle.sol | 80 +- src/contracts/libraries/MiddlewareUtils.sol | 22 - .../libraries/StructuredLinkedList.sol | 4 +- .../middleware/BLSPublicKeyCompendium.sol | 81 - src/contracts/middleware/BLSRegistry.sol | 390 -- .../middleware/BLSSignatureChecker.sol | 508 --- src/contracts/middleware/PaymentManager.sol | 550 --- src/contracts/middleware/RegistryBase.sol | 669 ---- src/contracts/middleware/VoteWeigherBase.sol | 209 - .../middleware/VoteWeigherBaseStorage.sol | 77 - .../middleware/example/ECDSARegistry.sol | 202 - .../middleware/example/HashThreshold.sol | 140 - .../operators/MerkleDelegationTerms.sol | 154 - src/contracts/permissions/Pausable.sol | 25 +- src/contracts/permissions/PauserRegistry.sol | 8 +- src/contracts/pods/BeaconChainOracle.sol | 143 - .../pods/DelayedWithdrawalRouter.sol | 116 +- src/contracts/pods/EigenPod.sol | 896 +++-- src/contracts/pods/EigenPodManager.sol | 343 +- src/contracts/pods/EigenPodManagerStorage.sol | 90 + .../pods/EigenPodPausingConstants.sol | 17 +- src/contracts/strategies/StrategyBase.sol | 69 +- .../strategies/StrategyBaseTVLLimits.sol | 24 +- .../UpgradeableSignatureCheckingUtils.sol | 53 + src/test/Delegation.t.sol | 1577 ++++++-- src/test/DelegationFaucet.t.sol | 512 +++ src/test/DepositWithdraw.t.sol | 296 +- src/test/EigenLayerDeployer.t.sol | 132 +- src/test/EigenLayerTestHelper.t.sol | 283 +- src/test/EigenPod.t.sol | 1746 ++++++--- src/test/Pausable.t.sol | 2 +- src/test/Registration.t.sol | 124 - src/test/SigP/BeaconProxy.sol | 61 - src/test/SigP/DelegationTerms.sol | 46 - src/test/SigP/EigenPodManagerNEW.sol | 241 -- src/test/Slasher.t.sol | 338 -- src/test/Strategy.t.sol | 2 +- src/test/Whitelister.t.sol | 333 -- src/test/WithdrawalMigration.t.sol | 387 ++ src/test/Withdrawals.t.sol | 277 +- src/test/events/IAVSDirectoryEvents.sol | 15 + src/test/events/IDelegationManagerEvents.sol | 64 + src/test/events/IEigenPodEvents.sol | 42 + src/test/events/IEigenPodManagerEvents.sol | 16 + src/test/events/IStrategyManagerEvents.sol | 63 + .../harnesses/BytesArrayBitmapsWrapper.sol | 33 - src/test/harnesses/EigenPodHarness.sol | 127 + src/test/harnesses/EigenPodManagerWrapper.sol | 24 + src/test/harnesses/PausableHarness.sol | 4 +- src/test/integration/IntegrationBase.t.sol | 890 +++++ src/test/integration/IntegrationChecks.t.sol | 185 + .../integration/IntegrationDeployer.t.sol | 1037 +++++ src/test/integration/README.md | 115 + src/test/integration/TimeMachine.t.sol | 45 + .../mainnet/BeaconChainProofs.sol | 264 ++ .../mainnet/IBeaconChainOracle.sol | 64 + .../mainnet/IDelayedWithdrawalRouter.sol | 63 + .../mainnet/IEigenPod.sol | 148 + .../mainnet/IEigenPodManager.sol | 86 + .../mainnet/IStrategyManager.sol | 265 ++ .../integration/mocks/BeaconChainMock.t.sol | 817 ++++ .../mocks/BeaconChainOracleMock.t.sol | 17 + .../Delegate_Deposit_Queue_Complete.t.sol | 86 + .../Deposit_Delegate_Queue_Complete.t.sol | 317 ++ ...Deposit_Delegate_Redelegate_Complete.t.sol | 503 +++ ...Deposit_Delegate_Undelegate_Complete.t.sol | 244 ++ .../Deposit_Delegate_UpdateBalance.t.sol | 74 + .../tests/Deposit_Queue_Complete.t.sol | 83 + ...it_Register_QueueWithdrawal_Complete.t.sol | 79 + .../integration/tests/Upgrade_Setup.t.sol | 110 + src/test/integration/users/User.t.sol | 488 +++ src/test/integration/users/User_M1.t.sol | 133 + src/test/mocks/BeaconChainOracleMock.sol | 12 +- .../mocks/DelayedWithdrawalRouterMock.sol | 52 + src/test/mocks/DelegationManagerMock.sol | 201 + src/test/mocks/DelegationMock.sol | 51 - src/test/mocks/DelegationTermsMock.sol | 59 - src/test/mocks/Dummy.sol | 2 +- src/test/mocks/ERC20Mock.sol | 16 +- src/test/mocks/ERC20_OneWeiFeeOnTransfer.sol | 4 +- .../mocks/ERC20_SetTransferReverting_Mock.sol | 2 +- src/test/mocks/ETHDepositMock.sol | 2 +- src/test/mocks/EigenPodManagerMock.sol | 43 +- src/test/mocks/EigenPodMock.sol | 93 + src/test/mocks/EmptyContract.sol | 2 +- src/test/mocks/IBeaconChainOracleMock.sol | 6 +- src/test/mocks/MiddlewareRegistryMock.sol | 53 - src/test/mocks/MiddlewareVoteWeigherMock.sol | 53 - src/test/mocks/OwnableMock.sol | 6 + src/test/mocks/PublicKeyCompendiumMock.sol | 38 - src/test/mocks/ServiceManagerMock.sol | 54 - src/test/mocks/SlasherMock.sol | 8 +- src/test/mocks/StrategyManagerMock.sol | 121 +- ...alanceUpdateProof_balance28ETH_302913.json | 1 + ...ceUpdateProof_notOverCommitted_302913.json | 69 + ...ommitted_302913_incrementedBlockBy100.json | 1 + ...nceUpdateProof_updated_to_0ETH_302913.json | 69 + ...ceUpdateProof_updated_to_30ETH_302913.json | 1 + ...fullWithdrawalCapellaAgainstDenebRoot.json | 160 + src/test/test-data/fullWithdrawalDeneb.json | 162 + src/test/test-data/fullWithdrawalProof.json | 127 - .../test-data/fullWithdrawalProof_Latest.json | 159 + ...lWithdrawalProof_Latest_1SlotAdvanced.json | 160 + .../fullWithdrawalProof_Latest_28ETH.json | 1 + .../test-data/partialWithdrawalProof.json | 127 - .../partialWithdrawalProof_Latest.json | 159 + ...lanceUpdateProof_Overcommitted_61511.json} | 38 +- ...ceUpdateProof_notOvercommitted_61511.json} | 42 +- ...committed_61511_incrementedBlockBy100.json | 125 + ...drawalCredentialAndBalanceProof_61068.json | 10 +- ...drawalCredentialAndBalanceProof_61336.json | 16 +- .../withdrawal_credential_proof_302913.json | 115 + ..._credential_proof_302913_30ETHBalance.json | 1 + ...drawal_credential_proof_302913_exited.json | 115 + .../withdrawal_credential_proof_510257.json | 115 + src/test/tree/DelegationManagerUnit.tree | 189 + src/test/tree/EigenPodManagerUnit.tree | 86 + src/test/tree/EigenPodUnit.tree | 171 + src/test/tree/StrategyManagerUnit.tree | 111 + src/test/unit/AVSDirectoryUnit.t.sol | 355 ++ src/test/unit/BeaconChainOracleUnit.t.sol | 298 -- src/test/unit/BytesArrayBitmapsUnit.t.sol | 155 - .../unit/DelayedWithdrawalRouterUnit.t.sol | 8 +- src/test/unit/DelegationUnit.t.sol | 3385 +++++++++++++++- src/test/unit/EigenPod-PodManagerUnit.t.sol | 648 ++++ src/test/unit/EigenPodManagerUnit.t.sol | 537 +++ src/test/unit/EigenPodUnit.t.sol | 1094 ++++++ src/test/unit/PausableUnit.t.sol | 4 +- src/test/unit/PauserRegistryUnit.t.sol | 4 +- src/test/unit/SlasherUnit.t.sol | 799 ---- src/test/unit/StrategyBaseTVLLimitsUnit.sol | 4 +- src/test/unit/StrategyBaseUnit.t.sol | 4 +- src/test/unit/StrategyManagerUnit.t.sol | 3260 +++++----------- src/test/utils/EigenLayerUnitTestBase.sol | 35 + src/test/utils/EigenLayerUnitTestSetup.sol | 30 + src/test/utils/Operators.sol | 42 +- src/test/utils/Owners.sol | 2 +- src/test/utils/ProofParsing.sol | 127 +- src/test/utils/SignatureCompaction.sol | 2 +- src/test/{unit => utils}/Utils.sol | 4 +- test.sh | 23 + tsconfig.json | 11 + 362 files changed, 34558 insertions(+), 25382 deletions(-) create mode 100644 .github/workflows/commitlint.yml create mode 100644 .github/workflows/run-deploy-scripts.yml create mode 100644 .github/workflows/slither.yml delete mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/testinparallel.yml create mode 100755 .husky/commit-msg create mode 100644 .prettierrc create mode 100644 .solhintignore create mode 100644 CONTRIBUTING.md create mode 100644 audits/Sigma Prime - Core Audit - v2.0 FINAL - Feb'24.pdf rename audits/{Sigma_Prime_Layr_Labs_Eigen_Layer_2_Security_Assessment_v1.pdf => Sigma_Prime_Eigen_Layer_Phase_2_Security_Assessment_Report_v2_1.pdf} (64%) delete mode 100644 certora/.gitignore delete mode 100644 certora/Makefile delete mode 100644 certora/applyHarness.patch create mode 100644 certora/harnesses/EigenPodHarness.sol create mode 100644 certora/harnesses/EigenPodManagerHarness.sol delete mode 100644 certora/harnesses/properties.md delete mode 100644 certora/scripts/core/verifySlasher.sh create mode 100644 certora/scripts/pods/verifyEigenPod.sh create mode 100644 certora/scripts/pods/verifyEigenPodManager.sh create mode 100644 certora/specs/pods/EigenPod.spec create mode 100644 certora/specs/pods/EigenPodManager.spec delete mode 100644 certora/specs/properties.md create mode 100644 commitlint.config.js delete mode 100644 docs/EigenLayer-delegation-flow.md delete mode 100644 docs/EigenLayer-deposit-flow.md delete mode 100644 docs/EigenLayer-tech-spec.md delete mode 100644 docs/EigenLayer-withdrawal-flow.md delete mode 100644 docs/EigenPods.md delete mode 100644 docs/Guaranteed-stake-updates.md delete mode 100644 docs/Middleware-registration-operator-flow.md create mode 100644 docs/README.md create mode 100644 docs/core/AVSDirectory.md create mode 100644 docs/core/DelegationManager.md create mode 100644 docs/core/EigenPodManager.md create mode 100644 docs/core/StrategyManager.md create mode 100644 docs/core/proofs/BeaconChainProofs.md delete mode 100644 docs/docgen/core/DelegationManager.md delete mode 100644 docs/docgen/core/DelegationManagerStorage.md delete mode 100644 docs/docgen/core/Slasher.md delete mode 100644 docs/docgen/core/StrategyManager.md delete mode 100644 docs/docgen/core/StrategyManagerStorage.md delete mode 100644 docs/docgen/interfaces/IBLSPublicKeyCompendium.md delete mode 100644 docs/docgen/interfaces/IBLSRegistry.md delete mode 100644 docs/docgen/interfaces/IBeaconChainOracle.md delete mode 100644 docs/docgen/interfaces/IDelayedService.md delete mode 100644 docs/docgen/interfaces/IDelayedWithdrawalRouter.md delete mode 100644 docs/docgen/interfaces/IDelegationManager.md delete mode 100644 docs/docgen/interfaces/IDelegationTerms.md delete mode 100644 docs/docgen/interfaces/IETHPOSDeposit.md delete mode 100644 docs/docgen/interfaces/IEigenPod.md delete mode 100644 docs/docgen/interfaces/IEigenPodManager.md delete mode 100644 docs/docgen/interfaces/IPausable.md delete mode 100644 docs/docgen/interfaces/IPauserRegistry.md delete mode 100644 docs/docgen/interfaces/IPaymentManager.md delete mode 100644 docs/docgen/interfaces/IQuorumRegistry.md delete mode 100644 docs/docgen/interfaces/IRegistry.md delete mode 100644 docs/docgen/interfaces/ISafe.md delete mode 100644 docs/docgen/interfaces/IServiceManager.md delete mode 100644 docs/docgen/interfaces/ISlasher.md delete mode 100644 docs/docgen/interfaces/IStrategy.md delete mode 100644 docs/docgen/interfaces/IStrategyManager.md delete mode 100644 docs/docgen/interfaces/IVoteWeigher.md delete mode 100644 docs/docgen/interfaces/IWhitelister.md delete mode 100644 docs/docgen/libraries/BN254.md delete mode 100644 docs/docgen/libraries/BeaconChainProofs.md delete mode 100644 docs/docgen/libraries/BytesLib.md delete mode 100644 docs/docgen/libraries/Endian.md delete mode 100644 docs/docgen/libraries/Merkle.md delete mode 100644 docs/docgen/libraries/MiddlewareUtils.md delete mode 100644 docs/docgen/libraries/StructuredLinkedList.md delete mode 100644 docs/docgen/middleware/BLSPublicKeyCompendium.md delete mode 100644 docs/docgen/middleware/BLSRegistry.md delete mode 100644 docs/docgen/middleware/BLSSignatureChecker.md delete mode 100644 docs/docgen/middleware/PaymentManager.md delete mode 100644 docs/docgen/middleware/RegistryBase.md delete mode 100644 docs/docgen/middleware/VoteWeigherBase.md delete mode 100644 docs/docgen/middleware/VoteWeigherBaseStorage.md delete mode 100644 docs/docgen/middleware/example/ECDSARegistry.md delete mode 100644 docs/docgen/middleware/example/HashThreshold.md delete mode 100644 docs/docgen/operators/MerkleDelegationTerms.md delete mode 100644 docs/docgen/permissions/Pausable.md delete mode 100644 docs/docgen/permissions/PauserRegistry.md delete mode 100644 docs/docgen/pods/BeaconChainOracle.md delete mode 100644 docs/docgen/pods/DelayedWithdrawalRouter.md delete mode 100644 docs/docgen/pods/EigenPod.md delete mode 100644 docs/docgen/pods/EigenPodManager.md delete mode 100644 docs/docgen/pods/EigenPodPausingConstants.md delete mode 100644 docs/docgen/strategies/StrategyBase.md delete mode 100644 docs/docgen/strategies/StrategyWrapper.md rename docs/{ => experimental}/AVS-Guide.md (77%) create mode 100644 docs/images/Staker Flow Diagrams/Complete Withdrawal as Shares.png create mode 100644 docs/images/Staker Flow Diagrams/Complete Withdrawal as Tokens.png create mode 100644 docs/images/Staker Flow Diagrams/Delegating.png create mode 100644 docs/images/Staker Flow Diagrams/Depositing.png create mode 100644 docs/images/Staker Flow Diagrams/Partial Withdrawals.png create mode 100644 docs/images/Staker Flow Diagrams/Queue Withdrawal.png create mode 100644 docs/images/Staker Flow Diagrams/Validator Exits.png create mode 100644 docs/images/Withdrawal_Credential_Proof.png create mode 100644 docs/images/Withdrawal_Proof.png create mode 100644 docs/images/samplemerkle.png create mode 100644 docs/images/staterootproof.png delete mode 100644 script/Allocate.s.sol delete mode 100644 script/BecomeOperator.s.sol delete mode 100644 script/DepositAndDelegate.s.sol delete mode 100644 script/EigenLayerParser.sol delete mode 100644 script/M2_Deploy.s.sol delete mode 100644 script/M2_deploy.config.json delete mode 100644 script/configs/M1_deploy_goerli.config.json rename script/configs/{ => devnet}/M1_deploy_devnet.config.json (96%) create mode 100644 script/configs/devnet/M2_deploy_from_scratch.anvil.config.json create mode 100644 script/configs/goerli/M1_deploy_goerli.config.json create mode 100644 script/configs/holesky/Holesky_current_deployment.config.json create mode 100644 script/configs/holesky/M2_deploy_from_scratch.holesky.config.json create mode 100644 script/configs/holesky/M2_deploy_preprod.holesky.config.json rename script/configs/{ => mainnet}/M1_deploy_mainnet.config.json (88%) rename script/{M1_deploy.config.json => configs/mainnet/M2_deploy_from_scratch.mainnet.config.json} (84%) create mode 100644 script/configs/mainnet/M2_mainnet_upgrade.config.json create mode 100644 script/configs/mainnet/Mainnet_current_deployment.config.json create mode 100644 script/configs/mainnet/Mainnet_current_eigenPods.config.json create mode 100644 script/deploy/devnet/M2_Deploy_From_Scratch.s.sol rename script/{misc => deploy/goerli}/GoerliUpgrade1.s.sol (82%) create mode 100644 script/deploy/goerli/GoerliUpgrade2.s.sol create mode 100644 script/deploy/holesky/M2_Deploy_From_Scratch.s.sol create mode 100644 script/deploy/holesky/M2_Deploy_Preprod.s.sol rename script/{ => deploy/mainnet}/M1_Deploy.s.sol (66%) create mode 100644 script/deploy/mainnet/M2Deploy.s.sol create mode 100644 script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol delete mode 100644 script/misc/DeployGoerliStrategy.s.sol delete mode 100644 script/output/M2_deployment_data.json rename script/output/{ => devnet}/M1_MOCK_deployment_data.json (100%) create mode 100644 script/output/devnet/M2_from_scratch_deployment_data.json create mode 100644 script/output/goerli/GV2_deployment_2024_6_2.json create mode 100644 script/output/goerli/GV2_preprod_deployment_2024_30_1.json rename script/output/{ => goerli}/M1_deployment_goerli_2023_3_23.json (100%) create mode 100644 script/output/goerli/M2_deployment_data_goerli.json create mode 100644 script/output/goerli/M2_preprod_deployment_from_scratch.json create mode 100644 script/output/goerli/deployment_output.json create mode 100644 script/output/mainnet/M1_deployment_mainnet_2023_6_9.json create mode 100644 script/output/mainnet/M2_mainnet_upgrade.output.json delete mode 100644 script/utils/Allocator.sol create mode 100644 script/utils/Multisend.sol create mode 100644 script/utils/TimelockEncoding.sol create mode 100644 script/utils/TxEncodingInterfaces.sol create mode 100644 script/utils/validateStorage/README.md create mode 100644 script/utils/validateStorage/validateStorage.ts create mode 100644 script/utils/validateStorage/validateUpgrade.sh delete mode 100644 script/whitelist/Whitelister.sol create mode 100644 script/whitelist/delegationFaucet/DelegationFaucet.sol create mode 100644 script/whitelist/delegationFaucet/DelegationFaucetStaker.sol create mode 100644 script/whitelist/delegationFaucet/DeployDelegationFaucet.sol create mode 100644 src/contracts/core/AVSDirectory.sol create mode 100644 src/contracts/core/AVSDirectoryStorage.sol create mode 100644 src/contracts/interfaces/IAVSDirectory.sol delete mode 100644 src/contracts/interfaces/IBLSPublicKeyCompendium.sol delete mode 100644 src/contracts/interfaces/IBLSRegistry.sol delete mode 100644 src/contracts/interfaces/IDelayedService.sol create mode 100644 src/contracts/interfaces/IDelegationFaucet.sol delete mode 100644 src/contracts/interfaces/IDelegationTerms.sol delete mode 100644 src/contracts/interfaces/IPaymentManager.sol delete mode 100644 src/contracts/interfaces/IQuorumRegistry.sol delete mode 100644 src/contracts/interfaces/IRegistry.sol delete mode 100644 src/contracts/interfaces/IServiceManager.sol create mode 100644 src/contracts/interfaces/ISignatureUtils.sol create mode 100644 src/contracts/interfaces/ISocketUpdater.sol delete mode 100644 src/contracts/interfaces/IVoteWeigher.sol delete mode 100644 src/contracts/libraries/BN254.sol delete mode 100644 src/contracts/libraries/BytesArrayBitmaps.sol create mode 100644 src/contracts/libraries/EIP1271SignatureUtils.sol delete mode 100644 src/contracts/libraries/MiddlewareUtils.sol delete mode 100644 src/contracts/middleware/BLSPublicKeyCompendium.sol delete mode 100644 src/contracts/middleware/BLSRegistry.sol delete mode 100644 src/contracts/middleware/BLSSignatureChecker.sol delete mode 100644 src/contracts/middleware/PaymentManager.sol delete mode 100644 src/contracts/middleware/RegistryBase.sol delete mode 100644 src/contracts/middleware/VoteWeigherBase.sol delete mode 100644 src/contracts/middleware/VoteWeigherBaseStorage.sol delete mode 100644 src/contracts/middleware/example/ECDSARegistry.sol delete mode 100644 src/contracts/middleware/example/HashThreshold.sol delete mode 100644 src/contracts/operators/MerkleDelegationTerms.sol delete mode 100644 src/contracts/pods/BeaconChainOracle.sol create mode 100644 src/contracts/pods/EigenPodManagerStorage.sol create mode 100644 src/contracts/utils/UpgradeableSignatureCheckingUtils.sol create mode 100644 src/test/DelegationFaucet.t.sol delete mode 100644 src/test/Registration.t.sol delete mode 100644 src/test/SigP/BeaconProxy.sol delete mode 100644 src/test/SigP/DelegationTerms.sol delete mode 100644 src/test/SigP/EigenPodManagerNEW.sol delete mode 100644 src/test/Slasher.t.sol delete mode 100644 src/test/Whitelister.t.sol create mode 100644 src/test/WithdrawalMigration.t.sol create mode 100644 src/test/events/IAVSDirectoryEvents.sol create mode 100644 src/test/events/IDelegationManagerEvents.sol create mode 100644 src/test/events/IEigenPodEvents.sol create mode 100644 src/test/events/IEigenPodManagerEvents.sol create mode 100644 src/test/events/IStrategyManagerEvents.sol delete mode 100644 src/test/harnesses/BytesArrayBitmapsWrapper.sol create mode 100644 src/test/harnesses/EigenPodHarness.sol create mode 100644 src/test/harnesses/EigenPodManagerWrapper.sol create mode 100644 src/test/integration/IntegrationBase.t.sol create mode 100644 src/test/integration/IntegrationChecks.t.sol create mode 100644 src/test/integration/IntegrationDeployer.t.sol create mode 100644 src/test/integration/README.md create mode 100644 src/test/integration/TimeMachine.t.sol create mode 100644 src/test/integration/deprecatedInterfaces/mainnet/BeaconChainProofs.sol create mode 100644 src/test/integration/deprecatedInterfaces/mainnet/IBeaconChainOracle.sol create mode 100644 src/test/integration/deprecatedInterfaces/mainnet/IDelayedWithdrawalRouter.sol create mode 100644 src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol create mode 100644 src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol create mode 100644 src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol create mode 100644 src/test/integration/mocks/BeaconChainMock.t.sol create mode 100644 src/test/integration/mocks/BeaconChainOracleMock.t.sol create mode 100644 src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol create mode 100644 src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol create mode 100644 src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol create mode 100644 src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol create mode 100644 src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol create mode 100644 src/test/integration/tests/Deposit_Queue_Complete.t.sol create mode 100644 src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol create mode 100644 src/test/integration/tests/Upgrade_Setup.t.sol create mode 100644 src/test/integration/users/User.t.sol create mode 100644 src/test/integration/users/User_M1.t.sol create mode 100644 src/test/mocks/DelayedWithdrawalRouterMock.sol create mode 100644 src/test/mocks/DelegationManagerMock.sol delete mode 100644 src/test/mocks/DelegationMock.sol delete mode 100644 src/test/mocks/DelegationTermsMock.sol create mode 100644 src/test/mocks/EigenPodMock.sol delete mode 100644 src/test/mocks/MiddlewareRegistryMock.sol delete mode 100644 src/test/mocks/MiddlewareVoteWeigherMock.sol create mode 100644 src/test/mocks/OwnableMock.sol delete mode 100644 src/test/mocks/PublicKeyCompendiumMock.sol delete mode 100644 src/test/mocks/ServiceManagerMock.sol create mode 100644 src/test/test-data/balanceUpdateProof_balance28ETH_302913.json create mode 100644 src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json create mode 100644 src/test/test-data/balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json create mode 100644 src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json create mode 100644 src/test/test-data/balanceUpdateProof_updated_to_30ETH_302913.json create mode 100644 src/test/test-data/fullWithdrawalCapellaAgainstDenebRoot.json create mode 100644 src/test/test-data/fullWithdrawalDeneb.json delete mode 100644 src/test/test-data/fullWithdrawalProof.json create mode 100644 src/test/test-data/fullWithdrawalProof_Latest.json create mode 100644 src/test/test-data/fullWithdrawalProof_Latest_1SlotAdvanced.json create mode 100644 src/test/test-data/fullWithdrawalProof_Latest_28ETH.json delete mode 100644 src/test/test-data/partialWithdrawalProof.json create mode 100644 src/test/test-data/partialWithdrawalProof_Latest.json rename src/test/test-data/slashedProofs/{overcommittedBalanceProof_61511.json => balanceUpdateProof_Overcommitted_61511.json} (88%) rename src/test/test-data/slashedProofs/{notOvercommittedBalanceProof_61511.json => balanceUpdateProof_notOvercommitted_61511.json} (85%) create mode 100644 src/test/test-data/slashedProofs/balanceUpdateProof_notOvercommitted_61511_incrementedBlockBy100.json create mode 100644 src/test/test-data/withdrawal_credential_proof_302913.json create mode 100644 src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json create mode 100644 src/test/test-data/withdrawal_credential_proof_302913_exited.json create mode 100644 src/test/test-data/withdrawal_credential_proof_510257.json create mode 100644 src/test/tree/DelegationManagerUnit.tree create mode 100644 src/test/tree/EigenPodManagerUnit.tree create mode 100644 src/test/tree/EigenPodUnit.tree create mode 100644 src/test/tree/StrategyManagerUnit.tree create mode 100644 src/test/unit/AVSDirectoryUnit.t.sol delete mode 100644 src/test/unit/BeaconChainOracleUnit.t.sol delete mode 100644 src/test/unit/BytesArrayBitmapsUnit.t.sol create mode 100644 src/test/unit/EigenPod-PodManagerUnit.t.sol create mode 100644 src/test/unit/EigenPodManagerUnit.t.sol create mode 100644 src/test/unit/EigenPodUnit.t.sol delete mode 100644 src/test/unit/SlasherUnit.t.sol create mode 100644 src/test/utils/EigenLayerUnitTestBase.sol create mode 100644 src/test/utils/EigenLayerUnitTestSetup.sol rename src/test/{unit => utils}/Utils.sol (90%) create mode 100755 test.sh create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example index 086785858..948f166c8 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,5 @@ RPC_MAINNET="https://eth.llamarpc.com" -# RPC_MAINNET="https://mainnet.infura.io/v3/API-KEY" \ No newline at end of file +# RPC_MAINNET="https://mainnet.infura.io/v3/API-KEY" +RPC_GOERLI="https://ethereum-goerli.publicnode.com" +RPC_HOLESKY="" +ETHERSCAN_API_KEY="API-KEY" diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 8941d34b9..2d7342cf6 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -11,7 +11,7 @@ User stories are often expressed in a simple sentence, structured as follows: 'A **Actions** - [ ] An action item list describing the work to be done -- [ ] Link to all of the related tasks needed to complete the feature. See the [tasks](https://github.com/Layr-Labs/docs/blob/949bd6b4ddd0ef08880c6775c2d9a6222e2e7eb3/.github/ISSUE_TEMPLATE/task.md) template. +- [ ] Link to all of the related tasks needed to complete the feature. See the [tasks](https://github.com/Layr-Labs/eigenlayer-contracts/tree/master/.github/ISSUE_TEMPLATE/task.md) template. - [ ] Include everything in the definition of done e.g. unit tests and documentation **Acceptance criteria** diff --git a/.github/ISSUE_TEMPLATE/task.md b/.github/ISSUE_TEMPLATE/task.md index e72287318..9d367028c 100644 --- a/.github/ISSUE_TEMPLATE/task.md +++ b/.github/ISSUE_TEMPLATE/task.md @@ -7,7 +7,7 @@ labels: task --- ## Description -Add a summary and description. Link to any parent [feature requests](https://github.com/Layr-Labs/docs/blob/c78dbcd9a4b229e367f11725ee6758271a65bad3/.github/ISSUE_TEMPLATE/feature_request.md) or [bug reports](https://github.com/Layr-Labs/docs/blob/c78dbcd9a4b229e367f11725ee6758271a65bad3/.github/ISSUE_TEMPLATE/bug_report.md). +Add a summary and description. Link to any parent [feature requests](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/.github/ISSUE_TEMPLATE/feature_request.md) or [bug reports](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/.github/ISSUE_TEMPLATE/bug_report.md). ### Action Items - [ ] An action item list describing the work to be done diff --git a/.github/workflows/certora-prover.yml b/.github/workflows/certora-prover.yml index 154d00950..e255d8e29 100644 --- a/.github/workflows/certora-prover.yml +++ b/.github/workflows/certora-prover.yml @@ -6,7 +6,7 @@ on: - master - release-v* - formal-verification - - fix-ci-errors + - m2-mainnet pull_request: {} workflow_dispatch: {} @@ -38,21 +38,18 @@ jobs: python-version: '3.10' cache: 'pip' - name: Install java - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: - java-version: '11' - java-package: 'jre' + distribution: temurin + java-version: '17' - name: Install certora - run: pip install certora-cli==3.6.8.post3 + run: pip install certora-cli - name: Install solc run: | - wget https://github.com/ethereum/solidity/releases/download/v0.8.12/solc-static-linux - sudo mv solc-static-linux /usr/local/bin/solc - chmod +x /usr/local/bin/solc + pip install solc-select + solc-select use 0.8.12 --always-install - name: Verify rule ${{ matrix.params }} run: | - touch certora/applyHarness.patch - make -C certora munged bash ${{ matrix.params }} env: CERTORAKEY: ${{ secrets.CERTORAKEY }} diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml new file mode 100644 index 000000000..fffa80d70 --- /dev/null +++ b/.github/workflows/commitlint.yml @@ -0,0 +1,23 @@ +name: CI + +on: [push, pull_request] + +jobs: + commitlint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Install node dependencies + run: | + npm install conventional-changelog-conventionalcommits + npm install commitlint@18.2.0 + + - name: Validate current commit (last commit) with commitlint + if: github.event_name == 'push' + run: npx commitlint --from HEAD~1 --to HEAD --verbose + + - name: Validate PR commits with commitlint + if: github.event_name == 'pull_request' + run: npx commitlint --from ${{ github.event.pull_request.head.sha }}~${{ github.event.pull_request.commits }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/run-deploy-scripts.yml b/.github/workflows/run-deploy-scripts.yml new file mode 100644 index 000000000..c43dc1b73 --- /dev/null +++ b/.github/workflows/run-deploy-scripts.yml @@ -0,0 +1,38 @@ +name: Run Deploy Scripts +# We run the deploy scripts just to make sure they work + +on: + push: + pull_request: + types: [opened, reopened] + +jobs: + prepare: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + submodules: true + + # install foundry to run forge script. Should we run forge script in a container instead? + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Start Anvil chain + # need to start Anvil chain with -d to let the container run in the background + # if we start with 'anvil &' instead, the process stops when the step ends + run: docker run -d --rm -p 8545:8545 --entrypoint anvil ghcr.io/foundry-rs/foundry:nightly-5b7e4cb3c882b28f3c32ba580de27ce7381f415a --host 0.0.0.0 + + - name: Wait for Anvil chain to start + run: sleep 3 + + # Run Forge script against the Anvil chain + - name: Run M2_Deploy_From_Scratch + run: | + forge script script/deploy/devnet/M2_Deploy_From_Scratch.s.sol --rpc-url http://localhost:8545 \ + --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast \ + --sig "run(string memory configFileName)" -- M2_deploy_from_scratch.anvil.config.json diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml new file mode 100644 index 000000000..9275ed832 --- /dev/null +++ b/.github/workflows/slither.yml @@ -0,0 +1,24 @@ +name: Slither Analysis + +on: + push: + pull_request: + types: [opened, reopened] + +jobs: + analyze: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + + - name: Run Slither + uses: crytic/slither-action@v0.3.0 + id: slither + with: + sarif: results.sarif + fail-on: none + + - name: Upload SARIF file + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: ${{ steps.slither.outputs.sarif }} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index d0a7aef30..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Automatic Testing - -on: - push: - pull_request: - types: [opened, reopened] - -concurrency: - group: ${{github.workflow}}-${{github.ref}} - cancel-in-progress: true - -jobs: - check: - name: Foundry Project - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Install forge dependencies - run: forge install - - - name: Run tests - run: forge test -vvv - env: - RPC_MAINNET: ${{ secrets.RPC_MAINNET }} - CHAIN_ID: ${{ secrets.CHAIN_ID }} - - - name: Run snapshot - run: forge snapshot - env: - RPC_MAINNET: ${{ secrets.RPC_MAINNET }} - CHAIN_ID: ${{ secrets.CHAIN_ID }} diff --git a/.github/workflows/testinparallel.yml b/.github/workflows/testinparallel.yml new file mode 100644 index 000000000..8ae97b9a4 --- /dev/null +++ b/.github/workflows/testinparallel.yml @@ -0,0 +1,65 @@ +name: Run Parallel + +on: + push: + pull_request: + types: [opened, reopened] + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Get list of .t.sol files in src/test + run: | + FILES=$(find src/test -type f -name '*.t.sol' | sed 's#src/test/##' | jq -R -s -c 'split("\n")[:-1]') + echo "::set-output name=matrix::$FILES" + id: set-matrix + + run-tests: + needs: prepare + runs-on: ubuntu-latest + strategy: + fail-fast: false + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Run Forge build + run: | + forge --version + forge build --sizes + id: build + + - name: Run unit tests + run: forge test --no-match-contract Integration + env: + RPC_MAINNET: ${{ secrets.RPC_MAINNET }} + RPC_HOLESKY: ${{ secrets.RPC_HOLESKY }} + CHAIN_ID: ${{ secrets.CHAIN_ID }} + + - name: Run integration tests + run: forge test --match-contract Integration + env: + RPC_MAINNET: ${{ secrets.RPC_MAINNET }} + RPC_HOLESKY: ${{ secrets.RPC_HOLESKY }} + CHAIN_ID: ${{ secrets.CHAIN_ID }} + + - name: Run integration mainnet fork tests + run: forge test --match-contract Integration + env: + FOUNDRY_PROFILE: "forktest" + RPC_MAINNET: ${{ secrets.RPC_MAINNET }} + RPC_HOLESKY: ${{ secrets.RPC_HOLESKY }} + CHAIN_ID: ${{ secrets.CHAIN_ID }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index e1019104e..555235f94 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ broadcast # Deployment tools /data +.idea/ # Certora Outputs .certora_internal/ @@ -29,4 +30,16 @@ broadcast #script config file # script/M1_deploy.config.json -script/output/M1_deployment_data.json \ No newline at end of file +script/output/M1_deployment_data.json +/script/output/M2_deployment_data.json + +# autogenerated docs (you can generate these locally) +/docs/docgen/ + +script/misc + +test.sh + +# Surya outputs +InheritanceGraph.png +surya_report.md \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 000000000..c160a7712 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx --no -- commitlint --edit ${1} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..1fc21ba23 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,16 @@ +{ + "plugins": ["prettier-plugin-solidity"], + "overrides": [ + { + "files": "*.sol", + "options": { + "parser": "solidity-parse", + "printWidth": 120, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": false + } + } + ] +} \ No newline at end of file diff --git a/.solhint.json b/.solhint.json index 20216cba0..8c451d3fd 100644 --- a/.solhint.json +++ b/.solhint.json @@ -1,16 +1,21 @@ { "extends": "solhint:recommended", "rules": { - "max-line-length": ["warn",200], + "max-line-length": "off", "no-inline-assembly": "off", "reason-string": ["warn",{"maxLength":160}], "func-visibility": ["warn",{"ignoreConstructors":true}], + "explicit-types": ["warn","explicit"], + "quotes": ["warn","double"], "const-name-snakecase": "off", "not-rely-on-time": "off", "avoid-low-level-calls": "off", "contract-name-camelcase": "off", "func-name-mixedcase": "off", "var-name-mixedcase": "off", - "compiler-version": "off" + "compiler-version": "off", + "custom-errors": "off", + "no-global-import": "off", + "immutable-vars-naming": "off" } } diff --git a/.solhintignore b/.solhintignore new file mode 100644 index 000000000..497fd271c --- /dev/null +++ b/.solhintignore @@ -0,0 +1 @@ +Slasher.sol \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..8717c11ab --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,36 @@ + +## Requirements + +Foundry +Git +Node.js + +## Setup Repo + +```bash +git clone git@github.com:Layr-Labs/eigenlayer-contracts.git +``` + +### Install Dependencies + +```bash +npm install + +npx husky install + +forge install +``` + +### Pull Requests + +All tests must pass + +Commits must be linted + +A descriptive summary of the PR has been provided. + +### Environment Variables + +Some of the tests and features of this repository require environment variables to be set up. + +Copy the .env.example file to create a .env and populate it with the appropriate environment values that you have control over diff --git a/LICENSE b/LICENSE index 642db295a..8c7af6bab 100644 --- a/LICENSE +++ b/LICENSE @@ -9,12 +9,19 @@ Parameters Licensor: Layr Labs, Inc. -Licensed Work: EigenLayer Contracts +Licensed Work: EigenLayer Core Contracts The Licensed Work is (c) 2023 Layr Labs, Inc. Additional Use Grant: None. -Change Date: 2025-05-01 (May 1st, 2025) +Change Dates: + +- All commits at or prior to commit 6de01c6c16d6df44af15f0b06809dc160eac0ebf +(i.e. committed to this repository on or before February 6, 2024, the date of +the [v0.2.1-goerli-m2](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v0.2.1-goerli-m2) release) +have a change date of 2025-05-01 (May 1st, 2025) +- All commits after 6de01c6c16d6df44af15f0b06809dc160eac0ebf (i.e. committed to this +repository after February 6, 2024) have a change date of 2027-02-06 (February 6th, 2027) Change License: MIT diff --git a/README.md b/README.md index d9e2f458a..5c1b46a36 100644 --- a/README.md +++ b/README.md @@ -1,78 +1,148 @@ + # EigenLayer -EigenLayer (formerly 'EigenLayr') is a set of smart contracts deployed on Ethereum that enable restaking of assets to secure new services. -At present, this repository contains *both* the contracts for EigenLayer *and* a set of general "middleware" contracts, designed to be reuseable across different applications built on top of EigenLayer. -Note that the interactions between middleware and EigenLayer are not yet "set in stone", and may change somewhat prior to the platform being fully live on mainnet; in particular, payment architecture is likely to evolve. As such, the "middleware" contracts should not be treated as definitive, but merely as a helpful reference, at least until the architecture is more settled. +EigenLayer is a set of smart contracts deployed on Ethereum that enable restaking of assets to secure new services. This repo contains the EigenLayer core contracts, whose currently-supported assets include beacon chain ETH and several liquid staking tokens (LSTs). Users use these contracts to deposit and withdraw these assets, as well as delegate them to operators providing services to AVSs. + +## Getting Started -Click the links in the Table of Contents below to access more specific documentation. We recommend starting with the [EigenLayer Technical Specification](docs/EigenLayer-tech-spec.md) to get a better overview before diving into any of the other docs. For contracts addresses deployed on Goerli, click [here](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/script/output/M1_deployment_goerli_2023_3_23.json). -## Table of Contents -* [Introduction](#introduction) -* [Installation and Running Tests / Analyzers](#installation) -* [EigenLayer Technical Specification](docs/EigenLayer-tech-spec.md) +* [Branching](#branching) +* [Documentation](#documentation) +* [Building and Running Tests](#building-and-running-tests) +* [Deployments](#deployments) -Design Docs -* [Withdrawals Design Doc](docs/Guaranteed-stake-updates.md) -* [EigenPods Design Doc](docs/EigenPods.md) +## Branching -Flow Docs -* [EigenLayer Withdrawal Flow](docs/EigenLayer-withdrawal-flow.md) -* [EigenLayer Deposit Flow](docs/EigenLayer-deposit-flow.md) -* [EigenLayer Delegation Flow](docs/EigenLayer-delegation-flow.md) -* [Middleware Registration Flow for Operators](docs/Middleware-registration-operator-flow.md) +The main branches we use are: +* [`dev (default)`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/dev): The most up-to-date branch, containing the work-in-progress code for upcoming releases +* [`testnet-holesky`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/testnet-holesky): Our current testnet deployment +* [`mainnet`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/mainnet): Our current mainnet deloyment - -## Installation and Running Tests / Analyzers +## Documentation -### Installation +### Basics -`foundryup` +To get a basic understanding of EigenLayer, check out [You Could've Invented EigenLayer](https://www.blog.eigenlayer.xyz/ycie/). Note that some of the document's content describes features that do not exist yet (like the Slasher). To understand more about how restakers and operators interact with EigenLayer, check out these guides: +* [Restaking User Guide](https://docs.eigenlayer.xyz/restaking-guides/restaking-user-guide) +* [Operator Guide](https://docs.eigenlayer.xyz/operator-guides/operator-introduction) -This repository uses Foundry as a smart contract development toolchain. +### Deep Dive -See the [Foundry Docs](https://book.getfoundry.sh/) for more info on installation and usage. +The most up-to-date and technical documentation can be found in [/docs](/docs). If you're a shadowy super coder, this is a great place to get an overview of the contracts before diving into the code. -### Natspec Documentation +To get an idea of how users interact with these contracts, check out our integration tests: [/src/test/integration](./src/test/integration/). -You will notice that we also have hardhat installed in this repo. This is only used to generate natspec [docgen](https://github.com/OpenZeppelin/solidity-docgen). This is our workaround until foundry [finishes implementing](https://github.com/foundry-rs/foundry/issues/1675) the `forge doc` command. +## Building and Running Tests -To generate the docs, run `npx hardhat docgen` (you may need to run `npm install` first). The output is located in `docs/docgen` +This repository uses Foundry. See the [Foundry docs](https://book.getfoundry.sh/) for more info on installation and usage. If you already have foundry, you can build this project and run tests with these commands: -### Run Tests +``` +foundryup -Prior to running tests, you should set up your environment. At present this repository contains fork tests against ETH mainnet; your environment will need an `RPC_MAINNET` key to run these tests. See the `.env.example` file for an example -- two simple options are to copy the LlamaNodes RPC url to your `env` or use your own infura API key in the provided format. +forge build +forge test +``` -The main command to run tests is: +### Running Fork Tests -`forge test -vv` +We have a few fork tests against ETH mainnet. Passing these requires the environment variable `RPC_MAINNET` to be set. See `.env.example` for an example. Once you've set up your environment, `forge test` should show these fork tests passing. -### Run Tests on a Fork -Environment config is contained in config.yml. Before running the following commands, [install yq](https://mikefarah.gitbook.io/yq/v/v3.x/). Then set up the environment with this script: +Additionally, to run all tests in a forked environment, [install yq](https://mikefarah.gitbook.io/yq/v/v3.x/). Then, set up your environment using this script to read from `config.yml`: -`source source-env.sh [CHAIN]` +`source source-env.sh [goerli|local]` -for example, on goerli: `source source-env.sh goerli`. Currently options for `[CHAIN]` are `goerli`, `local`. Then to run the actual tests: +Then run the tests: `forge test --fork-url [RPC_URL]` -### Run Static Analysis +### Running Static Analysis + +1. Install [solhint](https://github.com/protofire/solhint), then run: `solhint 'src/contracts/**/*.sol'` +2. Install [slither](https://github.com/crytic/slither), then run: + `slither .` ### Generate Inheritance and Control-Flow Graphs -first [install surya](https://github.com/ConsenSys/surya/) - -then run - -`surya inheritance ./src/contracts/**/*.sol | dot -Tpng > InheritanceGraph.png` - -and/or - -`surya graph ./src/contracts/middleware/*.sol | dot -Tpng > MiddlewareControlFlowGraph.png` - -and/or +1. Install [surya](https://github.com/ConsenSys/surya/) and graphviz: + +``` +npm i -g surya + +apt install graphviz +``` + +2. Then, run: + +``` +surya inheritance ./src/contracts/**/*.sol | dot -Tpng > InheritanceGraph.png + +surya mdreport surya_report.md ./src/contracts/**/*.sol +``` + +## Deployments + +### Current Mainnet Deployment + +The current mainnet deployment is our M1 release, and is from a much older version of this repo. You can view the deployed contract addresses below, or check out the code itself on the [`mainnet`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/mainnet) branch. + +| Name | Solidity | Proxy | Implementation | Notes | +| -------- | -------- | -------- | -------- | -------- | +| StrategyManager | [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/core/StrategyManager.sol) | [`0x8586...075A`](https://etherscan.io/address/0x858646372CC42E1A627fcE94aa7A7033e7CF075A) | [`0x70f4...619b`](https://etherscan.io/address/0x70f44c13944d49a236e3cd7a94f48f5dab6c619b) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: cbETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/0139d6213927c0a7812578899ddd3dda58051928/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x5494...56bc`](https://etherscan.io/address/0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: stETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/0139d6213927c0a7812578899ddd3dda58051928/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x93c4...564D`](https://etherscan.io/address/0x93c4b944D05dfe6df7645A86cd2206016c51564D) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: rETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/0139d6213927c0a7812578899ddd3dda58051928/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x1BeE...dCD2`](https://etherscan.io/address/0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: ETHx | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x9d7e...011d`](https://etherscan.io/address/0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: ankrETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x1376...58ff`](https://etherscan.io/address/0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: OETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xa4C6...d059`](https://etherscan.io/address/0xa4C637e0F704745D182e4D38cAb7E7485321d059) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: osETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x57ba...4c02`](https://etherscan.io/address/0x57ba429517c3473B6d34CA9aCd56c0e735b94c02) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: swETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x0Fe4...96d6`](https://etherscan.io/address/0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: wBETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7CA9...2184`](https://etherscan.io/address/0x7CA911E83dabf90C90dD3De5411a10F1A6112184) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: sfrxETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x8CA7...28b6`](https://etherscan.io/address/0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: lsETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xAe60...4473`](https://etherscan.io/address/0xAe60d8180437b5C34bB956822ac2710972584473) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: mETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/mainnet/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x298a...6dd2`](https://etherscan.io/address/0x298aFB19A105D59E74658C4C334Ff360BadE6dd2) | [`0xdfdA...46d3`](https://etherscan.io/address/0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| EigenPodManager | [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/pods/EigenPodManager.sol) | [`0x91E6...A338`](https://etherscan.io/address/0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338) | [`0xe429...5762`](https://etherscan.io/address/0xe4297e3dadbc7d99e26a2954820f514cb50c5762) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| EigenLayerBeaconOracle | [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/eigenlayer-beacon-oracle/blob/main/contracts/src/EigenLayerBeaconOracle.sol) | - | [`0x3439...5442`](https://etherscan.io/address/0x343907185b71adf0eba9567538314396aa985442) | | +| EigenPod (beacon) | [`EigenPod`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/pods/EigenPod.sol) | [`0x5a2a...9073`](https://etherscan.io/address/0x5a2a4F2F3C18f09179B6703e63D9eDD165909073) | [`0x8ba4...a255`](https://etherscan.io/address/0x8ba40da60f0827d027f029acee62609f0527a255) | - Beacon: [OpenZeppelin BeaconProxy@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol)
- Deployed pods use [UpgradableBeacon@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol) | +| DelayedWithdrawalRouter | [`DelayedWithdrawalRouter`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/pods/DelayedWithdrawalRouter.sol) | [`0x7Fe7...23D8`](https://etherscan.io/address/0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8) | [`0x4bb6...4226`](https://etherscan.io/address/0x4bb6731b02314d40abbffbc4540f508874014226) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| DelegationManager | [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/core/DelegationManager.sol) | [`0x3905...f37A`](https://etherscan.io/address/0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A) | [`0x1784...9dda`](https://etherscan.io/address/0x1784be6401339fc0fedf7e9379409f5c1bfe9dda) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Slasher | [`Slasher`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/4b15d68b7e16b5965bad398496bfce57f5a47e1b/src/contracts/core/Slasher.sol) | [`0xD921...c3Cd`](https://etherscan.io/address/0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd) | [`0xf323...6614`](https://etherscan.io/address/0xf3234220163a757edf1e11a8a085638d9b236614) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| PauserRegistry | [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/0139d6213927c0a7812578899ddd3dda58051928/src/contracts/permissions/PauserRegistry.sol) | - | [`0x0c43...7060`](https://etherscan.io/address/0x0c431C66F4dE941d089625E5B423D00707977060) | | +| Pauser Multisig | [`GnosisSafe@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x5050...2390`](https://etherscan.io/address/0x5050389572f2d220ad927CcbeA0D406831012390) | [`0xd9db...9552`](https://etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`GnosisSafeProxy@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) | +| Community Multisig | [`GnosisSafe@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xFEA4...c598`](https://etherscan.io/address/0xFEA47018D632A77bA579846c840d5706705Dc598) | [`0xd9db...9552`](https://etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`GnosisSafeProxy@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) | +| Executor Multisig | [`GnosisSafe@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x369e...9111`](https://etherscan.io/address/0x369e6F597e22EaB55fFb173C6d9cD234BD699111) | [`0xd9db...9552`](https://etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`GnosisSafeProxy@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) | +| Operations Multisig | [`GnosisSafe@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xBE16...3e90`](https://etherscan.io/address/0xBE1685C81aA44FF9FB319dD389addd9374383e90) | [`0xd9db...9552`](https://etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`GnosisSafeProxy@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) | +| Timelock | [Compound: `Timelock.sol`](https://github.com/compound-finance/compound-protocol/blob/a3214f67b73310d547e00fc578e8355911c9d376/contracts/Timelock.sol) | - | [`0xA6Db...0EAF`](https://etherscan.io/address/0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF) | | +| Proxy Admin | [OpenZeppelin ProxyAdmin@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0x8b95...2444`](https://etherscan.io/address/0x8b9566AdA63B64d1E1dcF1418b43fd1433b72444) | | + +### Current Testnet Deployment + +The current testnet deployment is on holesky, and is from our M2 beta release. You can view the deployed contract addresses below, or check out the code itself on the [`testnet-holesky`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/testnet-holesky) branch. + +| Name | Solidity | Proxy | Implementation | Notes | +| -------- | -------- | -------- | -------- | -------- | +| StrategyManager | [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/StrategyManager.sol) | [`0xdfB5...D5b6`](https://holesky.etherscan.io/address/0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6) | [`0x59f7...3a18`](https://holesky.etherscan.io/address/0x59f766A603C53f3AC8Be43bBe158c1519b193a18) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: stETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7D70...63d3`](https://holesky.etherscan.io/address/0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: rETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x3A8f...c4E0`](https://holesky.etherscan.io/address/0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: WETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x8052...FaF9`](https://holesky.etherscan.io/address/0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: lsETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x5037...D943`](https://holesky.etherscan.io/address/0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: sfrxETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x9281...631c`](https://holesky.etherscan.io/address/0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: ETHx | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x31B6...6af7`](https://holesky.etherscan.io/address/0x31B6F59e1627cEfC9fA174aD03859fC337666af7) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: osETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x4628...C6Ef`](https://holesky.etherscan.io/address/0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: cbETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x70EB...bAB6`](https://holesky.etherscan.io/address/0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: mETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xaccc...F8e5`](https://holesky.etherscan.io/address/0xaccc5A86732BE85b5012e8614AF237801636F8e5) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Strategy: ankrETH | [`StrategyBaseTVLLimits`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7673...d0ac`](https://holesky.etherscan.io/address/0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac) | [`0xFb83...3305`](https://holesky.etherscan.io/address/0xFb83e1D133D0157775eC4F19Ff81478Df1103305) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| EigenPodManager | [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPodManager.sol) | [`0x3077...e315`](https://holesky.etherscan.io/address/0x30770d7E3e71112d7A6b7259542D1f680a70e315) | [`0x5265...4a7B`](https://holesky.etherscan.io/address/0x5265C162f7d5F3fE3175a78828ab16bf5E324a7B) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| EigenLayerBeaconOracle | [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/eigenlayer-beacon-oracle/blob/main/contracts/src/EigenLayerBeaconOracle.sol) | - | [`0x4C11...8f25`](https://holesky.etherscan.io/address/0x4C116BB629bff7A8373c2378bBd919f8349B8f25) | | +| EigenPod (beacon) | [`EigenPod`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPod.sol) | [`0x7261...832D`](https://holesky.etherscan.io/address/0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D) | [`0xe98f...641c`](https://holesky.etherscan.io/address/0xe98f9298344527608A1BCC23907B8145F9Cb641c) | - Beacon: [OpenZeppelin BeaconProxy@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol)
- Deployed pods use [UpgradableBeacon@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol) | +| DelayedWithdrawalRouter | [`DelayedWithdrawalRouter`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/DelayedWithdrawalRouter.sol) | [`0x642c...FA32`](https://holesky.etherscan.io/address/0x642c646053eaf2254f088e9019ACD73d9AE0FA32) | [`0xcE8b...3407`](https://holesky.etherscan.io/address/0xcE8b8D99773a718423F8040a6e52c06a4ce63407) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| DelegationManager | [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/DelegationManager.sol) | [`0xA441...48e7`](https://holesky.etherscan.io/address/0xA44151489861Fe9e3055d95adC98FbD462B948e7) | [`0x83f8...0D76`](https://holesky.etherscan.io/address/0x83f8F8f0BB125F7870F6bfCf76853f874C330D76) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| AVSDirectory | [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/AVSDirectory.sol) | [`0x0557...FeBf`](https://holesky.etherscan.io/address/0x055733000064333CaDDbC92763c58BF0192fFeBf) | [`0xEF5B...3e3a`](https://holesky.etherscan.io/address/0xEF5BA995Bc7722fd1e163edF8Dc09375de3d3e3a) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| Slasher | [`Slasher`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/Slasher.sol) | [`0xcAe7...6e7C`](https://holesky.etherscan.io/address/0xcAe751b75833ef09627549868A04E32679386e7C) | [`0x9971...345A`](https://holesky.etherscan.io/address/0x99715D255E34a39bE9943b82F281CA734bcF345A) | Proxy: [OpenZeppelin TUP@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| PauserRegistry | [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/permissions/PauserRegistry.sol) | - | [`0x85Ef...2F06`](https://holesky.etherscan.io/address/0x85Ef7299F8311B25642679edBF02B62FA2212F06) | | +| Timelock | [Compound: `Timelock.sol`](https://github.com/compound-finance/compound-protocol/blob/a3214f67b73310d547e00fc578e8355911c9d376/contracts/Timelock.sol) | - | [`0xcF19...0A7D`](https://holesky.etherscan.io/address/0xcF19CE0561052a7A7Ff21156730285997B350A7D) | | +| Proxy Admin | [OpenZeppelin ProxyAdmin@4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0xDB02...A6cf`](https://holesky.etherscan.io/address/0xDB023566064246399b4AE851197a97729C93A6cf) | | -`surya mdreport surya_report.md ./src/contracts/**/*.sol` diff --git a/audits/Sigma Prime - Core Audit - v2.0 FINAL - Feb'24.pdf b/audits/Sigma Prime - Core Audit - v2.0 FINAL - Feb'24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..adf03cc3d995d54325fff489280580bcdc76fffe GIT binary patch literal 371573 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

BSM3MD(md@fh??kJK-6ow3 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

;u0{h+;!k)s;J5RUS~65oLKQi3O{MUm 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 literal 0 HcmV?d00001 diff --git a/audits/Sigma_Prime_Layr_Labs_Eigen_Layer_2_Security_Assessment_v1.pdf b/audits/Sigma_Prime_Eigen_Layer_Phase_2_Security_Assessment_Report_v2_1.pdf similarity index 64% rename from audits/Sigma_Prime_Layr_Labs_Eigen_Layer_2_Security_Assessment_v1.pdf rename to audits/Sigma_Prime_Eigen_Layer_Phase_2_Security_Assessment_Report_v2_1.pdf index 61c72f8c9156ad576e169a63d475453ff14493f3..cbfd2f87f1e82b4f6f2c80b4e6c8cefbe6a311e6 100644 GIT binary patch delta 128175 zcmZs>Q*k_c{MQ7yG}dQKPP_=KDNz zR&E1&`80YwDHtnDnz1A#HBdicT49I@DdfgGDy4l5<=?t(9gqvG1Z)5l$5|M!5Tz1t zJxWQao8MzUDv0FY3eUsUrPcrr8Xe7(Ihv@Mz;!7zVD?!B>nQHSLcjXb{>_7nvw&Kfiq z1>TxyHomfYdYlU?UO6I)$1|-mq@dD?{vxuOSoY`_|2F=l7G*LRa~KiD@q6C`Asth* zQkM83D^|u(LcNK@+C!rhuAJ(G#C5ntvB6Jbf@g2lFOVtu-$hA*)Tl|NpyIGrj`rq^ zw$?7TO<$l^Shn)6SxiVhCz?*l03|=-0cPj(=A2T($TI$7ex!KRQ7j&#g^9i!xIlz< z_kD_Rxr;kc;$r>B=d0_X;ST2rR}ZoEi;2tAWi}W*8a@UxR}0s%v|RX(B8Uf(l5FjL zy#m-$G<0qat5C>=>7+Rv3Lp+Ic_|pWG=81Rt&#nDnrlcgK?Q){9*;uIP}jQij;-7u;e zNG-DfMMq!Y5_iRjU%f06Hg+xLd3avOz>hbkMS!RcaV=^mF}!zU`hm_v zEAd>{ocU}Gas{IITL!sdX3oq|Uxq`~7Z5_`UsV2v#}5)k?oW-{0E>#mjC87p{!^AN zYH>7?SO42F7l^rB8J@O1ITQBz4==zTOoP3$Y0QpRya>{QIHHJwYVIuRc?z-+23O)% zMPv{&(y<-7mr$-3BdkjU#{%5KUS=AXnX`Yi<7p}0$3Xu>3@@tR)^)6DQXbC7Fd{5yFd zb+xI;5KOEu=^j4|R3a&szz5iT+(X5e62dcKVkV$zTrA6|xX(oII;MF2s(gkn$eDPP z5#P3Iolev7MJy%!x&raRrTCdA3>s{2yJ`JHJ?_hTKLM)n-dZDl8q6;L@K?&+ldZTr z3b~Bv`L_Vi>X2zZOCO<*K$0efm+{XWbi=bCv@@M%i{MJQcl{!(={!)@JwN$pVx|8G zmGlY58%?Av6SFQO9%*z19u<{Hx|2VH1FR%~u$Y<_TutlsnCTC3erg2}vHVf2aT*XH z+`oB)_#h<$Vsx36=>~4g1pcKMJ1!%#mT{*yWEymFsB-`W>3AR2m_pyk&FZX~*oOKm zTKawOmzt6jO!hn2sU7HXesW+f3t2s!IfpBxz?!W0*5Vpa>v9w8Yu6ct*%~Zc9arEk z6+7;NpW)1z(P)?1aI%~M{%iVWLc<-skUb|A$W!XUz^PR^ZmQm>oF9dv`X(cXw9dNYgR@ z^f?P)%N2Hh9^kN335XtjCC~-r3-O%MY~Y7Zniz;Qg6Y34-Vd&e6SvQ${DNemh>m&J z7_Ef9oknx{TiVR zl0_q7r_#*qv=DW(8eZ*C7fQyLc(TC>0=;sfPDBu5is<}P^O(^B)iBr4_QMAk zbj$kOP0<;~KVnxL2Jq%o29ro$TlV-O7$ty|_mYp;HYaeXTC7(y;?u6_O!0(-fU5bC zrpwe_>3bmha|cT|D zCI)`RoH?YZiIB z1#<0Fg7(tsLVDMK2+fJXZ67HP`q9;z9W{?2rq0q}>wVB(mwr31X{?W3`{95!KTfXb z?JAcwpKgV_6P@jUvbOg@s4+ut@4p_{A1W^37Az6Sb3kOPvkx}dRrO$U|`1sMo z9%z8KgOsdFbHV_NBv&bTMb`iv)(LJBft}!0W-^4f=m2*DU5s7~NcrN$W(I^|PsnrW zs#??2{!E!sz<-=8vS}+TnwtY0jJY8l@9a`dshI4#f-`1(76|Me^MYaQ&h;a4sygSt zda6Js17w08na(}NN~fZgcPhfN)wnBi63bwG^d?7aaQj$w2TKJprjRq+K| z$G=Lr)gi6gr?|{d83rGGh{&4IYn1wWpivQbQZEc?x;-cdZ?G*7PSW!dsUsQ0liE}b z9@d7b6l=+}$q>~8bN42wDN6phahG-aA94$GB?3pIN7(Aki|h5=CR&6Y)RV>@!bIg&6*?LEB!#t+u zn$vgyz5w3ef&j8pFU&NZeC4RRe*^7K;z+i_CIcsAYAXR2bSq0tPo7(GFdMWu-$B}f zjL*9wYgJ@uZ{w1u&W)!TT7e?K<8r)o1z>1K`-zP`bHs0gf8bV2ByMKjG8wp>QsS!Y zTJzSTewANaY=c`Ud<2l^w%m&1Pz*9}u1q9Fv?J&fdXc=ze~6;kVymCnZP%PsvBPoo zCWRqFX6>PA_?r2Kpqi@OC;V`)5AyX0$8VrQ!5uk9m=2t99`;!k|3!r|C!)Z-5CKKo z%i^8OAHgkyJt6F|gxddvt!AqjFSzWLI@dJ7INOG~nm8(Cv1DSCE+N&<2^JvMX&oeZ zEup@Su3Vg>RoF9Ql2f7TuJ;FaUzfE)ezzZ5M#q!#fpnXtk|c}%qPAioMS;VG>yNhf zR50Ta#uynOKacmQgO9(Rpl{{x)1Wyj@y8qwv1hus}U1hRnkvq^~Wx8FqEsh7Jg zIygo#bwNPcuhvqlJ-wh)Ytr-*Vji_)3<@WGU~K~-a{ZCg4kBNO_tT(iVHZLBAo)Lyc?hl z1x**mkBs`&U8E^u;c4|h%ub;glKe{X3Y4LX`{E)9OUs%D(2Tg9pzAkzBeYc72;zmy z5B;5mc#mSZKynB;As1Sk3Ie|JHV?c|h#{&a^cBV27c%*aWHijWZ`t2Ga@j#y{P4N& z`dy4k1GQQvBf$x8e zD)GB8VO1B=LzsQ1G1dy`HBS5opBPm~3FyK(#AixZr(e|R~s zs_=D|$gO-dRY#}hu6pOAK(3Y5X)s%H>Tq3q(6LioYzHr2Gw0>&AC<5JdhipZgHl@Z2w=o|B7R74k9MB{}s&4%pCt6%%K{xaT^>+ zy&sylQlKp&Q7Gg`smGyEkn46a1|F{Y^flA91hG_gO+rB5a6A>;soLL6e7*>ly>Gq9 z*#A%@1Q`AG>9>7pu&EDJC=#m)q$y0b;Sw?V7$z!7ULH-!%C{vTYr4vd`>G-+AIbNr zYr;=I&VNa3W2Etc106oXfmCJg$qUM7rL~3TiPG=XGUeAaTlRnW8(-UXKDC^<24M0W z{zj)iB-^cze0fUHXnlxi(M<;7ZOx<>BdI9|{fl>uuKVSYDW;5+J4%ugIZblHj7mPS zNH#Oc2SGtxf5~32CS>%D<>P(PF|>PP?JJ`Cw6Z16EfW}hM|_cOewVVa2# zaOd3k20Yg9tO|AKIpz@2^=W4(7|RBEzjzB@r%7us^cBV|0%?(C-=|HSBP)w<>hhyr z^390iDykzv-b@^BcHI)^uIFm$*{k^rz*{S6?DZ?4#&T~ze1tS+UQBz9^b*f8yOh9K zvW|_8!arJRyoB|e*SU=LW}HMiczX<&(+TL+7T29gq>-F41D^?kRqE81nnZYZvfpvo zZS*-+p+y;Ff$#k&P&2=z5@gpA?IRS~>xW5a4&k-^iLt!ZnHCoH!m2lGBpkb_q3o3B z&J1+X!ml&#NZ1TnJG}s_o!TS^e2POeZI-?PH6z*wN#=hS;d$~RqV;wY!b6&xROuMR zDDX__oed>DS4b^C*_1F&SoFT3ivf>)5qor-U^*{oz-u!6r4m-p0xEsPPn>y!Rblsj zjl(Er(1EJ;Ez_UZu5B+&(()z^dtX#y-{RV;&w>R-n)oxY+B5NEUX~v{#C+f81Y?7;E_4F-fDFz@G!-fFjZM@s?wvv82hr&0I8}Se_>^ zgS<}9aB_RdFp7L$5Z_wEcm%*TB?Y-QG=;ZF&b}7dx4EIL+l%JrM}o9EhPrMKZJZ`P z*i|04pXNg~04Mx6;iv3L!OyQ#o;kb!U6GiX{zny(gi_(axw!wo4(L^?tm6h3Qozj{ zI$t8R^P9gOr}YBEdSMpMX~9~s%~T|kHVv6=^!G;&GWD3VJ!7jC9NJnm_kz+;#+yYL z#$hasiz~50bsr;xe-|K-YRK<4k#0o{Y9usf*w(9T!bDtP;e~F&xrzFtu3AZAF;-fB zRl3(AapkJg;Rfn?6}TVwYk(dnd?(9H7pL}*s#RA!j|(a(wcMe9>-RYvT|ouyu{As0 z$2%*`MyIVdaZd~AjArv7>yO34d}UqRZUj7Wp~Sp>SmuvH7M&d4+*X3!W zT@sV{5=+JD>f=5*YxDMYoezf91l!jFy!0LH&{UQ~M(%zJR$ajsI2orkl9(#sr3>?B zSKQFk&u5**j5QKCIAO}J0SOi4EHhEmGVyliY97}foWREYZ2E@E=VeOHS4oA&AR@_b z&r{nmt$v&C3Pcz=?xswI-b)l@WX|w>Ihm0sK|AiX@PVMeOQkiJ231)5i;`Ggkl9JG z{P(>2?nj9wv>{W{KHmkeO#@#emPdy>9xy)LjBZ=Fk?fv@)E(ZenO7wSGKnRF?_5}U z6>!ZlQ9+Sv-h`LctZ1r~5{jeK!lw%(PJ{74R2l`BXCrMZR{O4IpbJB`x40Tf)I&b8de&C!Bz%7dMr zVQ)eAzpe#9Er7;5QRKVekW%?hYB3r^|HT%r>QJ-b)x7;$yLo@d_tA(Qst#kWaF#1Y zR?Z;@0QG74`FxPU>E^NXa6ikB;T&gOG94GnqW)ZU9P~ z5MKM$Lb9A|QK_l)^5PFF>UV?lMDcW-bNhA_fxa&edH3dv2(zQlS^lj*E3=Nyw&4Zx znr_Q{p$)dfy50Z6!i^ndkIH^!Uh}y2z9{>HR|9@jBYwJ`!jas|y4-&Vx9W#iDl$v$ zs$iGW=eI!OD&<$*ns&^ywt*|@GvJ-)1id$jaE!ReM( z==%RJZd0?1!8iz4F^bp1lc9OT%uSk4xJz)GmylWHRdZ*_{g#X1d|nmSF6n)MV}AeDwlsV8m0qD|ZT7jXF{@)+AyWXP%a zBaJpm<91SMNnX8n#yqvmu+B`U&3wz?<#qC(X5GwoF05BDC5eI+9V*kLkL&ZhXKwP` zqu*eL3rEKjK4)YYyEb&2yo>YmeoQ!hjHX2>6O=*Y`Ym2v2b*_emjZ!}&)f8uyVO|o zlr#P-SK43fG$}}3IiQES3wy@e)XchAKsk#SdZ^`|dD4I8DSU)Sl#P#Bd57GX{ttw$ zGa2I$5qi9y-C8vWNg3X=HkO$f^-c&yxaL|8tU6b5`MsTVSvDypZB=~q9<wWe_Pd7&pq$L;7ahs@b z3*TE-zP078Sbqd26UjD4qhr68y3yPhi&1e-;ROW?9HgOa7L<`QHwvk_X!clp073maRlg|CdmQC%s=)FE_(>yOW+4)1~Q2#N@p_V5QdcY_(b zra+`U7oh~{kf4wgwSajha!ttyZ$-WruW|0xcw@6cvXgq@jBvSNl<3haZJR)=Almct z>oW&X(_V11B>b&Zbg};c*1G+9Yhm~ky1wI08Km(pa>Tdfq8rl~{k`Hu`~;d8s8J)6 zoNyZKzEjJx$#A8xz{!)3?7*iN-UBhxQ`wu4t3;Pvy)qX^W zd3wh8oETyeq^xq#JzamEG6Xh9j)8llCsL0^`M>O^7Fu^-O3V2t2FbgZTc-89e}OYN z<3`6E7AfArLYn7;g7%{#;fdOynVQ37z+(+qE5|9bY?>1#ZJJLRtcd={IfC|EtrVag zH(e|wyf_!Lk@he}*{!qV{_KvHYJPa&J3+^B>TCaurqp^UR;i}oMm5JJ(*RjhD^M@g zuoVWL)hevW1l@;LyRHS*qiHrDSF7vR8`pEBGV0aIN7ogKG3Jz|kHpZ2i1v%%F=)|m zkq;f2&F>o$T85o4^w6BMNC*3&4q1ViLv-ymxa_}$Qb4D>2e)(OUd8*HPDsI z44#0+g~#i7!Q@9@I>G~!0idK&fFR)IalRYF$UulKK8x3{pUexy$sa}rkfu8FfMlPq zJI!S_5Av&Shc-^asbZ)Xh!38#qlmoV3L6=d{+l;%n4119U&tDr4^}`VEmBeDM&&ap zU)NXW%Us8KQ2aV-f(*Zu2RruQD+W)SY z!a>QVL=+p)!`@F#oSRoEmYlCR)8zqeMsO9~pL#G)>wb12sKhi7oafA2VCTIx{pV#j z31)3ORlJ0xf?Z0?4}4D+p>Yrn%P`AmD*6Ul=jJR!tY~jwYBNSz^H2u<=xFRx2h+k% zm|Khnt;x6e2cy%b3HF$(s5J5=!H$BE5H6E@&9IHDQ4td6(dYzmkwdRCt!j>c1Z)&K zC|K#@{ig~w*KB0@_=#o~3?E(fQb4oJr}Y&KN>jl=F38QG1LMqroy^3FpZ(&n^@Eep|~)OE#oME zEc1DkcCM_(kQOh)7&9Hd!W0UB6w-Pa@tB+no zHV9~+jA4#nk<(PVm%?2}15&=$r z;ZIid0j3`SzMl=?vgUA-p1i#w6LqRF=j`m;HeNvpFl7KXJv$&#R2Thl1(WLU^ttk{ z;9x%`TgCaJmIe#&dKP+1A}B20Rs6}&X*Qu#+G%z0qn|X1%5)SQPo3A#{D*#%rNr}* z?o(i%jkU6w7$`|y)HG=`;t>_+TOm~vUUS@gz%9zm`#DcWI1%K8$iCM5SVBezBP){kh+bU=seJ3}SW792Z6qqAX>)K(e=z5|iX@iiLcST;Ad!P4tZ|x8V1<$Yh=106!nFF z&&`Kc^$?`W5Yi3}rHEDMmBk@0u2s?69HJ53K=2diQeRoB6P7XMB_BO_rm4NCo zv&p9N-xv$7eTzHvsNO4Y!LSx8j08;*OM_le+_Z&&_Gh_4k214B?EkTS7Ep~@Ulny zyB@pqwLG}n4s8NvOdJu1EM?>sc-&d<`*m61+D(lr4>%w9vybjYBqZiqSn-;XXr6uH@}7i`-J~c8dclHd{blK z#lqno@#%tV&yv^BqbBqB@SBR5b65F39IkMVqzwko_HK+HP63u~P3(BeKxYw28T`h6 zRe3VZoVVSw=GtN=iC+FJkP8~T{(yK;_GSHFOoNr_f13si2P@P6YZ^MbjvEsHWg5Ez z^ss7|o6;C-(2hwI3@%mnm$Eu&$x^anWDDpe?NILrFTAXxQEG=2Qg#(k@Uh2(8QeP^ zzLsHh>Ckju&d)m+O*g6l%{20HgjL-H+ESzB`j14 zjd5761Q~_aY;brcgQ0IHAYp`twHZ*!K{As_hlHXFzhVw_VohJ0WRM33C|kpm@0DO> zLqxJQF!y}60}Q*7Q7JBu`y6se6PzRT%>R9xq{x^QB=u=u!C1$J(suJFNZX0E2G?mH zsb9r+fh8W%$14o+vFt$!X0_N>;+7AMrZAFH54xl>T5g!fa@v7-LHoZ{5dg&J2=vC~%M1b6YfOBt zdc%>=3p|dxRTuwp34)b7mOc=Tm;nte!T}z=(ujP}5Z%)<=`hXo+o@$QQ=IxOg_2u-VfpI=JO@XN|u z8%h~~ZY9QYeTMbbyTcVOFY})jArlrB2H6+$K2+&_@J4i=i6N2#z7{1|44og4_r(ai zIb`>%pMrTL)rhd?C*kkJDVajdH;3DwK{ad26td;?axY zy;30bvPrjaZDTrU#2ui|A`%nDDs-B#-II(dIE zt04azVn0!CSmwT=oq;HB*!ru>$vOsclq1dr&JC>+Qur*ewczl##WhHG@sPV37ggZt{H_MfA&h3MO> zi-%~=K0|(>r@y!V*Ymxum@8Le@nNAmrgY_d^WX^%ttdRvoowpUz2vPt*@PhSC$Qph zmRhI82Qk1e^$`N5->sjH56oLX8v`t%-;lWnQ8-9_ACo9v(E_v|%U?PcdF`Muju9xs z%4}^3YR{HH^J`!q{fI@4q1CpKkgBXc-bVFks~S?Ke1oGjnxf~+ME z8x4ONT;Ce_uNYgoWk8vYRcf62yl1D6!o~L;e#8Z|!^r69y-k%j|EBuIB5*7ttMjQZ z`dpKuBqdO{eFwIM|7XWmvmRxXguZmKWL73nN4?FNv*XYBru=uJ!Ksx7i-}3X{+_46 zbPH^a2W$-hGuTXnSB)y8r4L7^-|nJh9}1y4kfxeLCIkX=g!bLR(qs<(tBUCioGvB@R1i4AhC;QZv~?!|kBH zN#kAHjMTpRHRFdExBM>9)ekb37&?<6&n40k5Hk-65|hD6lH_!aO-@kDgQ>Wj_0&`K zG*!S;H92FSQais=y@fH(uDr#z&+-_I==J+!#^K(=+vYn7jI9!eLL$Z3FC+s;ncXzb~fo9MI|FHLdN|!Qdo$u4U_x zfve^RAGVN}QiG+Cm_&&hKk`wAqLHhF6kwr9mM1sCmg7rh#>=7%==LYhU=$ zR{OYjX#|xz0!X9!Cr*e;UKW$2bC0%8ziN_(>`zCP)UPY1;bF4Rhg7h*F8jiDi>;Qz zdjPzkCvUu8+#tnUm#+g;xjR``SAXV?C#i*c^vqSk@NiuQ$t?}zBy>;{`Uw|)L*m8Y z@0}hUPdVcRM#pgrfCbqq%yMB7?3G8$1pShm}XzGfPMqVi0*9A|G_jgfl3OY5p7oz&N&X;Z6>SUl z!CM$fCSR#?{+ch!^rSATGEwG%N9TmO1`BJD88qBf{0BO@7fWMzZHz5gwWY9tf_4p-CpW_ zhQmtXhV#A?InQDNftvPRPvU981x)lcwm=bBWQi~7&+SS+_ZNg*1kJ2jyO?OEy~=b2 zgdaCk)P(ap6DTCHF6k{Ay9UY^zwd)py{+uEH5K%SyFC_)@pg&-y9HGziCWm zlhP?4{lbD`vqVQN`U*Z)ftwFkMHb>(Q2Rj?t(U$vwwdB?SV<2ta%b z=GWKmzx?nTz$wxkwynL$eHj8etDTJpvb0rtEY_|#?$8XX5BVtVlIDny2}C- zW)S^(jkJVOSMaS^2J5HXJZ_IPGtsc#sSCu`=sF%yEh8c1GsK$|1PDKUg$~f)DJQU4 zp`ux=%RLmQ|0rOrPMC^X-ViPf&?ji{^60f4594Gx1=3PPvvlC#U3vr4%wfT+&{BDh z&9&@MNZIB)PY6}dKH@&(;ec-^^V}xb;8P_nS;I2cFq+4(Hj;@JM0zHkr10|@I1zOO zFx*kMgVqE0rCLJBF3mR-Jku8(@Cpy!R(h#>Zy2l?s51*JW8LK2oqn+m{w)C%A*+h0 zVSXC_8MJy2a;rg$(G>t$&CSw}WJGR<;fC-vtJUakZ7;?tx(dw(*i!tu%*Hg3A*Z;Q zY2cpA?RyIQ00}*EV`l!rat%~9XwO{FA2wiB-QI_s{folgJ&o^E+~`=shWV3d8}Uiy1GB2zj3w> z>`3xIcOP#Q7N_iN#S@3J% znRR;PI(7ETs}G{2d+hL$_*Q+hJ$L^WloU9jV$Chw)>~YR7s)X95+tQ6MHu_`oglq( zJ<>p5`TR{*6*>Uo{b(wvW{%J?m1mqhT@b+^3-uhf>Ayh2vCR?C7}*1_`zf<+=ft53 zteI~$uH2NjBn-F}>~AwE!ok9@GkjyQj!R!?!GIIHXO3tLZSLc?Tdo>^APNG7+cQ~G zVQhZ4I%)NRcnZ-HmT$RQ`7Q|x?XZEtrv$!eo9#ExRQ&^j6V88&ppOXthOKKI%I>0W zsUGU6TJ}9Rd!Yyc@#I{7q+qMUGORuT$CP1XK6Nq+w`ia@>DWN2?e-=!=)eyls%ni> zNc~tz&cB!Wl?b~+4Hy1prgN>On$1|Kq>{6T9Xw=Vuw%HH{17*NpLCMGn4l>6^XcpI z`Sf}?G~Wlj?dIbDxqH1l-9H^#Z6l0T___1uMs z$*H9hrs70a$1v}uBkZ57RStD5gu9bICqBT=R&W81Cu9(#X?=iET7WL!rW0YwU$8KW zXhPtw{vFcd9Z7V_WvpB?91$mI&Q}SVYVL&d`>hGXz-0{6gXRe+8$*Obv_bY|5{9?z zT7YFhGrqlt!^4!}&xpJf!cM19+fcyHUc+&0+9sAu6Bfz21pn;&*Yrk$P*y*WVBKL9 zd8Gr?Qc)2>!2NYm+{ti~ms#lNcekrj-L|xSzizI+I*-Fy2|W-|;un< zhXUD7k*1Y^HzHu}xK2!+>dg2Kr>oL_d)EQ(Cl(9HxCw0CV)aQjP^ZymP}QQ`PSLp! zkOT!ZBQ!ot9~j)%MPl|bBlH&9 zn|NgIdnFfktIPD5K}reRVIaX}#FgduoxO+`b2fACn4XUe<`^%4-U)V2sTaRne{mr0 zidvJlwptH)Xitu$Xz7`v{^RfP1bU;h7we&0o9zMea!-wB6nY$q04c4rT6Q-5jS= zmLp#{Vx|L=l*1Ls)${f9^l-VqS&X|eBoubyFKq&d_*k#nqw3gmgO*AnbEBITqIOPU zXR7OmMEaowJe#Wpw9af~eKy9jmz1#$4!Q4~hPIuK@R;Zi()kIMtk;St8m z=6=U!5bKO+p<_aDY9m%%eiM~jqgsTq&abvZz`({j`QJPFBz>%*vu;uw1aHxS02J%0 ztg&cB0&#H}Etb3U&{W-4F9$EBG#xn|E*tScg8+2aRsSjtjvpGeTb{m{ekcljSZm*n z*imqWy$uyp=B2?`kHs~~Y=3}`M<-Vh#84C(p`0!+TLlrRQ%m3Yyxkbj8?EA4lCcWA(o}2UtGi0sh7(@rK?)B0#9n}VctqoGh$f3d zW@?w@T%a)%B6vcVsoph*mTBA0Oc%w@Cft`pepO4RQ{SoBx|40>&!N6-z`zFq698c=0_+C?|zZN=UFW;$4O z;i711#_aPZjirtBvr+HKetu#9d{pI2{~*NKCEfmjHZbST z{SPK3iH1yNWi26dSuQV3jp zKMW+HmaHL#P4-3l`S2H&X`tU|G?A8o8#gcr8*;Qb>69&tftyS$EFW(utX^aKz8ylx z^VVa_2Z5!&sF9hpsIybqUJQ^PIYn!lq@ZricUNuzcZT!QN*ECY7+ntlap?S@^anra z(k&rbx_5R*xB&sduwpLJ{03$NEav7pyC87JN1))k^Cl37yXNqd!J+a76II=MV_yNN^^NoKE?jY51cK2o2-)KZ^`J^9>B3@` zP5=ZhsMAwnICgP8L=bFXkqhiDNwT?~1~cs}NKVXs>=%eq5A^tOfJwFth7t&eFxf$j zj5H*N5e^g2ZWI>l^>3k26(&TbaLs=rZkW*6FQf!e)>3n(P!(?e< z*wWdNUUwou^s-7X-Y+)w5nFeRT}eXqJB#kuYX2|vHt3PED(#{u#3OH3Dg$}S zXp6@5Dmu5|eN)yvgI0Cca87qjf7^5CHh&+`7HjqP#VXRi)~EYDeukGz*9BD!|Ws^M>@V7OGBQ)rmd#2TSd-&wB2Uvm4p$ zd%W-1uHz1dqax-}p|Xocrh}Jzp;dt89bxm=jZQmYObG3+f}ZjrBfq*9YJ|7Nic#Ed z(|hZayEZe<(Xf`FXJzH)=biJ?5IWuQZ#>#HZ%23g>nDi$DRs{>py7<7Bq)fn^y;j- z8pr%YQXm-^ExxFL_ENUGpzLX^)IE?*l`+PtAZN@S$fS$q38cf=?K15yef=UF`e9T5 z8Skod%DVB)e?M>5E@$n2dcvhDdTUk6gU-6_-)4ru%`<_eOqxKuoI&E`<=Tv%>fzdy z9qd8cq)qz0oBdt@PJ-Ny>%-7`V)Fa{EWkzzgK+RvCvH8rlbf-mA3#*vVynZt0@6dr z>+ic-FL#NpNGX7RuKOY(a(>f{^rpahL;y0kEg_Z}rOouRf5ySUom=6VRL#bLsQeU57ZpSJP9Po#97&nPt+0>Vx@pX)?Zv4xRX30-KqwK>4!DFp zfvixTz(yEu@&avcO+gHT@;9AX`7&XXy}QLQ08Q2e?RML! zI@b56`P19GVHKn?C_Y93d4#kS9Oxc08$`wz6Yvs8M3$pes=a1~0>gYE_Q(_h{x>-M zH<7aLNlReXE0X&?Zu9Ol;sCdqEZZ+;As;Kyu*_*F`qwYfdIe}RHV+NT*O0OFEhzes zo-T3|l)s4VEvr;_^WOEX&)-JcGZxdu1VGUxfq%S!G?oSGP63RKVLL4F8({ueKzBE& z*%%n2csJ`*Az(VHNMEL{|Dr^fNs)0s*pT+n*D&|Zt?RFkjW?lxaeJTg0U*lp6n(mK zs6TEF`vbHSa=it7ZMxDK(ag9U0n3DxLLjmJ;FwO{8cG z3?BTL=Xdy~91i|^FJ)m(Ca@4%O4Nz!zzbIeHY>Gl-v;~)&pJ>4UrSLfcfBO!vydhQ zwAYBki*UBh*f2eaT{Ro&DKqsfr@*f58oUl#9++Efa1`Wa4OtxQ#IL8k z#u-BQK(tJQT(TS@h|SG)6i>$WCNwWP)I}!d{>LV@wGffq0UYi8jq1Q|z~&<$kcU58 zhI!!A-M&u#Q@2OFz_HUGED|z^;dSmJ@Ed9LKvgEhAFlQ=n-11|gbKBhOsd$#!=a2? zoFtnwX|c-t?#bq^1m6(v3S`k5jBkt}H_m_#+#{YpB_Kb?BM9~vuA!Xd5c6L<|G*3R zu3t*SdX@>$pg^`Mij>vHf4eY3O!R2 zOI%8^-~V<}$ZsvRm-PN0w%#!~ceroct!-PYwr$&XyK1ds)wpWgw!LcGwr$(oy`N|H zyZ6j{&t#H(&15DybNq82KVm~oTAcN3C>v2AK(^W>IvCm;`I~vjut3Ob)GnK9gl(NWueWg`3ktWSM>@t#xGs}E(MS6|t?18w)S?U&U ztxxeIKM8;WkpHkgs3U=P6ooC`m48Aa*#n&8_18 zw?3+(t{Kg?Loa65Y9CNw{ov_+WtPwcAaH&?JdxbM;D{*Y|dNjRU9auFE|%#}Ei$2*LMCOK7kr*lb$nl39*opECK| zp0_+b@BR8)CEvB(L#^rYV`=oZ!a0N;y{&%Dlr{D-6c=aKe!(qcG>N_7)VUy&njp&M z1Z0;V@DgA=$N}P?JPZ8=bac1a--{_dLT8$V8K=vK2LZE{Vrp03#>`sz(^MTi9C6PX z+i@JVp0$1@n`WOq$2dJYaZX_s6p3!i0~0x6wG|ngL(GHz2E?#@;{F*-TP)G{3}^Xt zHQvOG5Rma2zNKNZ<>Ntr`7+}K!oCmhu+Is8BI^8d6}nAn*AZwklE z&cXEmLO7@OA@rZH*>fvG2n2-*7&x7%%B@(SYkRdG z2sr$yrO9*=2RouOn=j>Bmk4=Nl;rL9q9(;$fOlFfk)l()Hvnv?cxy^ISK2H3ngr-{$xo(R|107lq+5C zufx-M8k7cBjud&3lV&0|1ub8dBm3HxC?Sr=d+jX7lSb$^oiPuBmCd^#qKZHSE8nJ~|V z+!DGE-i5-7r7Ugj81{0{Tjzznd>e`=WmYLHMf09r#salI`nx zZRWb^oeUoF&HkTaArXL9Rb2bvJsUt<7}}0;@2Yd5Z3yf{qfzF!kf6&WMms7;ou)-0 z5$%pX025ubS`y)Ghayz2Ohyl{?7i`Z@LV+U!^1>09{+tO`CmPg|WlYQ`xrWoMkK5x-CTUtSD3JiN}Q;9ILa zBQB(MAB}$g;&%Yqer=gdrd+pd^wLggWX%%{%7Zf49-zq&>4iqh@C2*_2%^#E zHTUIsIe}aO%*Mv2dz$#BA25=R;<(PGq7SsF{h`lL7}b86j=j(*cJIsx=H!ciG++Jx z!{cTN@{BaT*Zl}@vnnG{gzG&}WFE$CJE1#Btjf=2NQcmX)3M<+546gMX+U>C3swhh@&q<5r3GJn0Tobf0f;MTA5!1 znqkVs!8&T=0$xY^dvc9ILfm%?nN6H`lwYe0wu4p6m5?ZcEb#rih?}LXW38xbAix$Z zee<|m(asI-0s_%$SWy7Q@CITQ)Z1=M7?+M!Ria=Nz=TAi@*{<+=AO?}Zc2=wyYbL9p3@kcG zkpm3_U6RP3s&tXjP|daXr!Ei#i^Gwp9^#n4diPWP!4UH3ym32q&=E&1sL9*a)I*_+ z=IA(HfGoUacTsm~!l_PND@HE4`TN#g6vPN{sMG@0qpekVhc0$qNf+t0k$$C;YC=_r-fGFUcNNI$0@IaMlD&^>#K~gnrMB?F- zAFYI71A^|u{)jA@u+L+!D9N3aN~2A{)rLjWgFQvl9!zRe;8Z)*qP1NDG17X>ra>w? zQi>MX9Dc9?(MGwfVMHKIifR(imRfG4U1d;W^c@8W*a^lk8``3IQ{&l?fI2S3i()_+ zKtAn#>x~1e2g1(v{BNuTakGo+HL7Uo8dtiaiWG4Ej!inNsf;%`Ngo-M3SBkNlpx0H z5*otKX4dDD*azA^I#m_SfXJF3VICL5MXifK=Uy^=#1#Dr%^B-V-xhzdOEjfqdlPln4rH;O=0C+{nc^V=w7D`?~l zw4B;#hO8q;E(?RZ+mH=;JC880@j8;B99rc!!rr+wKr5fZQ_$KLoD)F*gyC&6v=zYa zL`*qoWe(o?43`TFlwOOdUA6!Z7+={b%^{8t+*B1C9V>8ZK`Qey%)iLxC8l=;423MZ zMecHSLnz2Hcu3}#0rV2l7-)uDxm}x#XmT<_HnNxCw_O+y&Vdu^aN0DFXIl^mqfZL^ zegSc}d#8$58jNI~v&$1EXO%DIy^p1!digUA*)LpI&27USoymZy9_}c_ANIgt8oVd1 ztFVPKrDy2iJumLgFJB91V0c{sD(0+FK<7Hl!n~2~Eb>Cyn%VtU9&vye6W!hsm+AEQ zUvU`eW=y&`^TFqeCWn66X#i<>Ug27cJ

uMcd~YidD5;KNIkf2jQG`mk)VocxdUe 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

Dbsj$ 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 delta 124443 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 z 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 diff --git a/certora/.gitignore b/certora/.gitignore deleted file mode 100644 index 284379223..000000000 --- a/certora/.gitignore +++ /dev/null @@ -1 +0,0 @@ -munged \ No newline at end of file diff --git a/certora/Makefile b/certora/Makefile deleted file mode 100644 index 2e1af83cb..000000000 --- a/certora/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -default: help - -PATCH = applyHarness.patch -CONTRACTS_DIR = ../src/contracts -MUNGED_DIR = munged - -help: - @echo "usage:" - @echo " make clean: remove all generated files (those ignored by git)" - @echo " make $(MUNGED_DIR): create $(MUNGED_DIR) directory by applying the patch file to $(CONTRACTS_DIR)" - @echo " make record: record a new patch file capturing the differences between $(CONTRACTS_DIR) and $(MUNGED_DIR)" - -munged: $(wildcard $(CONTRACTS_DIR)/*.sol) $(PATCH) - rm -rf $@ - cp -r $(CONTRACTS_DIR) $@ - patch -p0 -d $@ < $(PATCH) - -record: - diff -druN $(CONTRACTS_DIR) $(MUNGED_DIR) | sed 's+../contracts/++g' | sed 's+munged/++g' > $(PATCH) - -refresh: munged record - -clean: - git clean -fdX - touch $(PATCH) diff --git a/certora/applyHarness.patch b/certora/applyHarness.patch deleted file mode 100644 index e215a8f11..000000000 --- a/certora/applyHarness.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff -druN ../score/DelegationManager.sol core/DelegationManager.sol ---- ../score/DelegationManager.sol 2023-01-13 14:12:34 -+++ core/DelegationManager.sol 2023-01-13 14:24:43 -@@ -160,10 +160,10 @@ - */ - function decreaseDelegatedShares( - address staker, -- IStrategy[] calldata strategies, -- uint256[] calldata shares -+ IStrategy[] memory strategies, // MUNGED calldata => memory -+ uint256[] memory shares // MUNGED calldata => memory - ) -- external -+ public // MUNGED external => public - onlyStrategyManager - { - if (isDelegated(staker)) { \ No newline at end of file diff --git a/certora/harnesses/DelegationManagerHarness.sol b/certora/harnesses/DelegationManagerHarness.sol index 988ca4404..9f2366ee6 100644 --- a/certora/harnesses/DelegationManagerHarness.sol +++ b/certora/harnesses/DelegationManagerHarness.sol @@ -1,31 +1,28 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.12; +pragma solidity ^0.8.12; -import "../munged/core/DelegationManager.sol"; +import "../../src/contracts/core/DelegationManager.sol"; contract DelegationManagerHarness is DelegationManager { - constructor(IStrategyManager _strategyManager, ISlasher _slasher) DelegationManager(_strategyManager, _slasher) {} + constructor(IStrategyManager _strategyManager, ISlasher _slasher, IEigenPodManager _eigenPodManager) + DelegationManager(_strategyManager, _slasher, _eigenPodManager) {} - - /// Harnessed functions - function decreaseDelegatedShares( - address staker, - IStrategy strategy1, - IStrategy strategy2, - uint256 share1, - uint256 share2 - ) external { - IStrategy[] memory strategies = new IStrategy[](2); - uint256[] memory shares = new uint256[](2); - strategies[0] = strategy1; - strategies[1] = strategy2; - shares[0] = share1; - shares[1] = share2; - super.decreaseDelegatedShares(staker,strategies,shares); + function get_operatorShares(address operator, IStrategy strategy) public view returns (uint256) { + return operatorShares[operator][strategy]; } - function get_operatorShares(address operator, IStrategy strategy) public view returns(uint256) { - return operatorShares[operator][strategy]; + function get_stakerDelegateableShares(address staker, IStrategy strategy) public view returns (uint256) { + // this is the address of the virtual 'beaconChainETH' strategy + if (address(strategy) == 0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0) { + int256 beaconChainETHShares = eigenPodManager.podOwnerShares(staker); + if (beaconChainETHShares <= 0) { + return 0; + } else { + return uint256(beaconChainETHShares); + } + } else { + return strategyManager.stakerStrategyShares(staker, strategy); + } } -} \ No newline at end of file +} diff --git a/certora/harnesses/EigenPodHarness.sol b/certora/harnesses/EigenPodHarness.sol new file mode 100644 index 000000000..0462b9e1a --- /dev/null +++ b/certora/harnesses/EigenPodHarness.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../../src/contracts/pods/EigenPod.sol"; + +contract EigenPodHarness is EigenPod { + + constructor( + IETHPOSDeposit _ethPOS, + IDelayedWithdrawalRouter _delayedWithdrawalRouter, + IEigenPodManager _eigenPodManager, + uint64 _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, + uint64 _GENESIS_TIME + ) + EigenPod(_ethPOS, _delayedWithdrawalRouter, _eigenPodManager, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME) {} + + function get_validatorIndex(bytes32 pubkeyHash) public view returns (uint64) { + return _validatorPubkeyHashToInfo[pubkeyHash].validatorIndex; + } + + function get_restakedBalanceGwei(bytes32 pubkeyHash) public view returns (uint64) { + return _validatorPubkeyHashToInfo[pubkeyHash].restakedBalanceGwei; + } + + function get_mostRecentBalanceUpdateTimestamp(bytes32 pubkeyHash) public view returns (uint64) { + return _validatorPubkeyHashToInfo[pubkeyHash].mostRecentBalanceUpdateTimestamp; + } + + function get_podOwnerShares() public view returns (int256) { + return eigenPodManager.podOwnerShares(podOwner); + } + + function get_withdrawableRestakedExecutionLayerGwei() public view returns (uint256) { + return withdrawableRestakedExecutionLayerGwei; + } + + function get_ETH_Balance() public view returns (uint256) { + return address(this).balance; + } +} diff --git a/certora/harnesses/EigenPodManagerHarness.sol b/certora/harnesses/EigenPodManagerHarness.sol new file mode 100644 index 000000000..84576ec9f --- /dev/null +++ b/certora/harnesses/EigenPodManagerHarness.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../../src/contracts/pods/EigenPodManager.sol"; + +contract EigenPodManagerHarness is EigenPodManager { + + constructor( + IETHPOSDeposit _ethPOS, + IBeacon _eigenPodBeacon, + IStrategyManager _strategyManager, + ISlasher _slasher, + IDelegationManager _delegationManager + ) + EigenPodManager(_ethPOS, _eigenPodBeacon, _strategyManager, _slasher, _delegationManager) {} + + function get_podOwnerShares(address podOwner) public view returns (int256) { + return podOwnerShares[podOwner]; + } + + function get_podByOwner(address podOwner) public view returns (IEigenPod) { + return ownerToPod[podOwner]; + } +} diff --git a/certora/harnesses/PausableHarness.sol b/certora/harnesses/PausableHarness.sol index c767c977c..fc0095ebe 100644 --- a/certora/harnesses/PausableHarness.sol +++ b/certora/harnesses/PausableHarness.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.12; +pragma solidity ^0.8.12; -import "../munged/permissions/Pausable.sol"; +import "../../src/contracts/permissions/Pausable.sol"; contract PausableHarness is Pausable { // getters @@ -21,4 +21,4 @@ contract PausableHarness is Pausable { function bitwise_and(uint256 input_1, uint256 input_2) external pure returns (uint256) { return (input_1 & input_2); } -} \ No newline at end of file +} diff --git a/certora/harnesses/SlasherHarness.sol b/certora/harnesses/SlasherHarness.sol index 897393e3e..519895780 100644 --- a/certora/harnesses/SlasherHarness.sol +++ b/certora/harnesses/SlasherHarness.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.12; +pragma solidity ^0.8.12; -import "../munged/core/Slasher.sol"; +import "../../src/contracts/core/Slasher.sol"; contract SlasherHarness is Slasher { @@ -58,28 +58,28 @@ contract SlasherHarness is Slasher { return (_operatorToWhitelistedContractsByUpdate[operator].list[node][direction]); } - // uses that _HEAD = 0. Similar to StructuredLinkedList.nodeExists but slightly better defined - function nodeDoesExist(address operator, uint256 node) public returns (bool) { - if (get_next_node(operator, node) == 0 && get_previous_node(operator, node) == 0) { - // slightly stricter check than that defined in StructuredLinkedList.nodeExists - if (get_next_node(operator, 0) == node && get_previous_node(operator, 0) == node) { - return true; - } else { - return false; - } - } else { - return true; - } - } - - // uses that _PREV = false, _NEXT = true - function nodeIsWellLinked(address operator, uint256 node) public returns (bool) { - return ( - // node is not linked to itself - get_previous_node(operator, node) != node && get_next_node(operator, node) != node - && - // node is the previous node's next node and the next node's previous node - get_linked_list_entry(operator, get_previous_node(operator, node), true) == node && get_linked_list_entry(operator, get_next_node(operator, node), false) == node - ); - } -} \ No newline at end of file + // // uses that _HEAD = 0. Similar to StructuredLinkedList.nodeExists but slightly better defined + // function nodeDoesExist(address operator, uint256 node) public returns (bool) { + // if (get_next_node(operator, node) == 0 && get_previous_node(operator, node) == 0) { + // // slightly stricter check than that defined in StructuredLinkedList.nodeExists + // if (get_next_node(operator, 0) == node && get_previous_node(operator, 0) == node) { + // return true; + // } else { + // return false; + // } + // } else { + // return true; + // } + // } + + // // uses that _PREV = false, _NEXT = true + // function nodeIsWellLinked(address operator, uint256 node) public returns (bool) { + // return ( + // // node is not linked to itself + // get_previous_node(operator, node) != node && get_next_node(operator, node) != node + // && + // // node is the previous node's next node and the next node's previous node + // get_linked_list_entry(operator, get_previous_node(operator, node), true) == node && get_linked_list_entry(operator, get_next_node(operator, node), false) == node + // ); + // } +} diff --git a/certora/harnesses/StrategyManagerHarness.sol b/certora/harnesses/StrategyManagerHarness.sol index c8b426202..441037032 100644 --- a/certora/harnesses/StrategyManagerHarness.sol +++ b/certora/harnesses/StrategyManagerHarness.sol @@ -1,65 +1,13 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity =0.8.12; +pragma solidity ^0.8.12; -import "../munged/core/StrategyManager.sol"; +import "../../src/contracts/core/StrategyManager.sol"; contract StrategyManagerHarness is StrategyManager { constructor(IDelegationManager _delegation, IEigenPodManager _eigenPodManager, ISlasher _slasher) StrategyManager(_delegation, _eigenPodManager, _slasher) {} - function slashSharesSinglet( - address slashedAddress, - address recipient, - IStrategy strategy, - IERC20 token, - uint256 strategyIndex, - uint256 shareAmount - ) - external - onlyOwner - onlyFrozen(slashedAddress) - nonReentrant - { - IStrategy[] memory strategies = new IStrategy[](1); - strategies[0] = strategy; - IERC20[] memory tokens = new IERC20[](1); - tokens[0] = token; - uint256[] memory strategyIndexes = new uint256[](1); - strategyIndexes[0] = strategyIndex; - uint256[] memory shareAmounts = new uint256[](1); - shareAmounts[0] = shareAmount; - require(tokens.length == strategies.length, "StrategyManager.slashShares: input length mismatch"); - uint256 strategyIndexIndex; - uint256 strategiesLength = strategies.length; - for (uint256 i = 0; i < strategiesLength;) { - // the internal function will return 'true' in the event the strategy was - // removed from the slashedAddress's array of strategies -- i.e. stakerStrategyList[slashedAddress] - if (_removeShares(slashedAddress, strategyIndexes[strategyIndexIndex], strategies[i], shareAmounts[i])) { - unchecked { - ++strategyIndexIndex; - } - } - - if (strategies[i] == beaconChainETHStrategy) { - //withdraw the beaconChainETH to the recipient - _withdrawBeaconChainETH(slashedAddress, recipient, shareAmounts[i]); - } - else { - // withdraw the shares and send funds to the recipient - strategies[i].withdraw(recipient, tokens[i], shareAmounts[i]); - } - - // increment the loop - unchecked { - ++i; - } - } - - // modify delegated shares accordingly, if applicable - delegation.decreaseDelegatedShares(slashedAddress, strategies, shareAmounts); - } - function strategy_is_in_stakers_array(address staker, IStrategy strategy) public view returns (bool) { uint256 length = stakerStrategyList[staker].length; for (uint256 i = 0; i < length; ++i) { @@ -101,6 +49,10 @@ contract StrategyManagerHarness is StrategyManager { } function totalShares(address strategy) public view returns (uint256) { - return IStrategy(strategy).totalShares(); + return IStrategy(strategy).totalShares(); + } + + function get_stakerStrategyShares(address staker, IStrategy strategy) public view returns (uint256) { + return stakerStrategyShares[staker][strategy]; } -} \ No newline at end of file +} diff --git a/certora/harnesses/StructuredLinkedListHarness.sol b/certora/harnesses/StructuredLinkedListHarness.sol index 48c26dd59..c653abde4 100644 --- a/certora/harnesses/StructuredLinkedListHarness.sol +++ b/certora/harnesses/StructuredLinkedListHarness.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.0; -import "../munged/libraries/StructuredLinkedList.sol"; +import "../../src/contracts/libraries/StructuredLinkedList.sol"; /** * @title StructuredLinkedList diff --git a/certora/harnesses/properties.md b/certora/harnesses/properties.md deleted file mode 100644 index 66e24f844..000000000 --- a/certora/harnesses/properties.md +++ /dev/null @@ -1,10 +0,0 @@ -nonhead node can't point to itself - -no dead ends ( can't point to 0 if 0 doesn't point back ) - -head points to itself in both directions or not at all - - -if node x points at node y, node y must point back at node x - -size == # of nodes with nonzero next == # of nodes with nonzero prev \ No newline at end of file diff --git a/certora/scripts/core/verifyDelegationManager.sh b/certora/scripts/core/verifyDelegationManager.sh index 2906d589a..23c3c124a 100644 --- a/certora/scripts/core/verifyDelegationManager.sh +++ b/certora/scripts/core/verifyDelegationManager.sh @@ -3,16 +3,18 @@ then RULE="--rule $2" fi +solc-select use 0.8.12 certoraRun certora/harnesses/DelegationManagerHarness.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ - certora/munged/pods/EigenPodManager.sol certora/munged/pods/EigenPod.sol certora/munged/strategies/StrategyBase.sol certora/munged/core/StrategyManager.sol \ - certora/munged/core/Slasher.sol certora/munged/permissions/PauserRegistry.sol \ + src/contracts/pods/EigenPodManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \ + src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ --verify DelegationManagerHarness:certora/specs/core/DelegationManager.spec \ --optimistic_loop \ - --send_only \ - --settings -optimisticFallback=true \ + --optimistic_fallback \ + --optimistic_hashing \ + --parametric_contracts DelegationManagerHarness \ $RULE \ - --loop_iter 3 \ + --loop_iter 2 \ --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ - --msg "DelegationManager $1 $2" \ \ No newline at end of file + --msg "DelegationManager $1 $2" \ diff --git a/certora/scripts/core/verifySlasher.sh b/certora/scripts/core/verifySlasher.sh deleted file mode 100644 index c1c53f2b4..000000000 --- a/certora/scripts/core/verifySlasher.sh +++ /dev/null @@ -1,20 +0,0 @@ -if [[ "$2" ]] -then - RULE="--rule $2" -fi - -solc-select use 0.8.12 - -certoraRun certora/harnesses/SlasherHarness.sol \ - lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \ - certora/munged/pods/EigenPodManager.sol certora/munged/pods/EigenPod.sol certora/munged/strategies/StrategyBase.sol certora/munged/core/DelegationManager.sol \ - certora/munged/core/StrategyManager.sol certora/munged/permissions/PauserRegistry.sol \ - --verify SlasherHarness:certora/specs/core/Slasher.spec \ - --optimistic_loop \ - --send_only \ - --settings -optimisticFallback=true,-recursionErrorAsAssert=false,-recursionEntryLimit=3 \ - --loop_iter 3 \ - --link SlasherHarness:delegation=DelegationManager \ - $RULE \ - --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ - --msg "Slasher $1 $2" \ \ No newline at end of file diff --git a/certora/scripts/core/verifyStrategyManager.sh b/certora/scripts/core/verifyStrategyManager.sh index 964ac6b77..52a1aa25d 100644 --- a/certora/scripts/core/verifyStrategyManager.sh +++ b/certora/scripts/core/verifyStrategyManager.sh @@ -3,19 +3,19 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +solc-select use 0.8.12 certoraRun certora/harnesses/StrategyManagerHarness.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ - certora/munged/pods/EigenPodManager.sol certora/munged/pods/EigenPod.sol certora/munged/pods/DelayedWithdrawalRouter.sol \ - certora/munged/strategies/StrategyBase.sol certora/munged/core/DelegationManager.sol \ - certora/munged/core/Slasher.sol certora/munged/permissions/PauserRegistry.sol \ + src/contracts/pods/EigenPodManager.sol src/contracts/pods/EigenPod.sol src/contracts/pods/DelayedWithdrawalRouter.sol \ + src/contracts/strategies/StrategyBase.sol src/contracts/core/DelegationManager.sol \ + src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ --verify StrategyManagerHarness:certora/specs/core/StrategyManager.spec \ --optimistic_loop \ - --send_only \ - --settings -optimisticFallback=true \ - --settings -optimisticUnboundedHashing=true \ + --optimistic_fallback \ + --optimistic_hashing \ + --parametric_contracts StrategyManagerHarness \ $RULE \ - --loop_iter 3 \ + --loop_iter 2 \ --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ - --msg "StrategyManager $1 $2" \ \ No newline at end of file + --msg "StrategyManager $1 $2" \ diff --git a/certora/scripts/libraries/verifyStructuredLinkedList.sh b/certora/scripts/libraries/verifyStructuredLinkedList.sh index 1527d1d87..0097243f3 100644 --- a/certora/scripts/libraries/verifyStructuredLinkedList.sh +++ b/certora/scripts/libraries/verifyStructuredLinkedList.sh @@ -3,12 +3,13 @@ then RULE="--rule $2" fi +solc-select use 0.8.12 certoraRun certora/harnesses/StructuredLinkedListHarness.sol \ --verify StructuredLinkedListHarness:certora/specs/libraries/StructuredLinkedList.spec \ --optimistic_loop \ - --send_only \ - --settings -optimisticFallback=true \ + --optimistic_fallback \ + --parametric_contracts StructuredLinkedListHarness \ $RULE \ --rule_sanity \ --loop_iter 3 \ diff --git a/certora/scripts/permissions/verifyPausable.sh b/certora/scripts/permissions/verifyPausable.sh index f40cc00be..2eeb1de18 100644 --- a/certora/scripts/permissions/verifyPausable.sh +++ b/certora/scripts/permissions/verifyPausable.sh @@ -3,13 +3,14 @@ then RULE="--rule $2" fi +solc-select use 0.8.12 certoraRun certora/harnesses/PausableHarness.sol \ - certora/munged/permissions/PauserRegistry.sol \ + src/contracts/permissions/PauserRegistry.sol \ --verify PausableHarness:certora/specs/permissions/Pausable.spec \ --optimistic_loop \ - --send_only \ - --settings -optimisticFallback=true,-recursionErrorAsAssert=false,-recursionEntryLimit=3 \ + --optimistic_fallback \ + --prover_args '-recursionErrorAsAssert false -recursionEntryLimit 3' \ --loop_iter 3 \ --link PausableHarness:pauserRegistry=PauserRegistry \ $RULE \ diff --git a/certora/scripts/pods/verifyEigenPod.sh b/certora/scripts/pods/verifyEigenPod.sh new file mode 100644 index 000000000..ddfcb8181 --- /dev/null +++ b/certora/scripts/pods/verifyEigenPod.sh @@ -0,0 +1,23 @@ +if [[ "$2" ]] +then + RULE="--rule $2" +fi + +solc-select use 0.8.12 + +certoraRun certora/harnesses/EigenPodHarness.sol \ + src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \ + src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ + src/contracts/core/StrategyManager.sol \ + src/contracts/strategies/StrategyBase.sol \ + lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \ + lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ + --verify EigenPodHarness:certora/specs/pods/EigenPod.spec \ + --optimistic_loop \ + --prover_args '-recursionEntryLimit 3' \ + --optimistic_hashing \ + --parametric_contracts EigenPodHarness \ + $RULE \ + --loop_iter 1 \ + --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ + --msg "EigenPod $1 $2" \ diff --git a/certora/scripts/pods/verifyEigenPodManager.sh b/certora/scripts/pods/verifyEigenPodManager.sh new file mode 100644 index 000000000..be315b558 --- /dev/null +++ b/certora/scripts/pods/verifyEigenPodManager.sh @@ -0,0 +1,19 @@ +if [[ "$2" ]] +then + RULE="--rule $2" +fi + +solc-select use 0.8.12 + +certoraRun certora/harnesses/EigenPodManagerHarness.sol \ + src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \ + src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ + --verify EigenPodManagerHarness:certora/specs/pods/EigenPodManager.spec \ + --optimistic_loop \ + --optimistic_fallback \ + --optimistic_hashing \ + --parametric_contracts EigenPodManagerHarness \ + $RULE \ + --loop_iter 3 \ + --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ + --msg "EigenPodManager $1 $2" \ diff --git a/certora/scripts/strategies/verifyStrategyBase.sh b/certora/scripts/strategies/verifyStrategyBase.sh index 822d08a0f..c490041bc 100644 --- a/certora/scripts/strategies/verifyStrategyBase.sh +++ b/certora/scripts/strategies/verifyStrategyBase.sh @@ -3,18 +3,20 @@ then RULE="--rule $2" fi +solc-select use 0.8.12 -certoraRun certora/munged/strategies/StrategyBase.sol \ +certoraRun src/contracts/strategies/StrategyBase.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \ - certora/munged/core/StrategyManager.sol \ - certora/munged/permissions/PauserRegistry.sol \ - certora/munged/core/Slasher.sol \ + src/contracts/core/StrategyManager.sol \ + src/contracts/permissions/PauserRegistry.sol \ + src/contracts/core/Slasher.sol \ --verify StrategyBase:certora/specs/strategies/StrategyBase.spec \ --optimistic_loop \ - --send_only \ - --settings -optimisticFallback=true,-recursionErrorAsAssert=false,-recursionEntryLimit=3 \ + --optimistic_fallback \ + --prover_args '-recursionErrorAsAssert false -recursionEntryLimit 3' \ --loop_iter 3 \ --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ --link StrategyBase:strategyManager=StrategyManager \ + --parametric_contracts StrategyBase \ $RULE \ - --msg "Pausable $1 $2" \ \ No newline at end of file + --msg "StrategyBase $1 $2" \ \ No newline at end of file diff --git a/certora/specs/core/DelegationManager.spec b/certora/specs/core/DelegationManager.spec index 033a534a6..276e1a726 100644 --- a/certora/specs/core/DelegationManager.spec +++ b/certora/specs/core/DelegationManager.spec @@ -2,59 +2,77 @@ methods { //// External Calls // external calls to DelegationManager - undelegate(address) - decreaseDelegatedShares(address,address[],uint256[]) - increaseDelegatedShares(address,address,uint256) + function undelegate(address) external; + function decreaseDelegatedShares(address,address,uint256) external; + function increaseDelegatedShares(address,address,uint256) external; + + // external calls from DelegationManager to ServiceManager + function _.updateStakes(address[]) external => NONDET; // external calls to Slasher - isFrozen(address) returns (bool) => DISPATCHER(true) - canWithdraw(address,uint32,uint256) returns (bool) => DISPATCHER(true) + function _.isFrozen(address) external => DISPATCHER(true); + function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true); // external calls to StrategyManager - getDeposits(address) returns (address[],uint256[]) => DISPATCHER(true) - slasher() returns (address) => DISPATCHER(true) - deposit(address,uint256) returns (uint256) => DISPATCHER(true) - withdraw(address,address,uint256) => DISPATCHER(true) + function _.getDeposits(address) external => DISPATCHER(true); + function _.slasher() external => DISPATCHER(true); + function _.addShares(address,address,uint256) external => DISPATCHER(true); + function _.removeShares(address,address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true); // external calls to EigenPodManager - withdrawBeaconChainETH(address,address,uint256) => DISPATCHER(true) - + function _.addShares(address,uint256) external => DISPATCHER(true); + function _.removeShares(address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true); + // external calls to EigenPod - withdrawBeaconChainETH(address,uint256) => DISPATCHER(true) + function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); + // external calls to DelayedWithdrawalRouter (from EigenPod) + function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); + // external calls to PauserRegistry - pauser() returns (address) => DISPATCHER(true) - unpauser() returns (address) => DISPATCHER(true) + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); + + // external calls to Strategy contracts + function _.withdraw(address,address,uint256) external => DISPATCHER(true); + function _.deposit(address,uint256) external => DISPATCHER(true); + + // external calls to ERC20 + function _.balanceOf(address) external => DISPATCHER(true); + function _.transfer(address, uint256) external => DISPATCHER(true); + function _.transferFrom(address, address, uint256) external => DISPATCHER(true); // external calls to ERC1271 (can import OpenZeppelin mock implementation) // isValidSignature(bytes32 hash, bytes memory signature) returns (bytes4 magicValue) => DISPATCHER(true) - isValidSignature(bytes32, bytes) returns (bytes4) => DISPATCHER(true) + function _.isValidSignature(bytes32, bytes) external => DISPATCHER(true); //// Harnessed Functions - // Harnessed calls - decreaseDelegatedShares(address,address,address,uint256,uint256) - // Harmessed getters - get_operatorShares(address,address) returns(uint256) envfree - - //// Summarized Functions - _delegationReceivedHook(address,address,address[],uint256[]) => NONDET - _delegationWithdrawnHook(address,address,address[],uint256[]) => NONDET + // Harnessed getters + function get_operatorShares(address,address) external returns (uint256) envfree; + function get_stakerDelegateableShares(address,address) external returns (uint256) envfree; //envfree functions - isDelegated(address staker) returns (bool) envfree - isNotDelegated(address staker) returns (bool) envfree - isOperator(address operator) returns (bool) envfree - delegatedTo(address staker) returns (address) envfree - delegationTerms(address operator) returns (address) envfree - operatorShares(address operator, address strategy) returns (uint256) envfree - owner() returns (address) envfree - strategyManager() returns (address) envfree + function delegatedTo(address) external returns (address) envfree; + function operatorDetails(address) external returns (IDelegationManager.OperatorDetails memory) envfree; + function earningsReceiver(address) external returns (address) envfree; + function delegationApprover(address operator) external returns (address) envfree; + function stakerOptOutWindowBlocks(address operator) external returns (uint256) envfree; + function operatorShares(address operator, address strategy) external returns (uint256) envfree; + function isDelegated(address staker) external returns (bool) envfree; + function isOperator(address operator) external returns (bool) envfree; + function stakerNonce(address staker) external returns (uint256) envfree; + function delegationApproverSaltIsSpent(address delegationApprover, bytes32 salt) external returns (bool) envfree; + function owner() external returns (address) envfree; + function strategyManager() external returns (address) envfree; + function eigenPodManager() external returns (address) envfree; } /* LEGAL STATE TRANSITIONS: 1) -FROM not delegated -- defined as delegatedTo(staker) == address(0), likewise returned by isNotDelegated(staker)-- +FROM not delegated -- defined as delegatedTo(staker) == address(0), likewise returned by !isDelegated(staker)-- AND not registered as an operator -- defined as isOperator(operator) == false, or equivalently, delegationTerms(operator) == 0, TO delegated but not an operator in this case, the end state is that: @@ -100,14 +118,12 @@ FORBIDDEN STATES: Combining the above, an address can be (classified as an operator) *iff* they are (delegated to themselves). The exception is the zero address, since by default an address is 'delegated to the zero address' when they are not delegated at all */ -//definition notDelegated -- defined as delegatedTo(staker) == address(0), likewise returned by isNotDelegated(staker)-- +//definition notDelegated -- defined as delegatedTo(staker) == address(0), likewise returned by !isDelegated(staker)-- // verify that anyone who is registered as an operator is also always delegated to themselves +// the zero address is an exception to this rule, since it is always "delegated to itself" but not an operator invariant operatorsAlwaysDelegatedToSelf(address operator) - isOperator(operator) <=> delegatedTo(operator) == operator - { preserved { - require operator != 0; - } } + operator != 0 => (isOperator(operator) <=> delegatedTo(operator) == operator); // verify that once registered as an operator, a person cannot 'unregister' from being an operator // proving this rule in concert with 'operatorsAlwaysDelegatedToSelf' proves that an operator can never change their delegation @@ -126,24 +142,29 @@ rule operatorCannotUnregister(address operator) { // verifies that in order for an address to change who they are delegated to, `undelegate` must be called rule cannotChangeDelegationWithoutUndelegating(address staker) { + requireInvariant operatorsAlwaysDelegatedToSelf(staker); // assume the staker is delegated to begin with require(isDelegated(staker)); address delegatedToBefore = delegatedTo(staker); // perform arbitrary function call method f; env e; - // the only way the staker can become undelegated is if `undelegate` is called - if (f.selector == undelegate(address).selector) { + // the only way the staker can become undelegated is an appropriate function is called + if (f.selector == sig:undelegate(address).selector) { address toUndelegate; undelegate(e, toUndelegate); - // either the `strategyManager` called `undelegate` with the argument `staker` (in which can the staker is now undelegated) - if (e.msg.sender == strategyManager() && toUndelegate == staker) { - assert (delegatedTo(staker) == 0, "undelegation did not result in delegation to zero address"); + // either the `staker` address was an input to `undelegate` AND the caller was allowed to call the function + if ( + (toUndelegate == staker && (delegatedToBefore != staker)) && + (e.msg.sender == staker || e.msg.sender == delegatedToBefore || e.msg.sender == delegationApprover(delegatedToBefore)) + ){ + assert (delegatedTo(staker) == 0, "undelegation did not result in delegation to zero address"); // or the staker's delegation should have remained the same } else { address delegatedToAfter = delegatedTo(staker); assert (delegatedToAfter == delegatedToBefore, "delegation changed without undelegating -- problem in undelegate permissions?"); } + assert(true); } else { calldataarg arg; f(e,arg); @@ -156,42 +177,87 @@ rule cannotChangeDelegationWithoutUndelegating(address staker) { rule canOnlyDelegateWithSpecificFunctions(address staker) { requireInvariant operatorsAlwaysDelegatedToSelf(staker); // assume the staker begins as undelegated - require(isNotDelegated(staker)); + require(!isDelegated(staker)); // perform arbitrary function call method f; env e; - if (f.selector == delegateTo(address).selector) { + if (f.selector == sig:delegateTo(address, ISignatureUtils.SignatureWithExpiry, bytes32).selector) { address operator; - delegateTo(e, operator); + ISignatureUtils.SignatureWithExpiry approverSignatureAndExpiry; + bytes32 salt; + delegateTo(e, operator, approverSignatureAndExpiry, salt); // we check against operator being the zero address here, since we view being delegated to the zero address as *not* being delegated if (e.msg.sender == staker && isOperator(operator) && operator != 0) { assert (isDelegated(staker) && delegatedTo(staker) == operator, "failure in delegateTo"); } else { - assert (isNotDelegated(staker), "staker delegated to inappropriate address?"); + assert (!isDelegated(staker), "staker delegated to inappropriate address?"); } - } else if (f.selector == delegateToBySignature(address, address, uint256, bytes).selector) { + } else if (f.selector == sig:delegateToBySignature(address, address, ISignatureUtils.SignatureWithExpiry, ISignatureUtils.SignatureWithExpiry, bytes32).selector) { address toDelegateFrom; address operator; - uint256 expiry; - bytes signature; - delegateToBySignature(e, toDelegateFrom, operator, expiry, signature); + ISignatureUtils.SignatureWithExpiry stakerSignatureAndExpiry; + ISignatureUtils.SignatureWithExpiry approverSignatureAndExpiry; + bytes32 salt; + delegateToBySignature(e, toDelegateFrom, operator, stakerSignatureAndExpiry, approverSignatureAndExpiry, salt); // TODO: this check could be stricter! need to filter when the block timestamp is appropriate for expiry and signature is valid - assert (isNotDelegated(staker) || delegatedTo(staker) == operator, "delegateToBySignature bug?"); - } else if (f.selector == registerAsOperator(address).selector) { - address delegationTerms; - registerAsOperator(e, delegationTerms); - if (e.msg.sender == staker && delegationTerms != 0) { + assert (!isDelegated(staker) || delegatedTo(staker) == operator, "delegateToBySignature bug?"); + } else if (f.selector == sig:registerAsOperator(IDelegationManager.OperatorDetails, string).selector) { + IDelegationManager.OperatorDetails operatorDetails; + string metadataURI; + registerAsOperator(e, operatorDetails, metadataURI); + if (e.msg.sender == staker) { assert (isOperator(staker)); } else { - assert(isNotDelegated(staker)); + assert(!isDelegated(staker)); } } else { calldataarg arg; f(e,arg); - assert (isNotDelegated(staker), "staker became delegated through inappropriate function call"); + assert (!isDelegated(staker), "staker became delegated through inappropriate function call"); + } +} + +rule sharesBecomeDelegatedWhenStakerDelegates(address operator, address staker, address strategy) { + requireInvariant operatorsAlwaysDelegatedToSelf(operator); + // filter out zero address (not a valid operator) + require(operator != 0); + // assume the staker begins as undelegated + require(!isDelegated(staker)); + mathint stakerDelegateableSharesInStrategy = get_stakerDelegateableShares(staker, strategy); + mathint operatorSharesBefore = get_operatorShares(operator, strategy); + // perform arbitrary function call + method f; + env e; + calldataarg arg; + mathint operatorSharesAfter = get_operatorShares(operator, strategy); + if (delegatedTo(staker) == operator) { + assert(operatorSharesAfter == operatorSharesBefore + stakerDelegateableSharesInStrategy, "operator shares did not increase appropriately"); + } else { + assert(operatorSharesAfter == operatorSharesBefore, "operator shares changed inappropriately"); + } +} + +rule sharesBecomeUndelegatedWhenStakerUndelegates(address operator, address staker, address strategy) { + requireInvariant operatorsAlwaysDelegatedToSelf(operator); + // filter out zero address (not a valid operator) + require(operator != 0); + // assume the staker begins as delegated to the operator + require(delegatedTo(staker) == operator); + mathint stakerDelegateableSharesInStrategy = get_stakerDelegateableShares(staker, strategy); + mathint operatorSharesBefore = get_operatorShares(operator, strategy); + // perform arbitrary function call + method f; + env e; + calldataarg arg; + mathint operatorSharesAfter = get_operatorShares(operator, strategy); + if (!isDelegated(staker)) { + assert(operatorSharesAfter == operatorSharesBefore - stakerDelegateableSharesInStrategy, "operator shares did not decrease appropriately"); + } else { + assert(operatorSharesAfter == operatorSharesBefore, "operator shares changed inappropriately"); } } + /* rule batchEquivalence { env e; diff --git a/certora/specs/core/Slasher.spec b/certora/specs/core/Slasher.spec index 6e7ce1423..1ecdbd2de 100644 --- a/certora/specs/core/Slasher.spec +++ b/certora/specs/core/Slasher.spec @@ -2,61 +2,60 @@ methods { //// External Calls // external calls to DelegationManager - undelegate(address) => DISPATCHER(true) - isDelegated(address) returns (bool) => DISPATCHER(true) - delegatedTo(address) returns (address) => DISPATCHER(true) - decreaseDelegatedShares(address,address[],uint256[]) => DISPATCHER(true) - increaseDelegatedShares(address,address,uint256) => DISPATCHER(true) - _delegationReceivedHook(address,address,address[],uint256[]) => NONDET - _delegationWithdrawnHook(address,address,address[],uint256[]) => NONDET + function _.undelegate(address) external => DISPATCHER(true); + function _.isDelegated(address) external => DISPATCHER(true); + function _.delegatedTo(address) external => DISPATCHER(true); + function _.decreaseDelegatedShares(address,address,uint256) external => DISPATCHER(true); + function _.increaseDelegatedShares(address,address,uint256) external => DISPATCHER(true); // external calls to Slasher - isFrozen(address) returns (bool) envfree - canWithdraw(address,uint32,uint256) returns (bool) + function isFrozen(address) external returns (bool) envfree; + function canWithdraw(address,uint32,uint256) external returns (bool); // external calls to StrategyManager - getDeposits(address) returns (address[],uint256[]) => DISPATCHER(true) - slasher() returns (address) => DISPATCHER(true) - deposit(address,uint256) returns (uint256) => DISPATCHER(true) - withdraw(address,address,uint256) => DISPATCHER(true) + function _.getDeposits(address) external => DISPATCHER(true); + function _.slasher() external => DISPATCHER(true); + function _.addShares(address,address,uint256) external => DISPATCHER(true); + function _.removeShares(address,address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true); // external calls to EigenPodManager - withdrawBeaconChainETH(address,address,uint256) => DISPATCHER(true) - + function _.addShares(address,uint256) external => DISPATCHER(true); + function _.removeShares(address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true); + // external calls to EigenPod - withdrawBeaconChainETH(address,uint256) => DISPATCHER(true) - - // external calls to IDelegationTerms - onDelegationWithdrawn(address,address[],uint256[]) => CONSTANT - onDelegationReceived(address,address[],uint256[]) => CONSTANT - + function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); + + // external calls to DelayedWithdrawalRouter (from EigenPod) + function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); + // external calls to PauserRegistry - pauser() returns (address) => DISPATCHER(true) - unpauser() returns (address) => DISPATCHER(true) + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); //// Harnessed Functions // Harnessed calls // Harnessed getters - get_is_operator(address) returns (bool) envfree - get_is_delegated(address) returns (bool) envfree - get_list_exists(address) returns (bool) envfree - get_next_node_exists(address, uint256) returns (bool) envfree - get_next_node(address, uint256) returns (uint256) envfree - get_previous_node_exists(address, uint256) returns (bool) envfree - get_previous_node(address, uint256) returns (uint256) envfree - get_node_exists(address, address) returns (bool) envfree - get_list_head(address) returns (uint256) envfree - get_lastest_update_block_at_node(address, uint256) returns (uint256) envfree - get_lastest_update_block_at_head(address) returns (uint256) envfree - get_linked_list_entry(address operator, uint256 node, bool direction) returns (uint256) envfree + function get_is_operator(address) external returns (bool) envfree; + function get_is_delegated(address) external returns (bool) envfree; + function get_list_exists(address) external returns (bool) envfree; + function get_next_node_exists(address, uint256) external returns (bool) envfree; + function get_next_node(address, uint256) external returns (uint256) envfree; + function get_previous_node_exists(address, uint256) external returns (bool) envfree; + function get_previous_node(address, uint256) external returns (uint256) envfree; + function get_list_head(address) external returns (uint256) envfree; + function get_lastest_update_block_at_node(address, uint256) external returns (uint256) envfree; + function get_lastest_update_block_at_head(address) external returns (uint256) envfree; + function get_linked_list_entry(address operator, uint256 node, bool direction) external returns (uint256) envfree; // nodeDoesExist(address operator, uint256 node) returns (bool) envfree - nodeIsWellLinked(address operator, uint256 node) returns (bool) envfree + //function nodeIsWellLinked(address operator, uint256 node) external returns (bool) envfree; //// Normal Functions - owner() returns(address) envfree - contractCanSlashOperatorUntil(address, address) returns (uint32) envfree - paused(uint8) returns (bool) envfree + function owner() external returns(address) envfree; + function contractCanSlashOperatorUntilBlock(address, address) external returns (uint32) envfree; + function paused(uint8) external returns (bool) envfree; } // uses that _HEAD = 0. Similar to StructuredLinkedList.nodeExists but slightly better defined @@ -92,29 +91,29 @@ rule cantBeUnfrozen(method f) { /* verifies that `contractCanSlashOperatorUntil[operator][contractAddress]` only changes when either: the `operator` themselves calls `allowToSlash` -or +rule or the `contractAddress` calls `recordLastStakeUpdateAndRevokeSlashingAbility` */ rule canOnlyChangecontractCanSlashOperatorUntilWithSpecificFunctions(address operator, address contractAddress) { - uint256 valueBefore = contractCanSlashOperatorUntil(operator, contractAddress); + uint256 valueBefore = contractCanSlashOperatorUntilBlock(operator, contractAddress); // perform arbitrary function call method f; env e; - if (f.selector == recordLastStakeUpdateAndRevokeSlashingAbility(address, uint32).selector) { + if (f.selector == sig:recordLastStakeUpdateAndRevokeSlashingAbility(address, uint32).selector) { address operator2; uint32 serveUntil; recordLastStakeUpdateAndRevokeSlashingAbility(e, operator2, serveUntil); - uint256 valueAfter = contractCanSlashOperatorUntil(operator, contractAddress); + uint256 valueAfter = contractCanSlashOperatorUntilBlock(operator, contractAddress); if (e.msg.sender == contractAddress && operator2 == operator/* TODO: proper check */) { /* TODO: proper check */ assert (true, "failure in recordLastStakeUpdateAndRevokeSlashingAbility"); } else { assert (valueBefore == valueAfter, "bad permissions on recordLastStakeUpdateAndRevokeSlashingAbility?"); } - } else if (f.selector == optIntoSlashing(address).selector) { + } else if (f.selector == sig:optIntoSlashing(address).selector) { address arbitraryContract; optIntoSlashing(e, arbitraryContract); - uint256 valueAfter = contractCanSlashOperatorUntil(operator, contractAddress); + uint256 valueAfter = contractCanSlashOperatorUntilBlock(operator, contractAddress); // uses that the `PAUSED_OPT_INTO_SLASHING` index is 0, as an input to the `paused` function if (e.msg.sender == operator && arbitraryContract == contractAddress && get_is_operator(operator) && !paused(0)) { // uses that `MAX_CAN_SLASH_UNTIL` is equal to max_uint32 @@ -125,7 +124,7 @@ rule canOnlyChangecontractCanSlashOperatorUntilWithSpecificFunctions(address ope } else { calldataarg arg; f(e, arg); - uint256 valueAfter = contractCanSlashOperatorUntil(operator, contractAddress); + uint256 valueAfter = contractCanSlashOperatorUntilBlock(operator, contractAddress); assert(valueBefore == valueAfter, "bondedAfter value changed when it shouldn't have!"); } } diff --git a/certora/specs/core/StrategyManager.spec b/certora/specs/core/StrategyManager.spec index 73ace3bc4..43cd8e20f 100644 --- a/certora/specs/core/StrategyManager.spec +++ b/certora/specs/core/StrategyManager.spec @@ -1,79 +1,78 @@ // to allow calling ERC20 token within this spec -using ERC20 as token +using ERC20 as token; methods { //// External Calls // external calls to DelegationManager - undelegate(address) => DISPATCHER(true) - isDelegated(address) returns (bool) => DISPATCHER(true) - delegatedTo(address) returns (address) => DISPATCHER(true) - decreaseDelegatedShares(address,address[],uint256[]) => DISPATCHER(true) - increaseDelegatedShares(address,address,uint256) => DISPATCHER(true) - _delegationReceivedHook(address,address,address[],uint256[]) => NONDET - _delegationWithdrawnHook(address,address,address[],uint256[]) => NONDET + function _.undelegate(address) external => DISPATCHER(true); + function _.isDelegated(address) external => DISPATCHER(true); + function _.delegatedTo(address) external => DISPATCHER(true); + function _.decreaseDelegatedShares(address,address,uint256) external => DISPATCHER(true); + function _.increaseDelegatedShares(address,address,uint256) external => DISPATCHER(true); + + // external calls from DelegationManager to ServiceManager + function _.updateStakes(address[]) external => NONDET; // external calls to Slasher - isFrozen(address) returns (bool) => DISPATCHER(true) - canWithdraw(address,uint32,uint256) returns (bool) => DISPATCHER(true) + function _.isFrozen(address) external => DISPATCHER(true); + function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true); // external calls to StrategyManager - getDeposits(address) returns (address[],uint256[]) - slasher() returns (address) - deposit(address,uint256) returns (uint256) - withdraw(address,address,uint256) - - // external calls to Strategy - deposit(address, uint256) returns (uint256) => DISPATCHER(true) - withdraw(address, address, uint256) => DISPATCHER(true) - totalShares() => DISPATCHER(true) + function _.getDeposits(address) external => DISPATCHER(true); + function _.slasher() external => DISPATCHER(true); + function _.addShares(address,address,address,uint256) external => DISPATCHER(true); + function _.removeShares(address,address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true); // external calls to EigenPodManager - withdrawRestakedBeaconChainETH(address,address,uint256) => DISPATCHER(true) - // call made to EigenPodManager by DelayedWithdrawalRouter - getPod(address) => DISPATCHER(true) + function _.addShares(address,uint256) external => DISPATCHER(true); + function _.removeShares(address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true); - // external calls to EigenPod (from EigenPodManager) - withdrawRestakedBeaconChainETH(address, uint256) => DISPATCHER(true) + // external calls to EigenPod + function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); // external calls to DelayedWithdrawalRouter (from EigenPod) - createDelayedWithdrawal(address, address) => DISPATCHER(true) + function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); - // external calls to IDelegationTerms - onDelegationWithdrawn(address,address[],uint256[]) => CONSTANT - onDelegationReceived(address,address[],uint256[]) => CONSTANT - // external calls to PauserRegistry - pauser() returns (address) => DISPATCHER(true) - unpauser() returns (address) => DISPATCHER(true) + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); + + // external calls to Strategy contracts + function _.withdraw(address,address,uint256) external => DISPATCHER(true); + function _.deposit(address,uint256) external => DISPATCHER(true); // external calls to ERC20 - balanceOf(address) returns (uint256) => DISPATCHER(true) - transfer(address, uint256) returns (bool) => DISPATCHER(true) - transferFrom(address, address, uint256) returns (bool) => DISPATCHER(true) + function _.balanceOf(address) external => DISPATCHER(true); + function _.transfer(address, uint256) external => DISPATCHER(true); + function _.transferFrom(address, address, uint256) external => DISPATCHER(true); // calls to ERC20 in this spec - token.balanceOf(address) returns(uint256) envfree + function token.balanceOf(address) external returns(uint256) envfree; // external calls to ERC1271 (can import OpenZeppelin mock implementation) // isValidSignature(bytes32 hash, bytes memory signature) returns (bytes4 magicValue) => DISPATCHER(true) - isValidSignature(bytes32, bytes) returns (bytes4) => DISPATCHER(true) + function _.isValidSignature(bytes32, bytes) external => DISPATCHER(true); //// Harnessed Functions // Harnessed calls + function _.totalShares() external => DISPATCHER(true); // Harnessed getters - strategy_is_in_stakers_array(address, address) returns (bool) envfree - num_times_strategy_is_in_stakers_array(address, address) returns (uint256) envfree - totalShares(address) returns (uint256) envfree + function strategy_is_in_stakers_array(address, address) external returns (bool) envfree; + function num_times_strategy_is_in_stakers_array(address, address) external returns (uint256) envfree; + function totalShares(address) external returns (uint256) envfree; + function get_stakerStrategyShares(address, address) external returns (uint256) envfree; //// Normal Functions - stakerStrategyListLength(address) returns (uint256) envfree - stakerStrategyList(address, uint256) returns (address) envfree - stakerStrategyShares(address, address) returns (uint256) envfree - array_exhibits_properties(address) returns (bool) envfree + function stakerStrategyListLength(address) external returns (uint256) envfree; + function stakerStrategyList(address, uint256) external returns (address) envfree; + function stakerStrategyShares(address, address) external returns (uint256) envfree; + function array_exhibits_properties(address) external returns (bool) envfree; } invariant stakerStrategyListLengthLessThanOrEqualToMax(address staker) - stakerStrategyListLength(staker) <= 32 + stakerStrategyListLength(staker) <= 32; // verifies that strategies in the staker's array of strategies are not duplicated, and that the staker has nonzero shares in each one invariant arrayExhibitsProperties(address staker) @@ -87,7 +86,7 @@ invariant arrayExhibitsProperties(address staker) // if a strategy is *not* in staker's array of strategies, then the staker should have precisely zero shares in that strategy invariant strategiesNotInArrayHaveZeroShares(address staker, uint256 index) - (index >= stakerStrategyListLength(staker)) => (stakerStrategyShares(staker, stakerStrategyList(staker, index)) == 0) + (index >= stakerStrategyListLength(staker)) => (stakerStrategyShares(staker, stakerStrategyList(staker, index)) == 0); /** * a staker's amount of shares in a strategy (i.e. `stakerStrategyShares[staker][strategy]`) should only increase when @@ -95,22 +94,17 @@ invariant strategiesNotInArrayHaveZeroShares(address staker, uint256 index) * *OR* when completing a withdrawal */ definition methodCanIncreaseShares(method f) returns bool = - f.selector == depositIntoStrategy(address,address,uint256).selector - || f.selector == depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes).selector - || f.selector == depositBeaconChainETH(address,uint256).selector - || f.selector == completeQueuedWithdrawal((address[],uint256[],address,(address,uint96),uint32,address),address[],uint256,bool).selector; - // || f.selector == slashQueuedWithdrawal(address,bytes,address[],uint256[]).selector - // || f.selector == slashShares(address,address,address[],address[],uint256[],uint256[]).selector; + f.selector == sig:depositIntoStrategy(address,address,uint256).selector + || f.selector == sig:depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes).selector + || f.selector == sig:withdrawSharesAsTokens(address,address,uint256,address).selector + || f.selector == sig:addShares(address,address,address,uint256).selector; /** * a staker's amount of shares in a strategy (i.e. `stakerStrategyShares[staker][strategy]`) should only decrease when -* `queueWithdrawal`, `slashShares`, or `recordOvercommittedBeaconChainETH` has been called +* `queueWithdrawal`, `slashShares`, or `recordBeaconChainETHBalanceUpdate` has been called */ definition methodCanDecreaseShares(method f) returns bool = - f.selector == queueWithdrawal(uint256[],address[],uint256[],address,bool).selector - || f.selector == slashShares(address,address,address[],address[],uint256[],uint256[]).selector - || f.selector == slashSharesSinglet(address,address,address,address,uint256,uint256).selector - || f.selector == recordOvercommittedBeaconChainETH(address,uint256,uint256).selector; + f.selector == sig:removeShares(address,address,uint256).selector; rule sharesAmountsChangeOnlyWhenAppropriateFunctionsCalled(address staker, address strategy) { uint256 sharesBefore = stakerStrategyShares(staker, strategy); @@ -123,55 +117,50 @@ rule sharesAmountsChangeOnlyWhenAppropriateFunctionsCalled(address staker, addre assert(sharesAfter < sharesBefore => methodCanDecreaseShares(f)); } -// based on Certora's example here https://github.com/Certora/Tutorials/blob/michael/ethcc/EthCC/Ghosts/ghostTest.spec -ghost mapping(address => mathint) sumOfSharesInStrategy { - init_state axiom forall address strategy. sumOfSharesInStrategy[strategy] == 0; -} - -hook Sstore stakerStrategyShares[KEY address staker][KEY address strategy] uint256 newValue (uint256 oldValue) STORAGE { - sumOfSharesInStrategy[strategy] = sumOfSharesInStrategy[strategy] + newValue - oldValue; -} - /** -* Verifies that the `totalShares` returned by an Strategy is always greater than or equal to the sum of shares in the `stakerStrategyShares` -* mapping -- specifically, that `strategy.totalShares() >= sum_over_all_stakers(stakerStrategyShares[staker][strategy])` -* We cannot show strict equality here, since the withdrawal process first decreases a staker's shares (when `queueWithdrawal` is called) and -* only later is `totalShares` decremented (when `completeQueuedWithdrawal` is called). +* Verifies that the `totalShares` returned by an Strategy increases appropriately when new Strategy shares are issued by the StrategyManager +* contract (specifically as a result of a call to `StrategyManager.depositIntoStrategy` or `StrategyManager.depositIntoStrategyWithSignature`). +* This rule excludes the `addShares` and `removeShares` functions, since these are called only by the DelegationManager, and do not +* "create new shares", but rather represent existing shares being "moved into a withdrawal". */ -invariant totalSharesGeqSumOfShares(address strategy) - totalShares(strategy) >= sumOfSharesInStrategy[strategy] - // preserved block since does not apply for 'beaconChainETH' - { preserved { - // 0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0 converted to decimal (this is the address of the virtual 'beaconChainETH' strategy) - // require strategy != beaconChainETHStrategy(); - require strategy != 1088545275507480024404324736574744392984337050304; - } } +rule newSharesIncreaseTotalShares(address strategy) { + method f; + env e; + uint256 stakerStrategySharesBefore = get_stakerStrategyShares(e.msg.sender, strategy); + uint256 totalSharesBefore = totalShares(strategy); + if ( + f.selector == sig:addShares(address, address, address, uint256).selector + || f.selector == sig:removeShares(address, address, uint256).selector + ) { + uint256 totalSharesAfter = totalShares(strategy); + assert(totalSharesAfter == totalSharesBefore, "total shares changed unexpectedly"); + } else { + uint256 stakerStrategySharesAfter = get_stakerStrategyShares(e.msg.sender, strategy); + uint256 totalSharesAfter = totalShares(strategy); + assert(stakerStrategySharesAfter - stakerStrategySharesBefore == totalSharesAfter - totalSharesBefore, "diffs don't match"); + } +} /** * Verifies that ERC20 tokens are transferred out of the account only of the msg.sender. - * Called 'safeApprovalUse' since approval-related vulnerabilites in general allow a caller to transfer tokens out of a different account. + * Called 'safeApprovalUse' since approval-related vulnerabilities in general allow a caller to transfer tokens out of a different account. * This behavior is not always unsafe, but since we don't ever use it (at present) we can do a blanket-check against it. */ rule safeApprovalUse(address user) { uint256 tokenBalanceBefore = token.balanceOf(user); method f; env e; - calldataarg args; - // need special case for `slashShares` function since otherwise this rule fails by making the user address one of the slashed strategy(s) - if ( - f.selector == slashShares(address,address,address[],address[],uint256[],uint256[]).selector - || f.selector == slashSharesSinglet(address,address,address,address,uint256,uint256).selector - ) { - address slashedAddress; + // special case logic, to handle an edge case + if (f.selector == sig:withdrawSharesAsTokens(address,address,uint256,address).selector) { address recipient; address strategy; - address desiredToken; - uint256 strategyIndex; - uint256 shareAmount; - // need this filtering here - require(strategy != user); - slashSharesSinglet(e, slashedAddress, recipient, strategy, desiredToken, strategyIndex, shareAmount); + uint256 shares; + // filter out case where the 'user' is the strategy itself + require(user != strategy); + withdrawSharesAsTokens(e, recipient, strategy, shares, token); + // otherwise just perform an arbitrary function call } else { + calldataarg args; f(e,args); } uint256 tokenBalanceAfter = token.balanceOf(user); diff --git a/certora/specs/libraries/StructuredLinkedList.spec b/certora/specs/libraries/StructuredLinkedList.spec index 12a58f443..8b6ae0bd9 100644 --- a/certora/specs/libraries/StructuredLinkedList.spec +++ b/certora/specs/libraries/StructuredLinkedList.spec @@ -1,22 +1,22 @@ methods { - listExists() returns (bool) envfree - nodeExists(uint256) returns (bool) envfree - sizeOf() returns (uint256) envfree - getHead() returns (uint256) envfree - getNode(uint256) returns (bool, uint256, uint256) envfree - getAdjacent(uint256,bool) returns (bool, uint256) envfree - getAdjacentStrict(uint256,bool) returns (uint256) envfree - getNextNode(uint256) returns (bool, uint256) envfree - getPreviousNode(uint256) returns (bool, uint256) envfree - insert(uint256,uint256,bool) envfree - remove(uint256) envfree + function listExists() external returns (bool) envfree; + function nodeExists(uint256) external returns (bool) envfree; + function sizeOf() external returns (uint256) envfree; + function getHead() external returns (uint256) envfree; + function getNode(uint256) external returns (bool, uint256, uint256) envfree; + function getAdjacent(uint256,bool) external returns (bool, uint256) envfree; + function getAdjacentStrict(uint256,bool) external returns (uint256) envfree; + function getNextNode(uint256) external returns (bool, uint256) envfree; + function getPreviousNode(uint256) external returns (bool, uint256) envfree; + function insert(uint256,uint256,bool) external envfree; + function remove(uint256) external envfree; } ghost mapping(uint256 => bool) connectsToHead { init_state axiom connectsToHead[0] == true; } -hook Sstore currentContract.listStorage.list[KEY uint256 node][KEY bool direction] uint256 link (uint256 old_link) STORAGE { +hook Sstore currentContract.listStorage.list[KEY uint256 node][KEY bool direction] uint256 link (uint256 old_link) { connectsToHead[link] = connectsToHead[node]; connectsToHead[old_link] = old_link == 0; } @@ -107,7 +107,7 @@ invariant zeroRequiredInCircle(uint256 node1, uint256 node2) } } - +/* commented out while failing (can reintroduce in a PR) // in progress invariant headInList(uint256 node) nodeExists(node) => connectsToHead[node] @@ -129,7 +129,7 @@ invariant headInList(uint256 node) // size == # of nodes with nonzero next == # of nodes with nonzero prev - +*/ /* @@ -168,7 +168,7 @@ function safeAssumptions() { invariant zeroEmpty() isEmpty(0) - filtered { f -> f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector } rule zeroEmptyPreservedInsertSorted(address _id, uint256 _value) { address prev; @@ -198,7 +198,7 @@ invariant headWellFormed() invariant tailWellFormed() isTailWellFormed() - filtered { f -> f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector } { preserved remove(address _id) { requireInvariant zeroEmpty(); requireInvariant twoWayLinked(getPrev(_id), _id); @@ -235,7 +235,7 @@ invariant tipsZero() invariant noPrevIsHead(address addr) hasNoPrevIsHead(addr) - filtered { f -> f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector } { preserved remove(address _id) { safeAssumptions(); requireInvariant twoWayLinked(_id, getNext(_id)); @@ -264,7 +264,7 @@ rule noPrevIsHeadPreservedInsertSorted(address _id, uint256 _value) { invariant noNextIsTail(address addr) hasNoNextIsTail(addr) - filtered { f -> f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector } { preserved remove(address _id) { safeAssumptions(); requireInvariant twoWayLinked(_id, getNext(_id)); @@ -293,7 +293,7 @@ rule noNextisTailPreservedInsertSorted(address _id, uint256 _value) { invariant linkedIsInDLL(address addr) isLinked(addr) => isInDLL(addr) - filtered { f -> f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector } { preserved remove(address _id) { safeAssumptions(); requireInvariant twoWayLinked(_id, getNext(_id)); @@ -323,7 +323,7 @@ rule linkedIsInDllPreservedInsertSorted(address _id, uint256 _value) { invariant twoWayLinked(address first, address second) isTwoWayLinked(first, second) - filtered { f -> f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector } { preserved remove(address _id) { safeAssumptions(); requireInvariant twoWayLinked(getPrev(_id), _id); @@ -349,8 +349,8 @@ rule twoWayLinkedPreservedInsertSorted(address _id, uint256 _value) { invariant forwardLinked(address addr) isInDLL(addr) => isForwardLinkedBetween(getHead(), addr) - filtered { f -> f.selector != remove(address).selector && - f.selector != insertSorted(address, uint256, uint256).selector } + filtered { f -> f.selector != sig:remove(address).selector && + f.selector != sig:insertSorted(address, uint256, uint256).selector } rule forwardLinkedPreservedInsertSorted(address _id, uint256 _value) { address addr; address prev; diff --git a/certora/specs/permissions/Pausable.spec b/certora/specs/permissions/Pausable.spec index 9d57d4ffb..aaeb90fe5 100644 --- a/certora/specs/permissions/Pausable.spec +++ b/certora/specs/permissions/Pausable.spec @@ -1,29 +1,27 @@ methods { // external calls to PauserRegistry - isPauser(address) returns (bool) => DISPATCHER(true) - unpauser() returns (address) => DISPATCHER(true) + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); // envfree functions - paused() returns (uint256) envfree - paused(uint8 index) returns (bool) envfree - pauserRegistry() returns (address) envfree + function paused() external returns (uint256) envfree; + function paused(uint8 index) external returns (bool) envfree; + function pauserRegistry() external returns (address) envfree; // harnessed functions - isPauser(address) returns (bool) envfree - unpauser() returns (address) envfree - bitwise_not(uint256) returns (uint256) envfree - bitwise_and(uint256, uint256) returns (uint256) envfree + function isPauser(address) external returns (bool) envfree; + function unpauser() external returns (address) envfree; + function bitwise_not(uint256) external returns (uint256) envfree; + function bitwise_and(uint256, uint256) external returns (uint256) envfree; } rule onlyPauserCanPauseAndOnlyUnpauserCanUnpause() { method f; env e; uint256 pausedStatusBefore = paused(); - address pauser; - require(isPauser(pauser)); address unpauser = unpauser(); - if (f.selector == pause(uint256).selector) { + if (f.selector == sig:pause(uint256).selector) { uint256 newPausedStatus; pause(e, newPausedStatus); uint256 pausedStatusAfter = paused(); @@ -32,7 +30,7 @@ rule onlyPauserCanPauseAndOnlyUnpauserCanUnpause() { } else { assert(pausedStatusAfter == pausedStatusBefore, "pausedStatusAfter != pausedStatusBefore"); } - } else if (f.selector == pauseAll().selector) { + } else if (f.selector == sig:pauseAll().selector) { pauseAll(e); uint256 pausedStatusAfter = paused(); if (isPauser(e.msg.sender)) { @@ -42,7 +40,7 @@ rule onlyPauserCanPauseAndOnlyUnpauserCanUnpause() { } else { assert(pausedStatusAfter == pausedStatusBefore, "pausedStatusAfter != pausedStatusBefore"); } - } else if (f.selector == unpause(uint256).selector) { + } else if (f.selector == sig:unpause(uint256).selector) { uint256 newPausedStatus; unpause(e, newPausedStatus); uint256 pausedStatusAfter = paused(); diff --git a/certora/specs/pods/EigenPod.spec b/certora/specs/pods/EigenPod.spec new file mode 100644 index 000000000..17296dcfd --- /dev/null +++ b/certora/specs/pods/EigenPod.spec @@ -0,0 +1,245 @@ + +methods { + // Internal, NONDET-summarized EigenPod library functions + function _.verifyValidatorFields(bytes32, bytes32[] calldata, bytes calldata, uint40) internal => NONDET; + function _.verifyValidatorBalance(bytes32, bytes32, bytes calldata, uint40) internal => NONDET; + function _.verifyStateRootAgainstLatestBlockRoot(bytes32, bytes32, bytes calldata) internal => NONDET; + function _.verifyWithdrawal(bytes32, bytes32[] calldata, BeaconChainProofs.WithdrawalProof calldata) internal => NONDET; + + // Internal, NONDET-summarized "send ETH" function -- unsound summary used to avoid HAVOC behavior + // when sending ETH using `Address.sendValue()` + function _._sendETH(address recipient, uint256 amountWei) internal => NONDET; + + // summarize the deployment of EigenPods to avoid default, HAVOC behavior + function _.deploy(uint256, bytes32, bytes memory bytecode) internal => NONDET; + + //// External Calls + // external calls to DelegationManager + function _.undelegate(address) external => DISPATCHER(true); + function _.decreaseDelegatedShares(address,address,uint256) external => DISPATCHER(true); + function _.increaseDelegatedShares(address,address,uint256) external => DISPATCHER(true); + + // external calls from DelegationManager to ServiceManager + function _.updateStakes(address[]) external => NONDET; + + // external calls to Slasher + function _.isFrozen(address) external => DISPATCHER(true); + function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true); + function _.recordStakeUpdate(address,uint32,uint32,uint256) external => NONDET; + + // external calls to StrategyManager + function _.getDeposits(address) external => DISPATCHER(true); + function _.slasher() external => DISPATCHER(true); + function _.addShares(address,address,uint256) external => DISPATCHER(true); + function _.removeShares(address,address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true); + function _.migrateQueuedWithdrawal(IStrategyManager.DeprecatedStruct_QueuedWithdrawal) external => NONDET; + + // external calls to Strategy contracts + function _.deposit(address, uint256) external => NONDET; + function _.withdraw(address, address, uint256) external => NONDET; + + // external calls to EigenPodManager + function _.addShares(address,uint256) external => DISPATCHER(true); + function _.removeShares(address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true); + function _.podOwnerShares(address) external => DISPATCHER(true); + + // external calls to EigenPod + function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); + function _.stake(bytes, bytes, bytes32) external => DISPATCHER(true); + function _.initialize(address) external => DISPATCHER(true); + + // external calls to ETH2Deposit contract + function _.deposit(bytes, bytes, bytes, bytes32) external => NONDET; + + // external calls to DelayedWithdrawalRouter (from EigenPod) + function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); + + // external calls to PauserRegistry + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); + + // external calls to ERC20 token + function _.transfer(address, uint256) external => DISPATCHER(true); + function _.transferFrom(address, address, uint256) external => DISPATCHER(true); + function _.approve(address, uint256) external => DISPATCHER(true); + + // envfree functions + function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() external returns (uint64) envfree; + function withdrawableRestakedExecutionLayerGwei() external returns (uint64) envfree; + function nonBeaconChainETHBalanceWei() external returns (uint256) envfree; + function eigenPodManager() external returns (address) envfree; + function podOwner() external returns (address) envfree; + function hasRestaked() external returns (bool) envfree; + function mostRecentWithdrawalTimestamp() external returns (uint64) envfree; + function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external returns (IEigenPod.ValidatorInfo) envfree; + function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external returns (bool) envfree; + function validatorStatus(bytes32 pubkeyHash) external returns (IEigenPod.VALIDATOR_STATUS) envfree; + function delayedWithdrawalRouter() external returns (address) envfree; + function nonBeaconChainETHBalanceWei() external returns (uint256) envfree; + + // harnessed functions + function get_validatorIndex(bytes32 pubkeyHash) external returns (uint64) envfree; + function get_restakedBalanceGwei(bytes32 pubkeyHash) external returns (uint64) envfree; + function get_mostRecentBalanceUpdateTimestamp(bytes32 pubkeyHash) external returns (uint64) envfree; + function get_podOwnerShares() external returns (int256) envfree; + function get_withdrawableRestakedExecutionLayerGwei() external returns (uint256) envfree; + function get_ETH_Balance() external returns (uint256) envfree; +} + +// defines the allowed validator status transitions +definition validatorStatusTransitionAllowed(IEigenPod.VALIDATOR_STATUS statusBefore, IEigenPod.VALIDATOR_STATUS statusAfter) returns bool = + (statusBefore == IEigenPod.VALIDATOR_STATUS.INACTIVE && statusAfter == IEigenPod.VALIDATOR_STATUS.ACTIVE) + || (statusBefore == IEigenPod.VALIDATOR_STATUS.ACTIVE && statusAfter == IEigenPod.VALIDATOR_STATUS.WITHDRAWN); + +// verifies that only the 2 allowed transitions of validator status occur +rule validatorStatusTransitionsCorrect(bytes32 pubkeyHash) { + IEigenPod.VALIDATOR_STATUS statusBefore = validatorStatus(pubkeyHash); + method f; + env e; + calldataarg args; + f(e,args); + IEigenPod.VALIDATOR_STATUS statusAfter = validatorStatus(pubkeyHash); + assert( + (statusBefore == statusAfter) + || validatorStatusTransitionAllowed(statusBefore, statusAfter), + "disallowed validator status transition occurred" + ); +} + +// verifies that _validatorPubkeyHashToInfo[validatorPubkeyHash].mostRecentBalanceUpdateTimestamp can ONLY increase (or remain the same) +rule mostRecentBalanceUpdateTimestampOnlyIncreases(bytes32 validatorPubkeyHash) { + IEigenPod.ValidatorInfo validatorInfoBefore = validatorPubkeyHashToInfo(validatorPubkeyHash); + method f; + env e; + calldataarg args; + f(e,args); + IEigenPod.ValidatorInfo validatorInfoAfter = validatorPubkeyHashToInfo(validatorPubkeyHash); + assert(validatorInfoAfter.mostRecentBalanceUpdateTimestamp >= validatorInfoBefore.mostRecentBalanceUpdateTimestamp, + "mostRecentBalanceUpdateTimestamp decreased"); +} + +// verifies that if a validator is marked as 'INACTIVE', then it has no other entries set in its ValidatorInfo +invariant inactiveValidatorsHaveEmptyInfo(bytes32 pubkeyHash) + (validatorStatus(pubkeyHash) == IEigenPod.VALIDATOR_STATUS.INACTIVE) => ( + get_validatorIndex(pubkeyHash) == 0 + && get_restakedBalanceGwei(pubkeyHash) == 0 + && get_mostRecentBalanceUpdateTimestamp(pubkeyHash) == 0); + +// verifies that _validatorPubkeyHashToInfo[validatorPubkeyHash].validatorIndex can be set initially but otherwise can't change +// this can be understood as the only allowed transitions of index being of the form: 0 => anything (otherwise the index must stay the same) +rule validatorIndexSetOnlyOnce(bytes32 pubkeyHash) { + requireInvariant inactiveValidatorsHaveEmptyInfo(pubkeyHash); + uint64 validatorIndexBefore = get_validatorIndex(pubkeyHash); + // perform arbitrary function call + method f; + env e; + calldataarg args; + f(e,args); + uint64 validatorIndexAfter = get_validatorIndex(pubkeyHash); + assert(validatorIndexBefore == 0 || validatorIndexAfter == validatorIndexBefore, + "validator index modified from nonzero value"); +} + +// verifies that once a validator has its status set to WITHDRAWN, its ‘restakedBalanceGwei’ is *and always remains* zero +invariant withdrawnValidatorsHaveZeroRestakedGwei(bytes32 pubkeyHash) + (validatorStatus(pubkeyHash) == IEigenPod.VALIDATOR_STATUS.INACTIVE) => + (get_restakedBalanceGwei(pubkeyHash) == 0); + + +// // TODO: see if this draft rule can be salvaged +// // draft rule to capture the following behavior (or at least most of it): +// // The core invariant that ought to be maintained across the EPM and the EPs is that +// // podOwnerShares[podOwner] + sum(sharesInQueuedWithdrawals) = +// // sum(_validatorPubkeyHashToInfo[validatorPubkeyHash].restakedBalanceGwei) + withdrawableRestakedExecutionLayerGwei + +// // idea: if we ignore shares in queued withdrawals and rearrange, then we have: +// // sum(_validatorPubkeyHashToInfo[validatorPubkeyHash].restakedBalanceGwei) = +// // EigenPodManager.podOwnerShares(podOwner) - withdrawableRestakedExecutionLayerGwei +// // we can track changes to the '_validatorPubkeyHashToInfo' mapping and check this with ghost variables + +// based on Certora's example here https://github.com/Certora/Tutorials/blob/michael/ethcc/EthCC/Ghosts/ghostTest.spec +ghost mathint sumOfValidatorRestakedbalancesWei { + // NOTE: this commented out line is broken, as calling functions in axioms is currently disallowed, but this is what we'd run ideally. + // init_state axiom sumOfValidatorRestakedbalancesWei == to_mathint(get_podOwnerShares()) - to_mathint(get_withdrawableRestakedExecutionLayerGwei() * 1000000000); + + // since both of these variables are zero at construction, just set the ghost to zero in the axiom + init_state axiom sumOfValidatorRestakedbalancesWei == 0; +} + +hook Sstore _validatorPubkeyHashToInfo[KEY bytes32 validatorPubkeyHash].restakedBalanceGwei uint64 newValue (uint64 oldValue) { + sumOfValidatorRestakedbalancesWei = ( + sumOfValidatorRestakedbalancesWei + + to_mathint(newValue) * 1000000000 - + to_mathint(oldValue) * 1000000000 + ); +} + +rule consistentAccounting() { + // fetch info before call + int256 podOwnerSharesBefore = get_podOwnerShares(); + uint256 withdrawableRestakedExecutionLayerGweiBefore = get_withdrawableRestakedExecutionLayerGwei(); + uint256 eigenPodBalanceBefore = get_ETH_Balance(); + // filter down to valid pre-states + require(sumOfValidatorRestakedbalancesWei == + to_mathint(podOwnerSharesBefore) - to_mathint(withdrawableRestakedExecutionLayerGweiBefore)); + + // perform arbitrary function call + method f; + env e; + calldataarg args; + f(e,args); + + // fetch info after call + int256 podOwnerSharesAfter = get_podOwnerShares(); + uint256 withdrawableRestakedExecutionLayerGweiAfter = get_withdrawableRestakedExecutionLayerGwei(); + uint256 eigenPodBalanceAfter = get_ETH_Balance(); + /** + * handling for weird, unrealistic edge case where calling `initialize` causes the pod owner to change, so the + * call to `get_podOwnerShares` queries the shares for a different address. + * calling `initialize` should *not* change user shares, so it is unrealistic to simulate it doing so. + */ + if (f.selector == sig:initialize(address).selector) { + podOwnerSharesAfter = podOwnerSharesBefore; + } + // check post-state + // TODO: this check is still broken for `withdrawRestakedBeaconChainETH` since it does a low-level call to transfer the ETH, which triggers optimistic fallback dispatching + // special handling for one function + if (f.selector == sig:withdrawRestakedBeaconChainETH(address,uint256).selector) { + /* TODO: un-comment this once the dispatching is handled correctly + assert(sumOfValidatorRestakedbalancesWei == + to_mathint(podOwnerSharesAfter) - to_mathint(withdrawableRestakedExecutionLayerGweiAfter) + // adjustment term for the ETH balance of the contract changing + + to_mathint(eigenPodBalanceBefore) - to_mathint(eigenPodBalanceAfter), + "invalid post-state"); + */ + // TODO: delete this once the above is salvaged (was added since CVL forbids empty blocks) + assert(true); + // outside of special case, we don't need the adjustment term + } else { + assert(sumOfValidatorRestakedbalancesWei == + to_mathint(podOwnerSharesAfter) - to_mathint(withdrawableRestakedExecutionLayerGweiAfter), + "invalid post-state"); + } +} + +/* +rule baseInvariant() { + int256 podOwnerSharesBefore = get_podOwnerShares(); + // perform arbitrary function call + method f; + env e; + calldataarg args; + f(e,args); + int256 podOwnerSharesAfter = get_podOwnerShares(); + mathint podOwnerSharesDelta = podOwnerSharesAfter - podOwnerSharesBefore; + assert(sumOfValidatorRestakedbalancesWei == podOwnerSharesDelta - to_mathint(get_withdrawableRestakedExecutionLayerGwei()), + "base invariant violated"); +} + +invariant consistentAccounting() { + sumOfValidatorRestakedbalancesWei == + to_mathint(get_withdrawableRestakedExecutionLayerGwei()) - to_mathint(get_withdrawableRestakedExecutionLayerGwei()); +} +*/ \ No newline at end of file diff --git a/certora/specs/pods/EigenPodManager.spec b/certora/specs/pods/EigenPodManager.spec new file mode 100644 index 000000000..37bdc4182 --- /dev/null +++ b/certora/specs/pods/EigenPodManager.spec @@ -0,0 +1,98 @@ + +methods { + //// External Calls + // external calls to DelegationManager + function _.undelegate(address) external; + function _.decreaseDelegatedShares(address,address,uint256) external; + function _.increaseDelegatedShares(address,address,uint256) external; + + // external calls from DelegationManager to ServiceManager + function _.updateStakes(address[]) external => NONDET; + + // external calls to Slasher + function _.isFrozen(address) external => DISPATCHER(true); + function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true); + + // external calls to StrategyManager + function _.getDeposits(address) external => DISPATCHER(true); + function _.slasher() external => DISPATCHER(true); + function _.addShares(address,address,uint256) external => DISPATCHER(true); + function _.removeShares(address,address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true); + + // external calls to EigenPodManager + function _.addShares(address,uint256) external => DISPATCHER(true); + function _.removeShares(address,uint256) external => DISPATCHER(true); + function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true); + + // external calls to EigenPod + function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); + + // external calls to DelayedWithdrawalRouter (from EigenPod) + function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); + + // external calls to PauserRegistry + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); + + // envfree functions + function ownerToPod(address podOwner) external returns (address) envfree; + function getPod(address podOwner) external returns (address) envfree; + function ethPOS() external returns (address) envfree; + function eigenPodBeacon() external returns (address) envfree; + function beaconChainOracle() external returns (address) envfree; + function getBlockRootAtTimestamp(uint64 timestamp) external returns (bytes32) envfree; + function strategyManager() external returns (address) envfree; + function slasher() external returns (address) envfree; + function hasPod(address podOwner) external returns (bool) envfree; + function numPods() external returns (uint256) envfree; + function podOwnerShares(address podOwner) external returns (int256) envfree; + function beaconChainETHStrategy() external returns (address) envfree; + + // harnessed functions + function get_podOwnerShares(address) external returns (int256) envfree; + function get_podByOwner(address) external returns (address) envfree; +} + +// verifies that podOwnerShares[podOwner] is never a non-whole Gwei amount +invariant podOwnerSharesAlwaysWholeGweiAmount(address podOwner) + get_podOwnerShares(podOwner) % 1000000000 == 0; + +// verifies that ownerToPod[podOwner] is set once (when podOwner deploys a pod), and can otherwise never be updated +rule podAddressNeverChanges(address podOwner) { + address podAddressBefore = get_podByOwner(podOwner); + // perform arbitrary function call + method f; + env e; + calldataarg args; + f(e,args); + address podAddressAfter = get_podByOwner(podOwner); + assert(podAddressBefore == 0 || podAddressBefore == podAddressAfter, + "pod address changed after being set!"); +} + +// verifies that podOwnerShares[podOwner] can become negative (i.e. go from zero/positive to negative) +// ONLY as a result of a call to `recordBeaconChainETHBalanceUpdate` +rule limitationOnNegativeShares(address podOwner) { + int256 podOwnerSharesBefore = get_podOwnerShares(podOwner); + // perform arbitrary function call + method f; + env e; + calldataarg args; + f(e,args); + int256 podOwnerSharesAfter = get_podOwnerShares(podOwner); + if (podOwnerSharesAfter < 0) { + if (podOwnerSharesBefore >= 0) { + assert(f.selector == sig:recordBeaconChainETHBalanceUpdate(address, int256).selector, + "pod owner shares became negative from calling an unqualified function!"); + } else { + assert( + (podOwnerSharesAfter >= podOwnerSharesBefore) || + (f.selector == sig:recordBeaconChainETHBalanceUpdate(address, int256).selector), + "pod owner had negative shares decrease inappropriately" + ); + } + } + // need this line to keep the prover happy :upside_down_face: + assert(true); +} diff --git a/certora/specs/properties.md b/certora/specs/properties.md deleted file mode 100644 index 8032c7e27..000000000 --- a/certora/specs/properties.md +++ /dev/null @@ -1,48 +0,0 @@ -Author: Yura Sherman - - - -## Withdrawal - -- Cannot withdraw full funds if slashed -- Cannot withdraw funds without appropriate delay -- Cannot withdraw funds which are at risk of slashing -- Cannot withdraw funds if middlewares haven't been updated (recording the incoming decrease in funds) -- A queued withdrawal can be completed if it's pending and no longer slashable -- A queued withdrawal can still be slashed - -## Slashing - -- slashing happens if and only if a provably malicious action by an operator took place -- operator may be slashed only if allowToSlash() for that particular contract was called -- slashing cannot happen after contractCanSlashOperatorUntil[operator][contractAddress] timestamp -- contractCanSlashOperatorUntil[operator][contractAddress] changed => allowToSlash() or recordLastStakeUpdateAndRevokeSlashingAbility() was called -- recordLastStakeUpdateAndRevokeSlashingAbility() should only be callable when contractCanSlashOperatorUntil[operator][contractAddress] == MAX_CAN_SLASH_UNTIL, and only by the contractAddress -- Any contractAddress for which contractCanSlashOperatorUntil[operator][contractAddress] > current time can call freezeOperator(operator). -- frozen operator cannot make deposits/withdrawals, cannot complete queued withdrawals -- slashing and unfreezing is performed by the StrategyManager contract owner (is it permanent or configurable?) -- frozenStatus[operator] changed => freezeOperator() or resetFrozenStatus() were called - - -## StrategyManager - -- totalShares per strategy == Σ stakerStrategyShares[staker][strategy] for all stakers *plus* any shares in pending (queued) withdrawals -- stakerStrategyShares[staker][strategy] increase => depositIntoStrategy() or depositIntoStrategyWithSignature() have been invoked -- stakerStrategyShares[staker][strategy] decrease => queueWithdrawal() or slashShares() have been invoked -- stakerStrategyList[staker] should contain all strategies for which stakerStrategyShares[staker][strategy] is nonzero -- stakerStrategyList[staker] should contain no strategies for which stakerStrategyShares[staker][strategy] is zero - -## Strategy - -- balance of underlyingToken >= total supply of shares ( depends on how slashing works ?) - -## Delegation - -- a staker must be either registered as an operator or delegate to an operator -- after registerAsOperator() is called, delegationTerms[operator] != 0 -- for an operator, delegatedTo[operator] == operator (operators are delegated to themselves) -- operatorShares[operator][strategy] should increase only when delegateTo() delegateToBySignature(), or increaseDelegatedShares() is called -- operatorShares[operator][strategy] should decrease only when either of the two decreaseDelegatedShares() is called -- sum of operatorShares[operator][strategy] for all operators <= sum of StrategyManager.stakerStrategyShares[staker][strategy] - -- undelegate is only possible by queueing withdrawals for all of their deposited assets. diff --git a/certora/specs/strategies/StrategyBase.spec b/certora/specs/strategies/StrategyBase.spec index fc0110687..0f7ab5e55 100644 --- a/certora/specs/strategies/StrategyBase.spec +++ b/certora/specs/strategies/StrategyBase.spec @@ -1,29 +1,29 @@ -using StrategyManager as strategyManager +using StrategyManager as strategyManager; methods { // external calls to StrategyManager - stakerStrategyShares(address, address) returns (uint256) => DISPATCHER(true) + function _.stakerStrategyShares(address, address) external => DISPATCHER(true); // external calls to PauserRegistry - pauser() returns (address) => DISPATCHER(true) - unpauser() returns (address) => DISPATCHER(true) + function _.isPauser(address) external => DISPATCHER(true); + function _.unpauser() external => DISPATCHER(true); // external calls to ERC20 - balanceOf(address) returns (uint256) => DISPATCHER(true) - transfer(address, uint256) returns (bool) => DISPATCHER(true) - transferFrom(address, address, uint256) returns (bool) => DISPATCHER(true) + function _.balanceOf(address) external => DISPATCHER(true); + function _.transfer(address, uint256) external => DISPATCHER(true); + function _.transferFrom(address, address, uint256) external => DISPATCHER(true); // external calls from StrategyManager to Slasher - isFrozen(address) returns (bool) => DISPATCHER(true) - canWithdraw(address,uint32,uint256) returns (bool) => DISPATCHER(true) + function _.isFrozen(address) external => DISPATCHER(true); + function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true); // envfree functions - totalShares() returns (uint256) envfree - underlyingToken() returns (address) envfree - sharesToUnderlyingView(uint256) returns (uint256) envfree - sharesToUnderlying(uint256) returns (uint256) envfree - underlyingToSharesView(uint256) returns (uint256) envfree - underlyingToShares(uint256) returns (uint256) envfree - shares(address) returns (uint256) envfree + function totalShares() external returns (uint256) envfree; + function underlyingToken() external returns (address) envfree; + function sharesToUnderlyingView(uint256) external returns (uint256) envfree; + function sharesToUnderlying(uint256) external returns (uint256) envfree; + function underlyingToSharesView(uint256) external returns (uint256) envfree; + function underlyingToShares(uint256) external returns (uint256) envfree; + function shares(address) external returns (uint256) envfree; } // // idea based on OpenZeppelin invariant -- see https://github.com/OpenZeppelin/openzeppelin-contracts/blob/formal-verification/certora/specs/ERC20.spec#L8-L22 diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 000000000..422b19445 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1 @@ +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/docs/EigenLayer-delegation-flow.md b/docs/EigenLayer-delegation-flow.md deleted file mode 100644 index 13c775867..000000000 --- a/docs/EigenLayer-delegation-flow.md +++ /dev/null @@ -1,31 +0,0 @@ - -# Delegation Flow - -While delegating to an operator is designed to be a simple process from the staker's perspective, a lot happens "under the hood". - -## Operator Registration - -In order to be delegated *to*, an operator must have first called `DelegationManager.registerAsOperator`. If a staker tries to delegate to someone who has not previously registered as an operator, their transaction will fail. - -When an operator registers in EigenLayer, the following flow of calls between contracts occurs: - -![Registering as an Operator in EigenLayer](images/EL_operator_registration.png?raw=true "Registering as an Operator in EigenLayer") - -1. The would-be operator calls `DelegationManager.registerAsOperator`, providing either a `DelegationTerms`-type contract or an EOA as input. The DelegationManager contract stores the `DelegationTerms`-type contract provided by the operator, which may act as an intermediary to help facilitate the relationship between the operator and any stakers who delegate to them. -All of the remaining steps (2-4) proceed as outlined in the delegation process below; the DelegationManager contract treats things as if the operator has delegated *to themselves*. - -## Staker Delegation - -For a staker to delegate to an operator, the staker must either: -1. Call `DelegationManager.delegateTo` directly -OR -2. Supply an appropriate ECDSA signature, which can then be submitted by the operator (or a third party) as part of a call to `DelegationManager.delegateToBySignature` - -In either case, the end result is the same, and the flow of calls between contracts looks identical: - -![Delegating in EigenLayer](images/EL_delegating.png?raw=true "Delegating in EigenLayer") - -1. As outlined above, either the staker themselves calls `DelegationManager.delegateTo`, or the operator (or a third party) calls `DelegationManager.delegateToBySignature`, in which case the DelegationManager contract verifies the provided ECDSA signature -2. The DelegationManager contract calls `Slasher.isFrozen` to verify that the operator being delegated to is not frozen -3. The DelegationManager contract calls `StrategyManager.getDeposits` to get the full list of the staker (who is delegating)'s deposits. It then increases the delegated share amounts of operator (who is being delegated to) appropriately -4. The DelegationManager contract makes a call into the operator's stored `DelegationTerms`-type contract, calling the `onDelegationReceived` function to inform it of the new delegation \ No newline at end of file diff --git a/docs/EigenLayer-deposit-flow.md b/docs/EigenLayer-deposit-flow.md deleted file mode 100644 index bc79e15a2..000000000 --- a/docs/EigenLayer-deposit-flow.md +++ /dev/null @@ -1,41 +0,0 @@ - -# Deposit Flow - -There are 2 main ways in which a staker can deposit new funds into EigenLayer -- depositing into an Strategy through the StrategyManager, and depositing "Beacon Chain ETH" (or proof thereof) through the EigenPodManager. - -## Depositing Into an Strategy Through the StrategyManager -The StrategyManager has two functions for depositing funds into Strategy contracts -- `depositIntoStrategy` and `depositIntoStrategyWithSignature`. In both cases, a specified `amount` of an ERC20 `token` is transferred from the caller to a specified Strategy-type contract `strategy`. New shares in the strategy are created according to the return value of `strategy.deposit`; when calling `depositIntoStrategy` these shares are credited to the caller, whereas when calling `depositIntoStrategyWithSignature` the new shares are credited to a specified `staker`, who must have also signed off on the deposit (this enables more complex, contract-mediated deposits, while a signature is required to mitigate the possibility of griefing or dusting-type attacks). -We note as well that deposits cannot be made to a 'frozen' address, i.e. to the address of an operator who has been slashed or to a staker who is actively delegated to a slashed operator. -When performing a deposit through the StrategyManager, the flow of calls between contracts looks like the following: - -![Depositing Into EigenLayer Through the StrategyManager -- Contract Flow](images/EL_depositing.png?raw=true "Title") - -1. The depositor makes the initial call to either `StrategyManager.depositIntoStrategy` or `StrategyManager.depositIntoStrategyWithSignature` -2. The StrategyManager calls `Slasher.isFrozen` to verify that the recipient (either the caller or the specified `staker` input) is not 'frozen' on EigenLayer -3. The StrategyManager calls the specified `token` contract, transferring specified `amount` of tokens from the caller to the specified `strategy` -4. The StrategyManager calls `strategy.deposit`, and then credits the returned `shares` value to the recipient -5. The StrategyManager calls `DelegationManager.increaseDelegatedShares` to ensure that -- if the recipient has delegated to an operator -- the operator's delegated share amounts are updated appropriately - -## Depositing Beacon Chain ETH Through the EigenPodManager -This section covers depositing *new ETH* into the Beacon Chain, with withdrawal credentials pointed to an EigenLayer-controlled contract (an EigenPod) and proving your deposit so it is credited in EigenLayer; this is a multi-step process. For more details on the EigenPods' design in general, see the [EigenPods doc](./EigenPods.md). - -The initial deposit of ETH into the Beacon Chain is performed through the EigenPodManager: - -![Depositing ETH Into the Beacon Chain Through the EigenPodManager](images/EL_depositing_BeaconChainETH.png?raw=true "Title") - -1. The depositor calls `EigenPodManager.stake` -2. The EigenPodManager deploys a new EigenPod for the caller – if they do not already have one – and then calls `EigenPod.stake` -3. The EigenPod deposits ETH into the Beacon Chain through the "ETH2 Deposit Contract". The deposited ETH was supplied as part of the initial call (1), which was passed along to the EigenPod by the EigenPodManager in its own call (2) - -After depositing ETH, the depositor waits for the Beacon Chain state root to be updated through EigenLayer's BeaconChainOracle. After an update has been posted that reflects the EigenPod's increased Beacon Chain balance (resulting from the deposit above), then the depositor can call `EigenPod.verifyWithdrawalCredentials` to initiate the following flow: - -![Depositing ETH Into the Beacon Chain Through the EigenPodManager Part 2](images/EL_depositing_BeaconChainETH_2.png?raw=true "Title") - -1. The depositor calls EigenPod.verifyWithdrawalCredentials on the EigenPod deployed for them above -2. The EigenPod gets the most recent Beacon Chain state root from the EigenPodManager by calling `EigenPodManager.getBeaconChainStateRoot` (the EigenPodManager further passes this query along to the BeaconChainOracle, prior to returning the most recently-posted state root). -3. The EigenPod calls `EigenPodManager.updateBeaconChainBalance` to update the EigenPodManager's accounting of EigenPod balances -4. The EigenPodManager fetches the Slasher's address from the StrategyManager -4. *If the operator has been slashed on the Beacon Chain* (and this is reflected in the latest BeaconChainOracle update), then the EigenPodManager calls `Slasher.freezeOperator` to freeze the staker -5. The EigenPod calls `EigenPodManager.depositBeaconChainETH` to trigger an update in EigenLayer which will reflect the staker's new beacon chain balance -6. The EigenPodManager forwards the information through a call to `StrategyManager.depositBeaconChainETH`, which updates the staker's balance in the enshrined 'beaconChainETHStrategy' after... -7. The StrategyManager makes a call to `Slasher.isFrozen` to verify that the depositor is not 'frozen' in EigenLayer diff --git a/docs/EigenLayer-tech-spec.md b/docs/EigenLayer-tech-spec.md deleted file mode 100644 index 74ad2fbbd..000000000 --- a/docs/EigenLayer-tech-spec.md +++ /dev/null @@ -1,127 +0,0 @@ - -# EigenLayer Technical Specification - -## Overview -EigenLayer is a set of smart contracts deployed on Ethereum that enable restaking of assets to secure new services. -**Restaking** is the process of staking an asset that has already been staked in another protocol into EigenLayer. The canonical example of restaking is ETH restaking, in which an existing Ethereum validator restakes the ETH they have staked to secure Ethereum Proof-of-Stake consensus, but restaking also encompasses actions such as depositing Liquid Staked Tokens into EigenLayer. -**Restaked assets** are placed under the control of EigenLayer’s smart contracts, enabling them to act as stake securing additional services, such as rollups, bridges, and data availability networks. -EigenLayer connects stakers who are willing to provide these additional services to consumers – typically protocols or companies – who want secure services with decentralized validator networks. These consumers pay for the services delivered to them, enabling stakers to earn returns on their staked assets, *in addition* to their existing staking rewards. Thus with restaking, stakers can augment their rewards in exchange for the services they opt-in to providing. - -These returns provide an economic incentive for stakers to opt-in and act as “operators” for services. In order to disincentivize malicious actions and deliver *cryptoeconomic security* to services, services built on EigenLayer also impose **slashing conditions** in which provably bad behavior is punished, through the 'slashing' of malicious operators' deposited funds. - -EigenLayer is built to be permissionless – anyone can join as a staker, consume a service, or even create their own service – with no external approval acquired. We term this **open innovation**. Being an operator for any service on EigenLayer is strictly **opt-in**. Stakers can choose to serve a single service, many (compatible) services, or simply delegate their stake to an operator *whom they trust to not get slashed*, that can earn rewards using the staker's restaked assets (and presumably somehow share the rewards). - -New services built on EigenLayer can define their own, arbitrary *slashing conditions*, which allows services to potentially slash their operators for any action that is **on-chain checkable**. In particular, this is compatible with the permissionless ability to launch a new service on EigenLayer only because all services are opt-in; if a staker believes a service has an unsafe slashing mechanism, then they can simply not opt-in to serving that application. - -## Actors in the System - -### Stakers -A **staker** is any party who has assets deposited into EigenLayer. In general, these could be any mix of ERC20 tokens and/or staked ETH itself (deposited by transferring withdrawal credentials to EigenLayer or depositing to the Beacon Chain through EigenLayer). Stakers can delegate their stake to an operator, or act as an operator themselves. - -### Operators -**Operators** in EigenLayer are those users who actually run the software built on top of EigenLayer. Operators register in EigenLayer, allowing stakers to delegate to them, and then opt-in to any mix of services built on top of EigenLayer; each service that an operator chooses to serve may impose its own slashing conditions on the operator. - -### Watchers -**NOTE: at present, EigenLayer does not feature any optimistically rolled up claims. This paragraph reflects a potential future state of the system.** - -Some operations in EigenLayer are "**optimisitically rolled up**". This is a design pattern used where it is either impossible or infeasible to prove that some claim is true, but *easy to check a counterexample that proves the claim is false*. The general pattern is: -1. A "rolled-up" claim is made, asserting that some condition is true. -2. There is a "fraudproof period", during which anyone can *disprove* the claim with a single counterexample. If a claim is disproven, then the original claimant is punished in some way (e.g. by forfeiting some amount or being slashed). -3. If the claim is *not* disproved during the fraudproof period, then it is assumed to be true, and the system proceeds from this assumption. - -**Watchers** are parties who passively observe these "rolled up" claims, and step in only in the case of an invalid or false claim. In such a case, an honest watcher will perform the fraudproof, disproving the claim. - -### Services / Middleware -We refer to software built on top of EigenLayer as either **services** or **middleware**. Since we anticipate a wide variety of services built on top of EigenLayer, the EigenLayer team has endeavored to make a minimal amount of assumptions about the struture of services. - -## Key Assumptions -### Discretization of Services ("Tasks") -We assume that services manage **tasks**. In other words, we assume that services discretize commitments undertaken by operators, with each task defining the time period for which the service's operators' stakes are placed "at stake", i.e. potentially subject to slashing. - -### Delegation "Trust Network" Structure -It is assumed that any staker who delegates their stake to an operator is in the same "trust network" as their chosen operator. In other words, the Staker-DelegatedOperator relationship is assumed to have a significant *trust component*. Operators may have the ability to steal the rewards that they earn from the deposited funds of stakers who delegate to them, as well as imposing other negative externalities on those delegated to them. - -### Non-Compromise of Trusted Roles -We assume that all trusted roles (multisigs, etc) remain solely in the hands of honest parties. - -### Honest Watcher Assumption -**NOTE: at present, EigenLayer does not feature any optimistically rolled up claims. This paragraph reflects a potential future state of the system.** - -For any "optimistically-rolled-up" process that relies on fraudproofs (i.e. in which someone makes an "optimistic claim" that can then be *disproven* within some window, and is otherwise treated as true), we **assume there is at least one honest watcher** who will step in to fraudproof false claims when they are made. -We assume that such an honest watcher will fraudproof *all false claims*, regardless of the size and independent of any financial incentive that may or may not be present for the watcher. -Efforts have been made to relax this assumption, but work is still ongoing. - -## Overview of Contracts -The `StrategyManager` contract is the primary coordinator for inflows and outflows of tokens to/from EigenLayer itself. The StrategyManager hands restaked assets over to `Strategy` contracts, which may perform targeted management of restaked assets in order to earn returns outside of EigenLayer (e.g. by lending the assets out on a lending protocol) -- more details on `Strategies` to follow. - -Any staker in EigenLayer can choose *either* to register as an operator *or* to delegate their restaked assets to an existing operator. These actions are performed on the `DelegationManager` contract. - -Withdrawals and undelegation are handled through the `StrategyManager`. Both *necessitate delays*, since it is infeasible to immediately know whether or not specific restaked funds are "at stake" on any existing tasks created by services. Instead, stakers who wish to withdraw and/or undelegate must go through a *queued withdrawal* process, in which they: -1. Begin the withdrawal, signaling that the funds they are withdrawing should no longer be placed "at stake" on new tasks. -2. Push any necessary updates to middlewares (or wait for someone else to do so), recording the decrease in funds to be placed at stake on new tasks. -3. Complete their withdrawal after an appropriate delay, i.e. once all tasks have been completed upon which the to-be-withdrawn funds were placed at stake. - -## Contract-Specific Overview - -### StrategyManager -The StrategyManager contract keeps track of all stakers’ deposits, in the form of “shares” in the Strategy contracts. Stakers who wish to deposit ERC20 tokens can do so by calling the StrategyManager, which will transfer the depositor’s tokens to a user-specified Strategy contract, which in turn manages the tokens to generate rewards in the deposited token (or just passively holds them, if the depositor is risk-averse or if the token lacks good reward-generating opportunities). - -As the arbiter of share amounts, the StrategyManager is also the main interaction point for withdrawals from EigenLayer. In general, withdrawals from EigenLayer must ensure that restaked assets cannot be withdrawn until they are no longer placed at risk of slashing by securing some service on EigenLayer. To accomplish this, EigenLayer enforces "guaranteed stake updates on withdrawals". The full withdrawal process is outlined in [the withdrawal flow doc](./EigenLayer-withdrawal-flow.md). - -Lastly, the StrategyManager processes slashing actions, in which some (or all) of a user's shares are transferred to a specified address. Slashing of this kind should only ever occur as the result of an operator taking a provably malicious action. - -## Strategy(s) -Each `Strategy` contract is expected to manage a single, underlying ERC20 token, known as the `underlyingToken`. Each user's holdings in the strategy is expected to be reflected in a number of `shares`, and the strategy is expected to define methods for converting between an amount of underlying tokens and an amount of shares (and vice versa), somewhat similar to an [ERC4626 Vault](https://eips.ethereum.org/EIPS/eip-4626) but without most of the tokenizing aspects of EIP-4626 (e.g. no `transfer` or `transferFrom` functions are expected). -Assets *may* be depositable or withdrawable to a single `Strategy` contract in multiple forms, and the strategy *may* either actively or passively manage the funds. -Since individual users' share amounts are stored in the `StrategyManager` itself, it is generally expected that each strategy's `deposit` and `withdraw` functions are restricted to only be callable by the `StrategyManager` itself. - -### DelegationManager -The DelegationManager contract handles delegation of stakers’ deposited funds to “operators”, who actually serve the applications built on EigenLayer. While delegation to someone else is entirely optional, any operator on EigenLayer must also "register as an operator" by calling the `registerAsOperator` function of this contract. - -Any staker in EigenLayer may choose to become *either*: -1. an **operator**, allowing other stakers to delegate to them, and potentially earning a share of the funds generated from using the restaked assets of stakers who delegate to them - -OR - -2. a **delegator**, choosing to allow an operator to use their restaked assets in securing applications built on EigenLayer - -Stakers can choose which path they’d like to take by interacting with the DelegationManager contract. Stakers who wish to delegate select an operator whom they trust to use their restaked assets to serve applications, while operators register to allow others to delegate to them, specifying a `DelegationTerms`-type contract (or EOA) which receives the funds they earn and can potentially help to mediate their relationship with any stakers who delegate to them. - -#### Storage in DelegationManager - -The `DelegationManager` contract relies heavily upon the `StrategyManager` contract. It keeps track of all active operators -- specifically by storing the `Delegation Terms` for each operator -- as well as storing what operator each staker is delegated to. -A **staker** becomes an **operator** by calling `registerAsOperator`. Once registered as an operator, the mapping entry `delegationTerms[operator]` is set **irrevocably** -- in fact we define someone as an operator if `delegationTerms[operator]` returns a nonzero address. Querying `delegationTerms(operator)` returns a `DelegationTerms`-type contract; however, the returned address may be an EOA, in which case the operator is assumed to handle payments through more "trusted" means, such as by doing off-chain computations and separate distributions. -The mapping `delegatedTo` stores which operator each staker is delegated to. Querying `delegatedTo(staker)` will return the *address* of the operator that `staker` is delegated to. Note that operators are *always considered to be delegated to themselves*. - -DelegationManager defines when an operator is delegated or not, as well as defining what makes someone an operator: -* someone who has registered as an operator *once* is *always* considered to be an operator -* an **operator** is considered to be 'delegated' to themself upon registering as an operator - -Similar to withdrawals, **undelegation** in EigenLayer necessitates a delay or clawback mechanism. To elaborate: if a staker is delegated to an operator, and that operator places the staker's assets 'at stake' on some task in which the operator *misbehaves* (i.e. acts in a slashable manner), it is critical that the staker's funds can still be slashed -* stakers can only undelegate by queuing withdrawal(s) for *all of their assets currently deposited in EigenLayer*, ensuring that all existing tasks for which the staker's currently deposited assets are actively at stake are resolved prior to allowing a different operator to place those same assets at stake on other tasks - -### Slasher -The `Slasher` contract is the central point for slashing in EigenLayer. -Operators can opt-in to slashing by arbitrary contracts by calling the function `allowToSlash`. A contract with slashing permission can itself revoke its slashing ability *after a specified time* -- named `serveUntil` in the function input -- by calling `recordLastStakeUpdateAndRevokeSlashingAbility`. The time until which `contractAddress` can slash `operator` is stored in `contractCanSlashOperatorUntil[operator][contractAddress]` as a uint32-encoded UTC timestamp, and is set to the `MAX_CAN_SLASH_UNTIL` (i.e. max value of a uint32) when `allowToSlash` is initially called. - -At present, slashing in EigenLayer is a multi-step process. When a contract wants to slash an operator, it will call the `freezeOperator` function. Any `contractAddress` for which `contractCanSlashOperatorUntil[operator][contractAddress]` is *strictly greater than the current time* can call `freezeOperator(operator)` and trigger **freezing** of the operator. An operator who is frozen -- *and any staker delegated to them* cannot make new deposits or withdrawals, and cannot complete queued withdrawals, as being frozen signals detection of malicious action and they may be subject to slashing. At present, slashing itself is performed by the owner of the `StrategyManager` contract, who can also 'unfreeze' accounts. - -### EigenPodManager -The `EigenPodManager` contract is designed to handle Beacon Chain ETH being staked on EigenLayer. Specifically, it is designed around withdrawal credentials pointed directly to the EigenLayer contracts, i.e. primarily those of "solo stakers". The EigenPodManager creates new EigenPod contracts, and coordinates virtual deposits and withdrawals of shares in an enshrined `beaconChainETH` strategy to and from the StrategyManager. More details on the EigenPodManager and EigenPod contracts can be found in the dedicated [EigenPod Doc](./EigenPods.md). - -### EigenPods -Each staker can deploy a single `EigenPod` contract through the EigenPodManager that allows them to stake ETH into the Beacon Chain and restake their deposits on EigenLayer. A watcher can also prove that an Ethereum validator that is restaked on an EigenPod has a lower balance on the Beacon Chain than its stake in EigenLayer. Finally, EigenPods also facilitate the execution of withdrawals of partially withdrawn rewards from the Beacon Chain on behalf of validators (a major upgrade in the upcoming Capella consensus layer hardfork). Calls are -- in general -- passed from the EigenPod to the EigenPodManager to the StrategyManager, to trigger additional accounting logic within EigenLayer. -EigenPods are deployed using a beacon proxy pattern, allowing simultaneous upgrades of all EigenPods. This upgradeability will likely be necessary in order to more fully integrate Beacon Chain withdrawals through the EigenPods, e.g. if Ethereum upgrades to smart contract-triggered withdrawals. - -### BeaconChainOracle -This contract will post periodic Beacon Chain state root updates, for consumption by the EigenPod contracts. -Details TBD. - -## High-Level Goals (And How They Affect Design Decisions) -1. Anyone can launch a new service on EigenLayer, permissionlessly - * all services are opt-in by design, so operators can simply choose to not serve a malicious application - * operators must signal *specific contracts* that can slash them, potentially limiting the damage that can be done, e.g. by a malicious or poorly-written upgrade to a service's smart contracts -2. Stakers should *not* be able to withdraw any stake that is "active" on a service - * assuming that services use a "task-denominated" model helps to enable this paradigm - * the queued withdrawal mechanism is designed to first stop the withdrawn funds from being placed at stake on new tasks, and then to verify when the funds are indeed no longer at stake - * the undelegation process enforces similar delays -- it is only possible for a staker to undelegate by queuing a withdrawal for all of their assets currently deposited in EigenLayer diff --git a/docs/EigenLayer-withdrawal-flow.md b/docs/EigenLayer-withdrawal-flow.md deleted file mode 100644 index cd95d0820..000000000 --- a/docs/EigenLayer-withdrawal-flow.md +++ /dev/null @@ -1,37 +0,0 @@ - -# Withdrawal Flow - -Withdrawals from EigenLayer are a multi-step process. This is necessary in order to ensure that funds can only be withdrawn once they are no longer placed 'at stake' on an active task of a service built on top of EigenLayer. For more details on the design of withdrawals and how they guarantee this, see the [Withdrawals Design Doc](./Guaranteed-stake-updates.md). - -The first step of any withdrawal involves "queuing" the withdrawal itself. The staker who is withdrawing their assets can specify the Strategy(s) they would like to withdraw from, as well as the respective amount of shares to withdraw from each of these strategies. Additionally, the staker can specify the address that will ultimately be able to withdraw the funds. Being able to specify an address different from their own allows stakers to "point their withdrawal" to a smart contract, which can potentially facilitate faster/instant withdrawals in the future. - -## Queueing a Withdrawal - -![Queuing a Withdrawal](images/EL_queuing_a_withdrawal.png?raw=true "Queuing a Withdrawal") - -1. The staker starts a queued withdrawal by calling the `StrategyManager.queueWithdrawal` function. They set the receiver of the withdrawn funds as `withdrawer` address. Calling `queueWithdrawal` also removes the user's shares in staker-specific storage and the corresponding shares delegated to the operator. Shares in the strategies being withdrawn from, however, technically remain (i.e. the total number of shares in each strategy does not change). This ensures that the value per share reported by each strategy will remain consistent, and that the shares will continue to accrue gains (or losses!) from any strategy management until the withdrawal is completed. -2. Prior to actually performing the above processing, the StrategyManager calls `Slasher.isFrozen` to ensure that the staker is not 'frozen' in EigenLayer (due to them or the operator they delegate to being slashed). -3. The StrategyManager calls `DelegationManager.decreaseDelegatedShares` to account for any necessary decrease in delegated shares (the DelegationManager contract will not modify its storage if the staker is not an operator and not actively delegated to one). -4. The StrategyManager queries `DelegationManager.delegatedTo` to get the account that the caller is *currently delegated to*. A hash of the withdrawal's details – including the account that the caller is currently delegated to – is stored in the StrategyManager, to record that the queued withdrawal has been created and to store details which can be checked against when the withdrawal is completed. -5. If the the staker is withdrawing *all of their shares currently in EigenLayer, and they set the `undelegateIfPossible` input to 'true'*, then the staker will be immediately 'undelegated' from the operator who they are currently delegated to; this is accomplished through the StrategyManager making a call to `DelegationManager.undelegate`. This allows the staker to immediately change their delegation to a different operator if desired; in such a case, any *new* deposits by the staker will immediately be delegated to the new operator, while the withdrawn funds will be 'in limbo' until the withdrawal is completed. - -## Completing a Queued Withdrawal - -![Completing a Queued Withdrawal](images/EL_completing_queued_withdrawal.png?raw=true "Completing a Queued Withdrawal") - -1. The withdrawer completes the queued withdrawal after the stake is inactive, by calling `StrategyManager.completeQueuedWithdrawal`. They specify whether they would like the withdrawal in shares (to be redelegated in the future) or in tokens (to be removed from the EigenLayer platform), through the `withdrawAsTokens` input flag. The withdrawer must also specify an appropriate `middlewareTimesIndex` which proves that the withdrawn funds are no longer at stake on any active task. The appropriate index can be calculated off-chain and checked using the `Slasher.canWithdraw` function. For more details on this design, see the [Withdrawals Design Doc](./Guaranteed-stake-updates.md). -2. The StrategyManager calls `Slasher.isFrozen` to ensure that the staker who initiated the withdrawal is not 'frozen' in EigenLayer (due to them or the operator they delegate to being slashed). In the event that they are frozen, this indicates that the to-be-withdrawn funds are likely subject to slashing. -3. Depending on the value of the supplied `withdrawAsTokens` input flag: -* If `withdrawAsTokens` is set to 'true', then StrategyManager calls `Strategy.withdraw` on each of the strategies being withdrawn from, causing the withdrawn funds to be transferred from each of the strategies to the withdrawer. -OR -* If `withdrawAsTokens` is set to 'false', then StrategyManager increases the stored share amounts that the withdrawer has in the strategies in question (effectively completing the transfer of shares from the initiator of the withdrawal to the withdrawer), and then calls `DelegationManager.increaseDelegatedShares` to trigger any appropriate updates to delegated share amounts. - -## Special Case -- Beacon Chain Full Withdrawals - -If a withdrawal includes withdrawing 'Beacon Chain ETH' from EigenLayer, then, it must be limited to *only* Beacon Chain ETH. In addition, before *completing* the withdrawal, the staker must trigger a full withdrawal from the Beacon Chain (as of now this must be originated from the validating keys, but details could change with Beacon Chain withdrawals) on behalf of enough of their validators to provide sufficient liquidity for their withdrawal. -The staker's EigenPod's balance will eventually increase by the amount withdrawn, and the withdrawals will be reflected in a BeaconChainOracle state root update. -At that point, the staker will prove their full withdrawals (differentiated from partial withdrawals by comparing the amount withdrawn against a hardcoded threshold) credited to the EigenPod against the beacon chain state root via the `verifyAndProcessWithdrawal` function. If the withdrawal's amount is greater than or equal to how much the corresponding Ethereum validator had restaked on EigenLayer, then the excess amount gets instantly withdrawn. If the withdrawal amount is less than the amount restaked on behalf of the validator in EigenLayer, the EigenPod will remove virtual 'beaconChainETH' shares accordingly, by calling the `StrategyManager.recordOvercommittedBeaconChainETH` function. - -Once the above is done, then when the withdrawal is completed through calling `StrategyManager.completeQueuedWithdrawal` function (as above), the StrategyManager will pass a call to `EigenPodManager.withdrawRestakedBeaconChainETH`, which will in turn pass a call onto the staker's EigenPod itself, invoking the `EigenPod.withdrawRestakedBeaconChainETH` function and triggering the actual transfer of ETH from the EigenPod to the withdrawer. This final call will only fail if the full withdrawals made and proven to the EigenPod do not provide sufficient liquidity for the EigenLayer withdrawal to occur. - -There exists an edge case in which a staker queues a withdrawal for all (or almost all) of their virtual beaconChainETH shares prior to a call to `StrategyManager.recordOvercommittedBeaconChainETH` -- in this case, once the staker's virtual beaconChainETH shares are decreased to zero, a special `beaconChainETHSharesToDecrementOnWithdrawal` variable is incremented, and in turn when the staker completes their queued withdrawal, the amount will be subtracted from their withdrawal amount. In other words, if the staker incurs a nonzero `beaconChainETHSharesToDecrementOnWithdrawal` amount, then withdrawals of the staker's beaconChainETH shares will prioritize decrementing this amount, prior to sending the staker themselves any funds. \ No newline at end of file diff --git a/docs/EigenPods.md b/docs/EigenPods.md deleted file mode 100644 index 4b2a12fd7..000000000 --- a/docs/EigenPods.md +++ /dev/null @@ -1,74 +0,0 @@ - -# EigenPods: Handling Beacon Chain ETH - -## Overview - -This document explains *EigenPods*, the mechanism by which EigenLayer facilitates the restaking of native beacon chain ether. - -It is important to contrast this with the restaking of liquid staking derivatives (LSDs) on EigenLayer. EigenLayer will integrate with liquid staking protocols "above the hood", meaning that withdrawal credentials will be pointed to EigenLayer at the smart contract layer rather than the consensus layer. This is because liquid staking protocols need their contracts to be in possession of the withdrawal credentials in order to not have platform risk on EigenLayer. As always, this means that value of liquid staking derivatives carries a discount due to additional smart contract risk. - -The architectural design of the EigenPods system is inspired by various liquid staking protocols, particularly Rocket Pool 🚀. - -## The EigenPodManager - -The EigenPodManager facilitates the higher level functionality of EigenPods and their interactions with the rest of the EigenLayer smart contracts (the StrategyManager and the StrategyManager's owner). Stakers can call the EigenPodManager to create pods (whose addresses are deterministically calculated via the Create2 OZ library) and stake on the Beacon Chain through them. The EigenPodManager also handles the 'overcommitements' of all EigenPods and coordinates processing of overcommitments with the StrategyManager. - -## The EigenPod - -The EigenPod is the contract that a staker must set their Ethereum validators' withdrawal credentials to. EigenPods can be created by stakers through a call to the EigenPodManager. EigenPods are deployed using the beacon proxy pattern to have flexible global upgradability for future changes to the Ethereum specification. Stakers can stake for an Etherum validator when they create their EigenPod, through further calls to their EigenPod, and through parallel deposits to the Beacon Chain deposit contract. - -### Beacon State Root Oracle - -EigenPods extensively use a Beacon State Root Oracle that will bring beacon state roots into Ethereum for every [`SLOTS_PER_HISTORICAL_ROOT`](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#time-parameters) slots (currently 8192 slots or ~27 hours) so that all intermediate state roots can be proven against the ones posted on the execution layer. - -The following sections are all related to managing Consensus Layer (CL) and Execution Layer (EL) balances via proofs against the beacon state root brought to the EL by the oracle. The below diagram will be of great help to understanding their functioning. - -![EigenPods_Architecture drawio](./images/EL_eigenpods_architecture.png) - - -## EigenPods before Restaking -When EigenPod contracts are initially deployed, the "restaking" functionality is turned off - the withdrawal credential proof has not been initiated yet. In this "non-restaking" mode, the contract may be used by its owner freely to withdraw validator balances from the beacon chain via the `withdrawBeforeRestaking` function. This function routes the withdrawn balance directly to the `DelayedWithdrawalRouter` contract. Once the EigenPod's owner verifies that their withdrawal credentials are pointed to the EigenPod via `verifyWithdrawalCredentialsAndBalance`, the `hasRestaked` flag will be set to true and any withdrawals must now be proven for via the `verifyAndProcessWithdrawal` function. - -### Merkle Proof of Correctly Pointed Withdrawal Credentials -After staking an Etherum validator with its withdrawal credentials pointed to their EigenPod, a staker must show that the new validator exists and has its withdrawal credentials pointed to the EigenPod, by proving it against a beacon state root with a call to `verifyWithdrawalCredentialsAndBalance`. The EigenPod will verify the proof (along with checking for replays and other conditions) and, if the ETH validator's current (not effective) balance is proven to be greater than `REQUIRED_BALANCE_WEI`, then the EigenPod will call the EigenPodManager to forward a call to the StrategyManager, crediting the staker with `REQUIRED_BALANCE_WEI` shares of the virtual beacon chain ETH strategy. `REQUIRED_BALANCE_WEI` will be set to an amount of ether that a validator could get slashed down to only due to malice or negligence. - -### Merkle Proofs for Overcommitted Balances -If a Ethereum validator restaked on an EigenPod has a balance that falls below `REQUIRED_BALANCE_WEI`, then they are overcommitted to EigenLayer, meaning they have less stake on the beacon chain than they the amount they have recorded as being restaked in Eigenlayer. Any watcher can prove to EigenPods that the EigenPod has a validator that is in such a state, by submitting a proof of the overcomitted validator's balance via the `verifyOvercommittedStake` function. If proof verification and other checks succeed, then `REQUIRED_BALANCE_WEI` will be immediately decremented from the EigenPod owner's (i.e. the staker's) shares in the StrategyManager. The existence of an overcommitted validator imposes a negative externality on middlewares that the staker is securing, since these middlewares will effectively overestimate their security -- proving overcommitment provides a mechanism to "eject" these validators from EigenLayer, to help minimize the amount of time this overestimation lasts. Note that a validator with a balance of 0 ETH may be either withdrawn or, in the rare case, slashed down to 0 ETH. In the case of the latter, we verify the status of the validator in addition to their balance. In the case of the former, the status of the validator should be verified through use of the verifyAndProcessWithdrawal function. - - -### Merkle Proofs of Full/Partial Withdrawals - -Whenever a staker withdraws one of their validators from the beacon chain to provide liquidity, they have a few options. Stakers could keep the ETH in the EigenPod and continue staking on EigenLayer, in which case their ETH, when withdrawn to the EigenPod, will not earn any additional Ethereum staking rewards, but may continue to earn rewards on EigenLayer. Stakers could also queue withdrawals on EigenLayer for their virtual beacon chain ETH strategy shares, which will be fullfilled once their obligations to EigenLayer have ended and their EigenPod has enough balance to complete the withdrawal. - -In this second case, in order to withdraw their balance from the EigenPod, stakers must provide a valid proof of their full withdrawal or partial withdrawal (withdrawals of beacon chain rewards). In the case of the former, withdrawals are processed via the queued withdrawal system while in the latter, the balance is instantly withdrawable (as it is technically not being restaked). We distinguish between partial and full withdrawals by checking the `validator.withdrawableEpoch`. If the `validator.withdrawableEpoch <= executionPayload.slot/SLOTS_PER_EPOCH` then it is classified as a full withdrawal (here `executionPayload` contains the withdrawal being proven). This is because the `validator.withdrawableEpoch` is set when a validator submits a signed exit transaction. It is only after this that their withdrawal can be picked up by a sweep and be processed. In the case of a partial withdrawal, `validator.withdrawableEpoch` is set to FFE (far future epoch). - -We also must prove the `executionPayload.blockNumber > mostRecentWithdrawalBlockNumber`, which is stored in the contract. `mostRecentWithdrawalBlockNumber` is set when a validator makes a withdrawal in the pre-restaking phase of the EigenPod deployment. Without this check, a validator can make a partial withdrawal in the EigenPod's pre-restaking mode, withdraw it and then try to prove the same partial withdrawal once withdrawal credentials have been repointed and proven, thus double withdrawing (assuming that they have restaked balance in the EigenPod during the second withdrawal). - -In this second case, in order to withdraw their balance from the EigenPod, stakers must provide a valid proof of their full withdrawal against a beacon chain state root. Full withdrawals are differentiated from partial withdrawals by checking against the validator in question's 'withdrawable epoch'; if the validator's withdrawable epoch is less than or equal to the slot's epoch, then the validator has fully withdrawn because a full withdrawal is only processable at or after the withdrawable epoch has passed. Once the full withdrawal is successfully verified, there are 4 cases, each handled slightly differently: - -1. If the withdrawn amount is greater than `REQUIRED_BALANCE_GWEI` and the validator was *not* previously proven to be "overcommitted", then `REQUIRED_BALANCE_WEI` is held for processing through EigenLayer's normal withdrawal path, while the excess amount above `REQUIRED_BALANCE_GWEI` is marked as instantly withdrawable. - -2. If the withdrawn amount is greater than `REQUIRED_BALANCE_GWEI` and the validator *was* previously proven to be "overcommitted", then `REQUIRED_BALANCE_WEI` is held for processing through EigenLayer's normal withdrawal path, while the excess amount above `REQUIRED_BALANCE_GWEI` is marked as instantly withdrawable, identical to (1) above. Additionally, the podOwner's beaconChainShares in EigenLayer are increased by `REQUIRED_BALANCE_WEI` to counter-balance the decrease that occurred during the [overcommittment fraudproof process](#fraud-proofs-for-overcommitted-balances). - -3. If the amount withdrawn is less than `REQUIRED_BALANCE_GWEI` and the validator was *not* previously proven to be "overcommitted", then the full withdrawal amount is held for processing through EigenLayer's normal withdrawal path, and any excess 'beaconChainETH' shares in EigenLayer are immediately removed, somewhat similar to the process outlined in [fraud proofs for overcommitted balances]. - -4. If the amount withdrawn is less than `REQUIRED_BALANCE_GWEI` and the validator *was* previously proven to be "overcommitted", then the full withdrawal amount is held for processing through EigenLayer's normal withdrawal path, and the podOwner is credited with enough beaconChainETH shares in EigenLayer to complete the normal withdrawal process; this last step is necessary since the validator's virtual beaconChainETH shares were previously removed from EigenLayer as part of the overcommittment fraudproof process. - - -![Beacon Chain Withdrawal Proofs drawio](./images/Withdrawal_Proof_Diagram.png) - - -## Merkle Proof Specifics - -### verifyValidatorFields -This function is used to verify any of the fields, such as withdrawal credentials or slashed status, in the `Validator` container of the Beacon State. The user provides the validatorFields and the index of the validator they're proving for, and the function verifies this against the Beacon State Root. - -### verifyWithdrawalProofs -This function verifies several proofs related to a withdrawal: -1. It verifies the slot of the withdrawal -2. It verifies the block number of the withdrawal -3. It verifies that the withdrawal fields provided are correct. - -### verifyValidatorBalance -The `Validator` container in the Beacon State only contains the effective balance of the validator. The effective balance is used to determine the size of a reward or penalty a validator receives (refer [here](https://kb.beaconcha.in/glossary#current-balance-and-effective-balance) for more information). The actual balance of the validator is stored in a separate array of `Balance` containers. Thus we require a separate proof to verify the validator's actual balance, which is verified in `verifyValidatorBalance`. - diff --git a/docs/Guaranteed-stake-updates.md b/docs/Guaranteed-stake-updates.md deleted file mode 100644 index d4c6f2e6b..000000000 --- a/docs/Guaranteed-stake-updates.md +++ /dev/null @@ -1,136 +0,0 @@ -# Design: Withdrawals From EigenLayer -- Guaranteed Stake Updates on Withdrawal -Withdrawals are one of the critical flows in the EigenLayer system. Guaranteed stake updates ensure that all middlewares that an operator has opted-into (i.e. allowed to slash them) are notified at the appropriate time regarding any withdrawals initiated by an operator. To put it simply, an operator can "queue" a withdrawal at any point in time. In order to complete the withdrawal, the operator must first serve all existing obligations related to keeping their stake slashable. The contract `Slasher.sol` keeps track of a historic record of each operator's `latestServeUntil` time at various blocks, which is the timestamp after which their stake will have served its obligations which were created at or before the block in question. To complete a withdrawal, an operator (or a staker delegated to them) can point to a relevant point in the record which proves that the funds they are withdrawing are no longer "at stake" on any middleware tasks. -EigenLayer uses a 'push' model for it's own core contracts -- when a staker queues a withdrawal from EigenLayer (or deposits new funds into EigenLayer), their withdrawn shares are immediately decremented, both in the StrategyManager itself and in the DelegationManager contract. Middlewares, however, must 'pull' this data. Their worldview is stale until a call is made that triggers a 'stake update', updating the middleware's view on how much the operator has staked. The middleware then informs EigenLayer (either immediately or eventually) that the stake update has occurred. - -## Storage Model - -Below, a whitelisted contract refers to a contract that is a part of a middleware that is allowed to freeze the opted-in operators. - -For each operator, the Slasher contract stores: - -1. A `mapping(address => mapping(address => MiddlewareDetails))`, from operator address to contract whitelisted by the operator to slash them, to [details](../src/contracts/contracts/interfaces/ISlasher.sol) about that contract formatted as -```solidity - struct MiddlewareDetails { - // the UTC timestamp before which the contract is allowed to slash the user - uint32 contractCanSlashOperatorUntil; - // the block at which the middleware's view of the operator's stake was most recently updated - uint32 latestUpdateBlock; - } -``` -2. A `mapping(address => LinkedList

) operatorToWhitelistedContractsByUpdate`, from operator address to a [linked list](../src/contracts/libraries/StructuredLinkedList.sol) of addresses of all whitelisted contracts, ordered by when their stakes were last updated by each middleware, from 'stalest'/earliest (at the 'HEAD' of the list) to most recent (at the 'TAIL' of the list) -3. A `mapping(address => MiddlewareTimes[]) middlewareTimes` from operators to a historic list of -```solidity - struct MiddlewareTimes { - // The update block for the middleware whose most recent update was earliest, i.e. the 'stalest' update out of all middlewares the operator is serving - uint32 stalestUpdateBlock; - // The latest 'serve until' time from all of the middleware that the operator is serving - uint32 latestServeUntil; - } -``` - -The reason we store an array of updates as opposed to one `MiddlewareTimes` struct with the most up-to-date values is that this would require pushing updates carefully to not disrupt existing withdrawals. This way, operators can select the `MiddlewareTimes` entry that is appropriate for their withdrawal. Thus, the operator provides an entry from their `operatorMiddlewareTimes` based on which a withdrawal can be completed. The withdrawability is checked by `slasher.canWithdraw()`, which checks that for the queued withdrawal in question, `withdrawalStartBlock` is less than the provided `operatorMiddlewareTimes` entry's 'stalestUpdateBlock', i.e. the specified stake update occurred *strictly after* the withdrawal was queued. It also checks that the current block.timestamp is greater than the `operatorMiddlewareTimes` entry's 'latestServeUntil' time, i.e. that the current time is *strictly after* the end of all obligations that the operator had, at the time of the specified stake update. If these criteria are both met, then the withdrawal can be completed. - -Note: -`remove`, `nodeExists`,`getHead`, `getNextNode`, and `pushBack` are all constant time operations on linked lists. This is gained at the sacrifice of getting any elements by specifying their *indices* in the list. Searching the linked list for the correct entry is linear-time with respect to the length of the list; this should only ever happen in a "worst-case" scenario, after the provided index input is determined to be incorrect. - -## An Instructive Example - -Let us say an operator has opted into serving a middleware, `Middleware A`. As a result of the operator's actions, `Middleware A` calls `recordFirstStakeUpdate`, adding `Middleware A` to their linked list of middlewares, recording the `block.number` as the `updateBlock` and the middleware's specified `serveUntil` time as the `latestServeUntil` in a `MiddlewareTimes` struct that gets pushed to `operatorMiddlewareTimes`. At later times, the operator registers with a second and third middleware, `Middleware B` and `Middleware C`, respectively. At this point, the current state is as follows: - -![Three Middlewares Timeline](images/three_middlewares.png?raw=true "Three Middlewares Timeline") - -Based on this, the *current* latest serveUntil time is `serveUntil_B`, and the 'stalest' stake update from a middleware occurred at `updateBlock_A`. So the most recent entry in the `operatorMiddlewareTimes` array for the operator will have `serveUntil = serveUntil_B` and `stalestUpdateBlock = updateBlock_A`. - -In the meantime, let us say that the operator had also queued a withdrawal between opting-in to serve `Middleware A` and opting-in to serve `Middleware B`: - -![Three Middlewares Timeline With Queued Withdrawal](images/three_middlewares_withdrawal_queued.png?raw=true "Three Middlewares Timeline With Queued Withdrawal") - -Now that a withdrawal has been queued, the operator must wait till their obligations have been met before they can withdraw their stake. At this point, in our example, the `operatorMiddlewareTimes` array looks like this: - -```solidity -{ - { - stalestUpdateBlock: updateBlock_A - latestServeUntil: serveUntil_A - }, - { - stalestUpdateBlock: updateBlock_A - latestServeUntil: serveUntil_B - }, - { - stalestUpdateBlock: updateBlock_A - latestServeUntil: serveUntil_B - } -} -``` - In order to complete a withdrawal in this example, the operator would have to record a stake update in `Middleware A`, signalling readiness for withdrawal. Assuming this update was performed at roughly the time that the operator signed up to serve `Middleware B`, the state would now look like this: - -![Updated Three Middlewares Timeline With Queued Withdrawal](images/withdrawal.png?raw=true "Updated Three Middlewares Timeline With Queued Withdrawal") - -By recording a stake update in `Middleware A`, a new entry would be pushed to the operator's `operatorMiddlewareTimes` array, with `serveUntil = serveUntil_A` and `stalestUpdateBlock = updateBlock_B`. The queued withdrawal will then become completable after the current value of `serveUntil_A`, by referencing this entry in the array. - -## Deep Dive, aka "The Function-by-Function Explanation" - -### Internal Functions - -#### `_recordUpdateAndAddToMiddlewareTimes` -```solidity - function _recordUpdateAndAddToMiddlewareTimes(address operator, uint32 updateBlock, uint32 serveUntil) internal { -``` - -This function is called each time a middleware posts a stake update, through a call to `recordFirstStakeUpdate`, `recordStakeUpdate`, or `recordLastStakeUpdateAndRevokeSlashingAbility`. It records that the middleware has had a stake update and pushes a new entry to the operator's list of 'MiddlewareTimes', i.e. `operatorToMiddlewareTimes[operator]`, if *either* the `operator`'s stalestUpdateBlock' has decreased, *or* their latestServeUntil' has increased. An entry is also pushed in the special case of this being the first update of the first middleware that the operator has opted-in to serving. - -### External Functions - -#### `recordFirstStakeUpdate` -```solidity - function recordFirstStakeUpdate(address operator, uint32 serveUntil) external onlyCanSlash(operator) { - -``` - -This function is called by a whitelisted slashing contract during registration of a new operator. The middleware posts an initial update, passing in the time until which the `operator`'s stake is bonded -- `serveUntil`. The middleware is pushed to the end ('TAIL') of the linked list since in `operatorToWhitelistedContractsByUpdate[operator]`, since the new middleware must have been updated the most recently, i.e. at the present moment. - - -#### `recordStakeUpdate` -```solidity -recordStakeUpdate(address operator, uint32 updateBlock, uint32 serveUntil, uint256 insertAfter) -``` - -This function is called by a whitelisted slashing contract, passing in the time until which the operator's stake is bonded -- `serveUntil`, the block for which the stake update to the middleware is being recorded (which may be the current block or a past block) -- `updateBlock`, and an index specifying the element of the `operator`'s linked list that the currently updating middleware should be inserted after -- `insertAfter`. It makes a call to the internal function `_updateMiddlewareList` to actually update the linked list. - -#### `recordLastStakeUpdateAndRevokeSlashingAbility` -```solidity -function recordLastStakeUpdateAndRevokeSlashingAbility(address operator, uint32 serveUntil) external onlyCanSlash(operator) { -``` - -This function is called by a whitelisted slashing contract on deregistration of an operator, passing in the time until which the operator's stake is bonded -- `serveUntil`. It assumes that the update is posted for the *current* block, rather than a past block, in contrast to `recordStakeUpdate`. - - -### View / "Helper" Functions - -#### `canWithdraw` -```solidity -canWithdraw(address operator, uint32 withdrawalStartBlock, uint256 middlewareTimesIndex) external returns (bool) { -``` - -The biggest thing guaranteed stake updates do is to make sure that withdrawals only happen once the stake being withdrawn is no longer slashable in a non-optimistic way. This is done by calling the `canWithdraw` function on the Slasher contract, which returns 'true' if the `operator` can currently complete a withdrawal started at the `withdrawalStartBlock`, with `middlewareTimesIndex` used to specify the index of a `MiddlewareTimes` struct in the operator's list (i.e. an index in `operatorToMiddlewareTimes[operator]`). The specified struct is consulted as proof of the `operator`'s ability (or lack thereof) to complete the withdrawal. - - - - - - - - - - - - - - - - - - - - diff --git a/docs/Middleware-registration-operator-flow.md b/docs/Middleware-registration-operator-flow.md deleted file mode 100644 index 4faf78bf1..000000000 --- a/docs/Middleware-registration-operator-flow.md +++ /dev/null @@ -1,15 +0,0 @@ -# Middleware Registration Operator Flow - -EigenLayer is a three-sided platform, bringing together middlewares/services, operators, and stakers. Middlewares have an attached risk-reward profile, based on the risk of getting slashed while running their service, and the rewards that they offer operators taking on those risks. Operators have full control over the middlewares that they decide to register with and run, and have an aggregated risk-reward profile of their own, based on these choices and their personal reputation. All of a users' assets that are deposited into EigenLayer are delegated to a single operator. - -Operators must thus make an informed decision as to which middlewares to run. This document is meant to give a high-level overview of the registration process that they must then follow in order to register with the middlewares that they have decided to operate. - -## Registration Process - -Any operator must go through the following sequence of steps: -- [Register as an operator](./EigenLayer-delegation-flow.md#operator-registration) in EigenLayer -- Get stakers to [delegate to them](./EigenLayer-delegation-flow.md#staker-delegation) -- For each middleware: - - Opt into [slashing](./EigenLayer-tech-spec.md#slasher) by the middleware's [ServiceManager](../src/contracts/interfaces/IServiceManager.sol) contract - - Make sure to respect any other preconditions set by the middleware — for [EigenDA](https://docs.eigenda.xyz/), these are registering a BLS key in the [BLSPublicKeyCompendium](](../src/contracts/interfaces/IBLSPublicKeyCompendium.sol) and having sufficient (delegated) stake in EigenLayer to meet the minimum stake requirements set by EigenDA - - Call a function on one of the middleware's contracts to complete the registration — for EigenDA, this is registering on its [BLSRegistry](../src/contracts/interfaces/IBLSRegistry.sol) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..5854dbcf9 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,173 @@ +[middleware-repo]: https://github.com/Layr-Labs/eigenlayer-middleware/ + +## EigenLayer M2 Docs + +**EigenLayer M2** extends the functionality of EigenLayer M1 (which is live on mainnet). M2 is currently on the Goerli testnet, and will eventually be released on mainnet. + +This repo contains the EigenLayer core contracts, which enable restaking of liquid staking tokens (LSTs) and beacon chain ETH to secure new services, called AVSs (actively validated services). For more info on AVSs, check out the EigenLayer middleware contracts [here][middleware-repo]. + +This document provides an overview of system components, contracts, and user roles. Further documentation on the major system contracts can be found in [/core](./core/). + +#### Contents + +* [System Components](#system-components) + * [`EigenPodManager`](#eigenpodmanager) + * [`StrategyManager`](#strategymanager) + * [`DelegationManager`](#delegationmanager) + * [`AVSDirectory`](#avsdirectory) + * [`Slasher`](#slasher) +* [Roles and Actors](#roles-and-actors) +* [Common User Flows](#common-user-flows) + * [Depositing Into EigenLayer](#depositing-into-eigenlayer) + * [Delegating to an Operator](#delegating-to-an-operator) + * [Undelegating or Queueing a Withdrawal](#undelegating-or-queueing-a-withdrawal) + * [Completing a Withdrawal as Shares](#completing-a-withdrawal-as-shares) + * [Completing a Withdrawal as Tokens](#completing-a-withdrawal-as-tokens) + * [Withdrawal Processing: Validator Exits](#withdrawal-processing-validator-exits) + * [Withdrawal Processing: Partial Beacon Chain Withdrawals](#withdrawal-processing-partial-beacon-chain-withdrawals) + +### System Components + +#### EigenPodManager + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`EigenPodManager.sol`](../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy | +| [`EigenPod.sol`](../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy | +| [`DelayedWithdrawalRouter.sol`](../src/contracts/pods/DelayedWithdrawalRouter.sol) | Singleton | Transparent proxy | +| [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/telepathy-contracts/blob/main/external/integrations/eigenlayer/EigenLayerBeaconOracle.sol) | Singleton | UUPS proxy | [`0x40B1...9f2c`](https://goerli.etherscan.io/address/0x40B10ddD29a2cfF33DBC420AE5bbDa0649049f2c) | + +These contracts work together to enable native ETH restaking: +* Users deploy `EigenPods` via the `EigenPodManager`, which contain beacon chain state proof logic used to verify a validator's withdrawal credentials, balance, and exit. An `EigenPod's` main role is to serve as the withdrawal address for one or more of a user's validators. +* The `EigenPodManager` handles `EigenPod` creation and accounting+interactions between users with restaked native ETH and the `DelegationManager`. +* The `DelayedWithdrawalRouter` imposes a 7-day delay on completing partial beacon chain withdrawals from an `EigenPod`. This is primarily to add a stopgap against a hack being able to instantly withdraw funds (note that all withdrawals from EigenLayer -- other than partial withdrawals earned by validators -- are initiated via the `DelegationManager`). +* The `EigenLayerBeaconOracle` provides beacon chain block roots for use in various proofs. The oracle is supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)). + +See full documentation in [`/core/EigenPodManager.md`](./core/EigenPodManager.md). + +#### StrategyManager + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`StrategyManager.sol`](../src/contracts/core/StrategyManager.sol) | Singleton | Transparent proxy | +| [`StrategyBaseTVLLimits.sol`](../src/contracts/strategies/StrategyBaseTVLLimits.sol) | One instance per supported LST | Transparent proxy | + +These contracts work together to enable restaking for LSTs: +* The `StrategyManager` acts as the entry and exit point for LSTs in EigenLayer. It handles deposits into LST-specific strategies, and manages accounting+interactions between users with restaked LSTs and the `DelegationManager`. +* `StrategyBaseTVLLimits` is deployed as multiple separate instances, one for each supported LST. When a user deposits into a strategy through the `StrategyManager`, this contract receives the tokens and awards the user with a proportional quantity of shares in the strategy. When a user withdraws, the strategy contract sends the LSTs back to the user. + +See full documentation in [`/core/StrategyManager.md`](./core/StrategyManager.md). + +#### DelegationManager + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`DelegationManager.sol`](../src/contracts/core/DelegationManager.sol) | Singleton | Transparent proxy | + +The `DelegationManager` sits between the `EigenPodManager` and `StrategyManager` to manage delegation and undelegation of Stakers to Operators. Its primary features are to allow Operators to register as Operators (`registerAsOperator`), to keep track of shares being delegated to Operators across different strategies, and to manage withdrawals on behalf of the `EigenPodManager` and `StrategyManager`. + +See full documentation in [`/core/DelegationManager.md`](./core/DelegationManager.md). + +#### AVSDirectory + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`AVSDirectory.sol`](../src/contracts/core/AVSDirectory.sol) | Singleton | Transparent proxy | + +The `AVSDirectory` handles interactions between AVSs and the EigenLayer core contracts. Once registered as an Operator in EigenLayer core (via the `DelegationManager`), Operators can register with one or more AVSs (via the AVS's contracts) to begin providing services to them offchain. As a part of registering with an AVS, the AVS will record this registration in the core contracts by calling into the `AVSDirectory`. + +See full documentation in [`/core/AVSDirectory.md`](./core/AVSDirectory.md). + +For more information on AVS contracts, see the [middleware repo][middleware-repo]. + +#### Slasher + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`Slasher.sol`](../src/contracts/core/Slasher.sol) | - | - | + +

+🚧 The Slasher contract is under active development and its interface expected to change. We recommend writing slashing logic without integrating with the Slasher at this point in time. Although the Slasher is deployed, it will remain completely paused/unusable during M2. No contracts interact with it, and its design is not finalized. 🚧 +

+ +--- + +#### Roles and Actors + +To see an example of the user flows described in this section, check out our integration tests: [/src/test/integration](../src/test/integration/). + +##### Staker + +A Staker is any party who has assets deposited (or "restaked") into EigenLayer. Currently, these assets can be: +* Native beacon chain ETH (via the EigenPodManager) +* Liquid staking tokens (via the StrategyManager): cbETH, rETH, stETH, ankrETH, OETH, osETH, swETH, wBETH + +Stakers can restake any combination of these: a Staker may hold ALL of these assets, or only one of them. + +*Flows:* +* Stakers **deposit** assets into EigenLayer via either the StrategyManager (for LSTs) or EigenPodManager (for beacon chain ETH) +* Stakers **withdraw** assets via the DelegationManager, *no matter what assets they're withdrawing* +* Stakers **delegate** to an Operator via the DelegationManager + +Unimplemented as of M2: +* Stakers earn yield by delegating to an Operator as the Operator provides services to an AVS +* Stakers are at risk of being slashed if the Operator misbehaves + +##### Operator + +An Operator is a user who helps run the software built on top of EigenLayer (AVSs). Operators register in EigenLayer and allow Stakers to delegate to them, then opt in to provide various services built on top of EigenLayer. Operators may themselves be Stakers; these are not mutually exclusive. + +*Flows:* +* User can **register** as an Operator via the DelegationManager +* Operators can **deposit** and **withdraw** assets just like Stakers can +* Operators can opt in to providing services for an AVS using that AVS's middleware contracts. See the [EigenLayer middleware][middleware-repo] repo for more details. + +*Unimplemented as of M2:* +* Operators earn fees as part of the services they provide +* Operators may be slashed by the services they register with (if they misbehave) + +--- + +#### Common User Flows + +##### Depositing Into EigenLayer + +Depositing into EigenLayer varies depending on whether the Staker is depositing Native ETH or LSTs: + +![.](./images/Staker%20Flow%20Diagrams/Depositing.png) + +##### Delegating to an Operator + +![.](./images/Staker%20Flow%20Diagrams/Delegating.png) + +##### Undelegating or Queueing a Withdrawal + +Undelegating from an Operator automatically queues a withdrawal that needs to go through the `DelegationManager's` withdrawal delay. Stakers that want to withdraw can choose to `undelegate`, or can simply call `queueWithdrawals` directly. + +![.](./images/Staker%20Flow%20Diagrams/Queue%20Withdrawal.png) + +##### Completing a Withdrawal as Shares + +This flow is mostly useful if a Staker wants to change which Operator they are delegated to. The Staker first needs to undelegate (see above). At this point, they can delegate to a different Operator. However, the new Operator will only be awarded shares once the Staker completes their queued withdrawal "as shares": + +![.](./images/Staker%20Flow%20Diagrams/Complete%20Withdrawal%20as%20Shares.png) + +##### Completing a Withdrawal as Tokens + +Completing a queued withdrawal as tokens is roughly the same for both native ETH and LSTs. + +However, note that *before* a withdrawal can be completed, native ETH stakers will need to perform additional steps, detailed in the "Withdrawal Processing" diagrams below. + +![.](./images/Staker%20Flow%20Diagrams/Complete%20Withdrawal%20as%20Tokens.png) + +##### Withdrawal Processing: Validator Exits + +If a Staker wants to fully withdraw from the beacon chain, they need to perform these additional steps before their withdrawal is completable: + +![.](./images/Staker%20Flow%20Diagrams/Validator%20Exits.png) + +##### Withdrawal Processing: Partial Beacon Chain Withdrawals + +If a Staker wants to withdraw consensus rewards from the beacon chain, they do NOT go through the `DelegationManager`. This is the only withdrawal type that is not initiated in the `DelegationManager`: + +![.](./images/Staker%20Flow%20Diagrams/Partial%20Withdrawals.png) \ No newline at end of file diff --git a/docs/core/AVSDirectory.md b/docs/core/AVSDirectory.md new file mode 100644 index 000000000..c135d2653 --- /dev/null +++ b/docs/core/AVSDirectory.md @@ -0,0 +1,80 @@ +[middleware-repo]: https://github.com/Layr-Labs/eigenlayer-middleware/ + +## AVSDirectory + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`AVSDirectory.sol`](../../src/contracts/core/AVSDirectory.sol) | Singleton | Transparent proxy | + +The `AVSDirectory` handles interactions between AVSs and the EigenLayer core contracts. Once registered as an Operator in EigenLayer core (via the `DelegationManager`), Operators can register with one or more AVSs (via the AVS's contracts) to begin providing services to them offchain. As a part of registering with an AVS, the AVS will record this registration in the core contracts by calling into the `AVSDirectory`. + +For more information on AVS contracts, see the [middleware repo][middleware-repo]. + +Currently, the only interactions between AVSs and the core contracts is to track whether Operators are currently registered for the AVS. This is handled by two methods: +* [`AVSDirectory.registerOperatorToAVS`](#registeroperatortoavs) +* [`AVSDirectory.deregisterOperatorFromAVS`](#deregisteroperatorfromavs) + +In a future release, this contract will implement additional interactions that relate to (i) paying Operators for the services they provide and (ii) slashing Operators that misbehave. Currently, these features are not implemented. + +--- + +#### `registerOperatorToAVS` + +```solidity +function registerOperatorToAVS( + address operator, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature +) + external + onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) +``` + +Allows the caller (an AVS) to register an `operator` with itself, given the provided signature is valid. + +*Effects*: +* Sets the `operator's` status to `REGISTERED` for the AVS + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS` +* `operator` MUST already be a registered Operator (via the `DelegationManager`) +* `operator` MUST NOT already be registered with the AVS +* `operatorSignature` must be a valid, unused, unexpired signature from the `operator`. The signature is an ECDSA signature by the operator over the [`OPERATOR_AVS_REGISTRATION_TYPEHASH`](../../src/contracts/core/DelegationManagerStorage.sol). Expiry is a utc timestamp in seconds. Salt is used only once per signature to prevent replay attacks. + +*As of M2*: +* Operator registration/deregistration does not have any sort of consequences for the Operator or its shares. Eventually, this will tie into payments for services and slashing for misbehavior. + +#### `deregisterOperatorFromAVS` + +```solidity +function deregisterOperatorFromAVS( + address operator +) + external + onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) +``` + +Allows the caller (an AVS) to deregister an `operator` with itself + +*Effects*: +* Sets the `operator's` status to `UNREGISTERED` for the AVS + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS` +* `operator` MUST already be registered with the AVS + +*As of M2*: +* Operator registration/deregistration does not have any sort of consequences for the Operator or its shares. Eventually, this will tie into payments for services and slashing for misbehavior. + +#### `cancelSalt` + +```solidity +function cancelSalt(bytes32 salt) external +``` + +Allows the caller (an Operator) to cancel a signature salt before it is used to register for an AVS. + +*Effects*: +* Sets `operatorSaltIsSpent[msg.sender][salt]` to `true` + +*Requirements*: +* Salt MUST NOT already be cancelled \ No newline at end of file diff --git a/docs/core/DelegationManager.md b/docs/core/DelegationManager.md new file mode 100644 index 000000000..28c18547f --- /dev/null +++ b/docs/core/DelegationManager.md @@ -0,0 +1,437 @@ +## DelegationManager + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`DelegationManager.sol`](../../src/contracts/core/DelegationManager.sol) | Singleton | Transparent proxy | + +The primary functions of the `DelegationManager` are (i) to allow Stakers to delegate to Operators, (ii) allow Stakers to be undelegated from Operators, and (iii) handle withdrawals and withdrawal processing for shares in both the `StrategyManager` and `EigenPodManager`. + +Whereas the `EigenPodManager` and `StrategyManager` perform accounting for individual Stakers according to their native ETH or LST holdings respectively, the `DelegationManager` sits between these two contracts and tracks these accounting changes according to the Operators each Staker has delegated to. + +This means that each time a Staker's balance changes in either the `EigenPodManager` or `StrategyManager`, the `DelegationManager` is called to record this update to the Staker's delegated Operator (if they have one). For example, if a Staker is delegated to an Operator and deposits into a strategy, the `StrategyManager` will call the `DelegationManager` to update the Operator's delegated shares for that strategy. + +Additionally, whether a Staker is delegated to an Operator or not, the `DelegationManager` is how a Staker queues (and later completes) a withdrawal. + +#### High-level Concepts + +This document organizes methods according to the following themes (click each to be taken to the relevant section): +* [Becoming an Operator](#becoming-an-operator) +* [Delegating to an Operator](#delegating-to-an-operator) +* [Undelegating and Withdrawing](#undelegating-and-withdrawing) +* [Accounting](#accounting) +* [System Configuration](#system-configuration) + +#### Important state variables + +* `mapping(address => address) public delegatedTo`: Staker => Operator. + * If a Staker is not delegated to anyone, `delegatedTo` is unset. + * Operators are delegated to themselves - `delegatedTo[operator] == operator` +* `mapping(address => mapping(IStrategy => uint256)) public operatorShares`: Tracks the current balance of shares an Operator is delegated according to each strategy. Updated by both the `StrategyManager` and `EigenPodManager` when a Staker's delegatable balance changes. + * Because Operators are delegated to themselves, an Operator's own restaked assets are reflected in these balances. + * A similar mapping exists in the `StrategyManager`, but the `DelegationManager` additionally tracks beacon chain ETH delegated via the `EigenPodManager`. The "beacon chain ETH" strategy gets its own special address for this mapping: `0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0`. +* `uint256 public minWithdrawalDelayBlocks`: + * As of M2, this is 50400 (roughly 1 week) + * For all strategies including native beacon chain ETH, Stakers at minimum must wait this amount of time before a withdrawal can be completed. + To withdraw a specific strategy, it may require additional time depending on the strategy's withdrawal delay. See `strategyWithdrawalDelayBlocks` below. +* `mapping(IStrategy => uint256) public strategyWithdrawalDelayBlocks`: + * This mapping tracks the withdrawal delay for each strategy. This mapping value only comes into affect + if `strategyWithdrawalDelayBlocks[strategy] > minWithdrawalDelayBlocks`. Otherwise, `minWithdrawalDelayBlocks` is used. +* `mapping(bytes32 => bool) public pendingWithdrawals;`: + * `Withdrawals` are hashed and set to `true` in this mapping when a withdrawal is initiated. The hash is set to false again when the withdrawal is completed. A per-staker nonce provides a way to distinguish multiple otherwise-identical withdrawals. + +#### Helpful definitions + +* `isDelegated(address staker) -> (bool)` + * True if `delegatedTo[staker] != address(0)` +* `isOperator(address operator) -> (bool)` + * True if `_operatorDetails[operator].earningsReceiver != address(0)` + +--- + +### Becoming an Operator + +Operators interact with the following functions to become an Operator: + +* [`DelegationManager.registerAsOperator`](#registerasoperator) +* [`DelegationManager.modifyOperatorDetails`](#modifyoperatordetails) +* [`DelegationManager.updateOperatorMetadataURI`](#updateoperatormetadatauri) + +#### `registerAsOperator` + +```solidity +function registerAsOperator(OperatorDetails calldata registeringOperatorDetails, string calldata metadataURI) external +``` + +Registers the caller as an Operator in EigenLayer. The new Operator provides the `OperatorDetails`, a struct containing: +* `address earningsReceiver`: the address that will receive earnings as the Operator provides services to AVSs *(currently unused)* +* `address delegationApprover`: if set, this address must sign and approve new delegation from Stakers to this Operator *(optional)* +* `uint32 stakerOptOutWindowBlocks`: the minimum delay (in blocks) between beginning and completing registration for an AVS. *(currently unused)* + +`registerAsOperator` cements the Operator's `OperatorDetails`, and self-delegates the Operator to themselves - permanently marking the caller as an Operator. They cannot "deregister" as an Operator - however, they can exit the system by withdrawing their funds via `queueWithdrawals`. + +*Effects*: +* Sets `OperatorDetails` for the Operator in question +* Delegates the Operator to itself +* If the Operator has shares in the `EigenPodManager`, the `DelegationManager` adds these shares to the Operator's shares for the beacon chain ETH strategy. +* For each of the three strategies in the `StrategyManager`, if the Operator holds shares in that strategy they are added to the Operator's shares under the corresponding strategy. + +*Requirements*: +* Caller MUST NOT already be an Operator +* Caller MUST NOT already be delegated to an Operator +* `earningsReceiver != address(0)` +* `stakerOptOutWindowBlocks <= MAX_STAKER_OPT_OUT_WINDOW_BLOCKS`: (~180 days) +* Pause status MUST NOT be set: `PAUSED_NEW_DELEGATION` + +#### `modifyOperatorDetails` + +```solidity +function modifyOperatorDetails(OperatorDetails calldata newOperatorDetails) external +``` + +Allows an Operator to update their stored `OperatorDetails`. + +*Requirements*: +* Caller MUST already be an Operator +* `new earningsReceiver != address(0)` +* `new stakerOptOutWindowBlocks >= old stakerOptOutWindowBlocks` +* `new stakerOptOutWindowBlocks <= MAX_STAKER_OPT_OUT_WINDOW_BLOCKS` + +#### `updateOperatorMetadataURI` + +```solidity +function updateOperatorMetadataURI(string calldata metadataURI) external +``` + +Allows an Operator to emit an `OperatorMetadataURIUpdated` event. No other state changes occur. + +*Requirements*: +* Caller MUST already be an Operator + +--- + +### Delegating to an Operator + +Stakers interact with the following functions to delegate their shares to an Operator: + +* [`DelegationManager.delegateTo`](#delegateto) +* [`DelegationManager.delegateToBySignature`](#delegatetobysignature) + +#### `delegateTo` + +```solidity +function delegateTo( + address operator, + SignatureWithExpiry memory approverSignatureAndExpiry, + bytes32 approverSalt +) + external +``` + +Allows the caller (a Staker) to delegate their shares to an Operator. Delegation is all-or-nothing: when a Staker delegates to an Operator, they delegate ALL their shares. For each strategy the Staker has shares in, the `DelegationManager` will update the Operator's corresponding delegated share amounts. + +*Effects*: +* Records the Staker as being delegated to the Operator +* If the Staker has shares in the `EigenPodManager`, the `DelegationManager` adds these shares to the Operator's shares for the beacon chain ETH strategy. +* For each of the three strategies in the `StrategyManager`, if the Staker holds shares in that strategy they are added to the Operator's shares under the corresponding strategy. + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_NEW_DELEGATION` +* The caller MUST NOT already be delegated to an Operator +* The `operator` MUST already be an Operator +* If the `operator` has a `delegationApprover`, the caller MUST provide a valid `approverSignatureAndExpiry` and `approverSalt` + +#### `delegateToBySignature` + +```solidity +function delegateToBySignature( + address staker, + address operator, + SignatureWithExpiry memory stakerSignatureAndExpiry, + SignatureWithExpiry memory approverSignatureAndExpiry, + bytes32 approverSalt +) + external +``` + +Allows a Staker to delegate to an Operator by way of signature. This function can be called by three different parties: +* If the Operator calls this method, they need to submit only the `stakerSignatureAndExpiry` +* If the Operator's `delegationApprover` calls this method, they need to submit only the `stakerSignatureAndExpiry` +* If the anyone else calls this method, they need to submit both the `stakerSignatureAndExpiry` AND `approverSignatureAndExpiry` + +*Effects*: See `delegateTo` above. + +*Requirements*: See `delegateTo` above. Additionally: +* If caller is either the Operator's `delegationApprover` or the Operator, the `approverSignatureAndExpiry` and `approverSalt` can be empty +* `stakerSignatureAndExpiry` MUST be a valid, unexpired signature over the correct hash and nonce + +--- + +### Undelegating and Withdrawing + +These methods can be called by both Stakers AND Operators, and are used to (i) undelegate a Staker from an Operator, (ii) queue a withdrawal of a Staker/Operator's shares, or (iii) complete a queued withdrawal: + +* [`DelegationManager.undelegate`](#undelegate) +* [`DelegationManager.queueWithdrawals`](#queuewithdrawals) +* [`DelegationManager.completeQueuedWithdrawal`](#completequeuedwithdrawal) +* [`DelegationManager.completeQueuedWithdrawals`](#completequeuedwithdrawals) + +#### `undelegate` + +```solidity +function undelegate( + address staker +) + external + onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) + returns (bytes32[] memory withdrawalRoots) +``` + +`undelegate` can be called by a Staker to undelegate themselves, or by a Staker's delegated Operator (or that Operator's `delegationApprover`). Undelegation (i) queues withdrawals on behalf of the Staker for all their delegated shares, and (ii) decreases the Operator's delegated shares according to the amounts and strategies being withdrawn. + +If the Staker has active shares in either the `EigenPodManager` or `StrategyManager`, they are removed while the withdrawal is in the queue - and an individual withdrawal is queued for each strategy removed. + +The withdrawals can be completed by the Staker after max(`minWithdrawalDelayBlocks`, `strategyWithdrawalDelayBlocks[strategy]`) where `strategy` is any of the Staker's delegated strategies. This does not require the Staker to "fully exit" from the system -- the Staker may choose to receive their shares back in full once withdrawals are completed (see [`completeQueuedWithdrawal`](#completequeuedwithdrawal) for details). + +Note that becoming an Operator is irreversible! Although Operators can withdraw, they cannot use this method to undelegate from themselves. + +*Effects*: +* Any shares held by the Staker in the `EigenPodManager` and `StrategyManager` are removed from the Operator's delegated shares. +* The Staker is undelegated from the Operator +* If the Staker has no delegatable shares, there is no withdrawal queued or further effects +* For each strategy being withdrawn, a `Withdrawal` is queued for the Staker: + * The Staker's withdrawal nonce is increased by 1 for each `Withdrawal` + * The hash of each `Withdrawal` is marked as "pending" +* See [`EigenPodManager.removeShares`](./EigenPodManager.md#eigenpodmanagerremoveshares) +* See [`StrategyManager.removeShares`](./StrategyManager.md#removeshares) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_ENTER_WITHDRAWAL_QUEUE` +* Staker MUST exist and be delegated to someone +* Staker MUST NOT be an Operator +* `staker` parameter MUST NOT be zero +* Caller must be either the Staker, their Operator, or their Operator's `delegationApprover` +* See [`EigenPodManager.removeShares`](./EigenPodManager.md#eigenpodmanagerremoveshares) +* See [`StrategyManager.removeShares`](./StrategyManager.md#removeshares) + +#### `queueWithdrawals` + +```solidity +function queueWithdrawals( + QueuedWithdrawalParams[] calldata queuedWithdrawalParams +) + external + onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE) + returns (bytes32[] memory) +``` + +Allows the caller to queue one or more withdrawals of their held shares across any strategy (in either/both the `EigenPodManager` or `StrategyManager`). If the caller is delegated to an Operator, the `shares` and `strategies` being withdrawn are immediately removed from that Operator's delegated share balances. Note that if the caller is an Operator, this still applies, as Operators are essentially delegated to themselves. + +`queueWithdrawals` works very similarly to `undelegate`, except that the caller is not undelegated, and also may choose which strategies and how many shares to withdraw (as opposed to ALL shares/strategies). + +All shares being withdrawn (whether via the `EigenPodManager` or `StrategyManager`) are removed while the withdrawals are in the queue. + +Withdrawals can be completed by the caller after max(`minWithdrawalDelayBlocks`, `strategyWithdrawalDelayBlocks[strategy]`) such that `strategy` represents the queued strategies to be withdrawn. Withdrawals do not require the caller to "fully exit" from the system -- they may choose to receive their shares back in full once the withdrawal is completed (see [`completeQueuedWithdrawal`](#completequeuedwithdrawal) for details). + +Note that the `QueuedWithdrawalParams` struct has a `withdrawer` field. Originally, this was used to specify an address that the withdrawal would be credited to once completed. However, `queueWithdrawals` now requires that `withdrawer == msg.sender`. Any other input is rejected. + +*Effects*: +* For each withdrawal: + * If the caller is delegated to an Operator, that Operator's delegated balances are decreased according to the `strategies` and `shares` being withdrawn. + * A `Withdrawal` is queued for the caller, tracking the strategies and shares being withdrawn + * The caller's withdrawal nonce is increased + * The hash of the `Withdrawal` is marked as "pending" + * See [`EigenPodManager.removeShares`](./EigenPodManager.md#eigenpodmanagerremoveshares) + * See [`StrategyManager.removeShares`](./StrategyManager.md#removeshares) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_ENTER_WITHDRAWAL_QUEUE` +* For each withdrawal: + * `strategies.length` MUST equal `shares.length` + * `strategies.length` MUST NOT be equal to 0 + * The `withdrawer` MUST equal `msg.sender` + * See [`EigenPodManager.removeShares`](./EigenPodManager.md#eigenpodmanagerremoveshares) + * See [`StrategyManager.removeShares`](./StrategyManager.md#removeshares) + +#### `completeQueuedWithdrawal` + +```solidity +function completeQueuedWithdrawal( + Withdrawal calldata withdrawal, + IERC20[] calldata tokens, + uint256 middlewareTimesIndex, + bool receiveAsTokens +) + external + onlyWhenNotPaused(PAUSED_EXIT_WITHDRAWAL_QUEUE) + nonReentrant +``` + +After waiting max(`minWithdrawalDelayBlocks`, `strategyWithdrawalDelayBlocks[strategy]`) number of blocks, this allows the `withdrawer` of a `Withdrawal` to finalize a withdrawal and receive either (i) the underlying tokens of the strategies being withdrawn from, or (ii) the shares being withdrawn. This choice is dependent on the passed-in parameter `receiveAsTokens`. + +For each strategy/share pair in the `Withdrawal`: +* If the `withdrawer` chooses to receive tokens: + * The shares are converted to their underlying tokens via either the `EigenPodManager` or `StrategyManager` and sent to the `withdrawer`. +* If the `withdrawer` chooses to receive shares (and the strategy belongs to the `StrategyManager`): + * The shares are awarded to the `withdrawer` via the `StrategyManager` + * If the `withdrawer` is delegated to an Operator, that Operator's delegated shares are increased by the added shares (according to the strategy being added to). + +`Withdrawals` concerning `EigenPodManager` shares have some additional nuance depending on whether a withdrawal is specified to be received as tokens vs shares (read more about "why" in [`EigenPodManager.md`](./EigenPodManager.md)): +* `EigenPodManager` withdrawals received as shares: + * Shares ALWAYS go back to the originator of the withdrawal (rather than the `withdrawer` address). + * Shares are also delegated to the originator's Operator, rather than the `withdrawer's` Operator. + * Shares received by the originator may be lower than the shares originally withdrawn if the originator has debt. +* `EigenPodManager` withdrawals received as tokens: + * Before the withdrawal can be completed, the originator needs to prove that a withdrawal occurred on the beacon chain (see [`EigenPod.verifyAndProcessWithdrawals`](./EigenPodManager.md#eigenpodverifyandprocesswithdrawals)). + +*Effects*: +* The hash of the `Withdrawal` is removed from the pending withdrawals +* If `receiveAsTokens`: + * See [`StrategyManager.withdrawSharesAsTokens`](./StrategyManager.md#withdrawsharesastokens) + * See [`EigenPodManager.withdrawSharesAsTokens`](./EigenPodManager.md#eigenpodmanagerwithdrawsharesastokens) +* If `!receiveAsTokens`: + * For `StrategyManager` strategies: + * Shares are awarded to the `withdrawer` and delegated to the `withdrawer's` Operator + * See [`StrategyManager.addShares`](./StrategyManager.md#addshares) + * For the native beacon chain ETH strategy (`EigenPodManager`): + * Shares are awarded to `withdrawal.staker`, and delegated to the Staker's Operator + * See [`EigenPodManager.addShares`](./EigenPodManager.md#eigenpodmanageraddshares) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_EXIT_WITHDRAWAL_QUEUE` +* The hash of the passed-in `Withdrawal` MUST correspond to a pending withdrawal + * At least `minWithdrawalDelayBlocks` MUST have passed before `completeQueuedWithdrawal` is called + * For all strategies in the `Withdrawal`, at least `strategyWithdrawalDelayBlocks[strategy]` MUST have passed before `completeQueuedWithdrawal` is called + * Caller MUST be the `withdrawer` specified in the `Withdrawal` +* If `receiveAsTokens`: + * The caller MUST pass in the underlying `IERC20[] tokens` being withdrawn in the appropriate order according to the strategies in the `Withdrawal`. + * See [`StrategyManager.withdrawSharesAsTokens`](./StrategyManager.md#withdrawsharesastokens) + * See [`EigenPodManager.withdrawSharesAsTokens`](./EigenPodManager.md#eigenpodmanagerwithdrawsharesastokens) +* If `!receiveAsTokens`: + * See [`StrategyManager.addShares`](./StrategyManager.md#addshares) + * See [`EigenPodManager.addShares`](./EigenPodManager.md#eigenpodmanageraddshares) + +*As of M2*: +* The `middlewareTimesIndex` parameter has to do with the Slasher, which currently does nothing. As of M2, this parameter has no bearing on anything and can be ignored. + +#### `completeQueuedWithdrawals` + +```solidity +function completeQueuedWithdrawals( + Withdrawal[] calldata withdrawals, + IERC20[][] calldata tokens, + uint256[] calldata middlewareTimesIndexes, + bool[] calldata receiveAsTokens +) + external + onlyWhenNotPaused(PAUSED_EXIT_WITHDRAWAL_QUEUE) + nonReentrant +``` + +This method is the plural version of [`completeQueuedWithdrawal`](#completequeuedwithdrawal). + +--- + +### Accounting + +These methods are called by the `StrategyManager` and `EigenPodManager` to update delegated share accounting when a Staker's balance changes (e.g. due to a deposit): + +* [`DelegationManager.increaseDelegatedShares`](#increasedelegatedshares) +* [`DelegationManager.decreaseDelegatedShares`](#decreasedelegatedshares) + +#### `increaseDelegatedShares` + +```solidity +function increaseDelegatedShares( + address staker, + IStrategy strategy, + uint256 shares +) + external + onlyStrategyManagerOrEigenPodManager +``` + +Called by either the `StrategyManager` or `EigenPodManager` when a Staker's shares for one or more strategies increase. This method is called to ensure that if the Staker is delegated to an Operator, that Operator's share count reflects the increase. + +*Entry Points*: +* `StrategyManager.depositIntoStrategy` +* `StrategyManager.depositIntoStrategyWithSignature` +* `EigenPod.verifyWithdrawalCredentials` +* `EigenPod.verifyBalanceUpdates` +* `EigenPod.verifyAndProcessWithdrawals` + +*Effects*: If the Staker in question is delegated to an Operator, the Operator's shares for the `strategy` are increased. +* This method is a no-op if the Staker is not delegated to an Operator. + +*Requirements*: +* Caller MUST be either the `StrategyManager` or `EigenPodManager` + +#### `decreaseDelegatedShares` + +```solidity +function decreaseDelegatedShares( + address staker, + IStrategy strategy, + uint256 shares +) + external + onlyStrategyManagerOrEigenPodManager +``` + +Called by the `EigenPodManager` when a Staker's shares decrease. This method is called to ensure that if the Staker is delegated to an Operator, that Operator's share count reflects the decrease. + +*Entry Points*: This method may be called as a result of the following top-level function calls: +* `EigenPod.verifyBalanceUpdates` +* `EigenPod.verifyAndProcessWithdrawals` + +*Effects*: If the Staker in question is delegated to an Operator, the Operator's delegated balance for the `strategy` is decreased by `shares` +* This method is a no-op if the Staker is not delegated to an Operator. + +*Requirements*: +* Caller MUST be either the `StrategyManager` or `EigenPodManager` (although the `StrategyManager` doesn't use this method) + +--- + +### System Configuration + +* [`DelegationManager.setMinWithdrawalDelayBlocks`](#setminwithdrawaldelayblocks) +* [`DelegationManager.setStrategyWithdrawalDelayBlocks`](#setstrategywithdrawaldelayblocks) + +#### `setMinWithdrawalDelayBlocks` + +```solidity +function setMinWithdrawalDelayBlocks( + uint256 newMinWithdrawalDelayBlocks +) + external + onlyOwner +``` + +Allows the Owner to set the overall minimum withdrawal delay for withdrawals concerning any strategy. The total time required for a withdrawal to be completable is at least `minWithdrawalDelayBlocks`. If any of the withdrawal's strategies have a higher per-strategy withdrawal delay, the time required is the maximum of these per-strategy delays. + +*Effects*: +* Sets the global `minWithdrawalDelayBlocks` + +*Requirements*: +* Caller MUST be the Owner +* The new value MUST NOT be greater than `MAX_WITHDRAWAL_DELAY_BLOCKS` + +#### `setStrategyWithdrawalDelayBlocks` + +```solidity +function setStrategyWithdrawalDelayBlocks( + IStrategy[] calldata strategies, + uint256[] calldata withdrawalDelayBlocks +) + external + onlyOwner +``` + +Allows the Owner to set a per-strategy withdrawal delay for each passed-in strategy. The total time required for a withdrawal to be completable is at least `minWithdrawalDelayBlocks`. If any of the withdrawal's strategies have a higher per-strategy withdrawal delay, the time required is the maximum of these per-strategy delays. + +*Effects*: +* For each `strategy`, sets `strategyWithdrawalDelayBlocks[strategy]` to a new value + +*Requirements*: +* Caller MUST be the Owner +* `strategies.length` MUST be equal to `withdrawalDelayBlocks.length` +* For each entry in `withdrawalDelayBlocks`, the value MUST NOT be greater than `MAX_WITHDRAWAL_DELAY_BLOCKS` \ No newline at end of file diff --git a/docs/core/EigenPodManager.md b/docs/core/EigenPodManager.md new file mode 100644 index 000000000..24dabe1f5 --- /dev/null +++ b/docs/core/EigenPodManager.md @@ -0,0 +1,719 @@ +## EigenPodManager + + + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`EigenPodManager.sol`](../../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy | +| [`EigenPod.sol`](../../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy | +| [`DelayedWithdrawalRouter.sol`](../../src/contracts/pods/DelayedWithdrawalRouter.sol) | Singleton | Transparent proxy | +| [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/telepathy-contracts/blob/main/external/integrations/eigenlayer/EigenLayerBeaconOracle.sol) | Singleton | UUPS Proxy | + +The `EigenPodManager` and `EigenPod` contracts allow Stakers to restake beacon chain ETH which can then be delegated to Operators via the `DelegationManager`. + +The `EigenPodManager` is the entry point for this process, allowing Stakers to deploy an `EigenPod` and begin restaking. While actively restaking, a Staker uses their `EigenPod` to validate various beacon chain state proofs of validator balance and withdrawal status. When exiting, a Staker uses the `DelegationManager` to undelegate or queue a withdrawal from EigenLayer. + +`EigenPods` serve as the withdrawal credentials for one or more beacon chain validators controlled by a Staker. Their primary role is to validate beacon chain proofs for each of the Staker's validators. Beacon chain proofs are used to verify a validator's: +* `EigenPod.verifyWithdrawalCredentials`: withdrawal credentials and effective balance +* `EigenPod.verifyBalanceUpdates`: effective balance (when it changes) +* `EigenPod.verifyAndProcessWithdrawals`: withdrawable epoch, and processed withdrawals within historical block summary + +See [/proofs](./proofs/) for detailed documentation on each of the state proofs used in these methods. Additionally, proofs are checked against a beacon chain block root supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)). + +#### High-level Concepts + +The functions of the `EigenPodManager` and `EigenPod` contracts are tightly linked. Rather than writing two separate docs pages, documentation for both contracts is included in this file. This document organizes methods according to the following themes (click each to be taken to the relevant section): +* [Depositing Into EigenLayer](#depositing-into-eigenlayer) +* [Restaking Beacon Chain ETH](#restaking-beacon-chain-eth) +* [Withdrawal Processing](#withdrawal-processing) +* [System Configuration](#system-configuration) +* [Other Methods](#other-methods) + +#### Important State Variables + +* `EigenPodManager`: + * `mapping(address => IEigenPod) public ownerToPod`: Tracks the deployed `EigenPod` for each Staker + * `mapping(address => int256) public podOwnerShares`: Keeps track of the actively restaked beacon chain ETH for each Staker. + * In some cases, a beacon chain balance update may cause a Staker's balance to drop below zero. This is because when queueing for a withdrawal in the `DelegationManager`, the Staker's current shares are fully removed. If the Staker's beacon chain balance drops after this occurs, their `podOwnerShares` may go negative. This is a temporary change to account for the drop in balance, and is ultimately corrected when the withdrawal is finally processed. + * Since balances on the consensus layer are stored only in Gwei amounts, the EigenPodManager enforces the invariant that `podOwnerShares` is always a whole Gwei amount for every staker, i.e. `podOwnerShares[staker] % 1e9 == 0` always. +* `EigenPod`: + * `_validatorPubkeyHashToInfo[bytes32] -> (ValidatorInfo)`: individual validators are identified within an `EigenPod` according to their public key hash. This mapping keeps track of the following for each validator: + * `validatorStatus`: (`INACTIVE`, `ACTIVE`, `WITHDRAWN`) + * `validatorIndex`: A `uint40` that is unique for each validator making a successful deposit via the deposit contract + * `mostRecentBalanceUpdateTimestamp`: A timestamp that represents the most recent successful proof of the validator's effective balance + * `restakedBalanceGwei`: set to the validator's balance. + * `withdrawableRestakedExecutionLayerGwei`: When a Staker proves that a validator has exited from the beacon chain, the withdrawal amount is added to this variable. When completing a withdrawal of beacon chain ETH, the withdrawal amount is subtracted from this variable. See also: + * [`DelegationManager`: "Undelegating and Withdrawing"](./DelegationManager.md#undelegating-and-withdrawing) + * [`EigenPodManager`: "Withdrawal Processing"](#withdrawal-processing) + +#### Important Definitions + +* "Pod Owner": A Staker who has deployed an `EigenPod` is a Pod Owner. The terms are used interchangeably in this document. + * Pod Owners can only deploy a single `EigenPod`, but can restake any number of beacon chain validators from the same `EigenPod`. + * Pod Owners can delegate their `EigenPodManager` shares to Operators (via `DelegationManager`). + * These shares correspond to the amount of provably-restaked beacon chain ETH held by the Pod Owner via their `EigenPod`. +* `EigenPod`: + * `_podWithdrawalCredentials() -> (bytes memory)`: + * Gives `abi.encodePacked(bytes1(uint8(1)), bytes11(0), address(EigenPod))` + * These are the `0x01` withdrawal credentials of the `EigenPod`, used as a validator's withdrawal credentials on the beacon chain. + +--- + +### Depositing Into EigenLayer + +Before a Staker begins restaking beacon chain ETH, they need to deploy an `EigenPod`, stake, and start a beacon chain validator: +* [`EigenPodManager.createPod`](#eigenpodmanagercreatepod) +* [`EigenPodManager.stake`](#eigenpodmanagerstake) + * [`EigenPod.stake`](#eigenpodstake) + +To complete the deposit process, the Staker needs to prove that the validator's withdrawal credentials are pointed at the `EigenPod`: +* [`EigenPod.verifyWithdrawalCredentials`](#eigenpodverifywithdrawalcredentials) + +#### `EigenPodManager.createPod` + +```solidity +function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) +``` + +Allows a Staker to deploy an `EigenPod` instance, if they have not done so already. + +Each Staker can only deploy a single `EigenPod` instance, but a single `EigenPod` can serve as the withdrawal credentials for any number of beacon chain validators. Each `EigenPod` is created using Create2 and the beacon proxy pattern, using the Staker's address as the Create2 salt. + +As part of the `EigenPod` deployment process, the Staker is made the Pod Owner, a permissioned role within the `EigenPod`. + +*Effects*: +* Create2 deploys `EigenPodManager.beaconProxyBytecode`, appending the `eigenPodBeacon` address as a constructor argument. `bytes32(msg.sender)` is used as the salt. + * `address eigenPodBeacon` is an [OpenZeppelin v4.7.1 `UpgradableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol), whose implementation address points to the current `EigenPod` implementation + * `beaconProxyBytecode` is the constructor code for an [OpenZeppelin v4.7.1 `BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol) +* `EigenPod.initialize(msg.sender)`: initializes the pod, setting the caller as the Pod Owner and activating restaking for any validators pointed at the pod. +* Maps the new pod to the Pod Owner (each address can only deploy a single `EigenPod`) + +*Requirements*: +* Caller MUST NOT have deployed an `EigenPod` already +* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` + +*As of M2*: +* `EigenPods` are initialized with restaking enabled by default (`hasRestaked = true`). Pods deployed before M2 may not have this enabled, and will need to call `EigenPod.activateRestaking()`. + +#### `EigenPodManager.stake` + +```solidity +function stake( + bytes calldata pubkey, + bytes calldata signature, + bytes32 depositDataRoot +) + external + payable + onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) +``` + +Allows a Staker to deposit 32 ETH into the beacon chain deposit contract, providing the credentials for the Staker's beacon chain validator. The `EigenPod.stake` method is called, which automatically calculates the correct withdrawal credentials for the pod and passes these to the deposit contract along with the 32 ETH. + +*Effects*: +* Deploys and initializes an `EigenPod` on behalf of Staker, if this has not been done already +* See [`EigenPod.stake`](#eigenpodstake) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` +* See [`EigenPod.stake`](#eigenpodstake) + +##### `EigenPod.stake` + +```solidity +function stake( + bytes calldata pubkey, + bytes calldata signature, + bytes32 depositDataRoot +) + external + payable + onlyEigenPodManager +``` + +Handles the call to the beacon chain deposit contract. Only called via `EigenPodManager.stake`. + +*Effects*: +* Deposits 32 ETH into the beacon chain deposit contract, and provides the pod's address as the deposit's withdrawal credentials + +*Requirements*: +* Caller MUST be the `EigenPodManager` +* Call value MUST be 32 ETH +* Deposit contract `deposit` method MUST succeed given the provided `pubkey`, `signature`, and `depositDataRoot` + +#### `EigenPod.verifyWithdrawalCredentials` + +```solidity +function verifyWithdrawalCredentials( + uint64 oracleTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + uint40[] calldata validatorIndices, + bytes[] calldata validatorFieldsProofs, + bytes32[][] calldata validatorFields +) + external + onlyEigenPodOwner + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) + proofIsForValidTimestamp(oracleTimestamp) + hasEnabledRestaking +``` + +Once a Pod Owner has deposited ETH into the beacon chain deposit contract, they can call this method to "fully restake" one or more validators by proving the validator's withdrawal credentials are pointed at the `EigenPod`. This activation will mean that the ETH in those validators: +* is awarded to the Staker/Pod Owner in `EigenPodManager.podOwnerShares` +* is delegatable to an Operator (via the `DelegationManager`) + +For each successfully proven validator, that validator's status becomes `VALIDATOR_STATUS.ACTIVE`, and the sum of restakable ether across all newly-proven validators is provided to [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate), where it is added to the Pod Owner's shares. If the Pod Owner is delegated to an Operator via the `DelegationManager`, this sum is also added to the Operator's delegated shares for the beacon chain ETH strategy. + +For each validator the Pod Owner wants to verify, the Pod Owner must supply: +* `validatorIndices`: their validator's `ValidatorIndex` (see [consensus specs](https://eth2book.info/capella/part3/config/types/#validatorindex)) +* `validatorFields`: the fields of the `Validator` container associated with the validator (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)) +* `stateRootProof`: a proof that will verify `stateRootProof.beaconStateRoot` against an oracle-provided beacon block root +* `validatorFieldsProofs`: a proof that the `Validator` container belongs to the associated validator at the given `ValidatorIndex` within `stateRootProof.beaconStateRoot` +* `oracleTimestamp`: a timestamp used to fetch a beacon block root from `EigenPodManager.beaconChainOracle` + +*Beacon chain proofs used*: +* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) +* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) + +*Effects*: +* For each validator (`_validatorPubkeyHashToInfo[pubkeyHash]`) the validator's info is set for the first time: + * `VALIDATOR_STATUS` moves from `INACTIVE` to `ACTIVE` + * `validatorIndex` is recorded + * `mostRecentBalanceUpdateTimestamp` is set to the `oracleTimestamp` used to fetch the beacon block root + * `restakedBalanceGwei` is set to the validator's effective balance +* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) + +*Requirements*: +* Caller MUST be the Pod Owner +* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CREDENTIALS` +* Pod MUST have enabled restaking +* All input array lengths MUST be equal +* `oracleTimestamp`: + * MUST be greater than the `mostRecentWithdrawalTimestamp` + * MUST be no more than `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` (~4.5 hrs) old + * MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) +* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` +* For each validator: + * The validator's status MUST initially be `VALIDATOR_STATUS.INACTIVE` + * `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` + * The aforementioned proofs MUST show that the validator's withdrawal credentials are set to the `EigenPod` +* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) + +*As of M2*: +* Restaking is enabled by default for pods deployed after M2. See `activateRestaking` for more info. + +--- + +### Restaking Beacon Chain ETH + +At this point, a Staker/Pod Owner has deployed their `EigenPod`, started their beacon chain validator, and proven that its withdrawal credentials are pointed to their `EigenPod`. They are now free to delegate to an Operator (if they have not already), or start up + verify additional beacon chain validators that also withdraw to the same `EigenPod`. + +The primary method concerning actively restaked validators is: +* [`EigenPod.verifyBalanceUpdates`](#eigenpodverifybalanceupdates) + +#### `EigenPod.verifyBalanceUpdates` + +```solidity +function verifyBalanceUpdates( + uint64 oracleTimestamp, + uint40[] calldata validatorIndices, + BeaconChainProofs.StateRootProof calldata stateRootProof, + bytes[] calldata validatorFieldsProofs, + bytes32[][] calldata validatorFields +) + external + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE) +``` + +Anyone (not just the Pod Owner) may call this method with one or more valid balance update proofs to record beacon chain balance updates in one or more of the `EigenPod's` validators. + +A successful balance update proof updates the `EigenPod's` view of a validator's [effective balance](https://eth2book.info/capella/part2/incentives/balances/). If the validator's effective balance has changed, the difference is sent to `EigenPodManager.recordBeaconChainETHBalanceUpdate`, which updates the Pod Owner's shares. If the Pod Owner is delegated to an Operator, this delta is also sent to the `DelegationManager` to update the Operator's delegated beacon chain ETH shares. + +Note that if a validator's effective balance has decreased, this method will result in shares being removed from the Pod Owner in `EigenPodManager.recordBeaconChainETHBalanceUpdate`. This may cause the Pod Owner's balance to go negative in some cases, representing a "deficit" that must be repaid before any withdrawals can be processed. One example flow where this might occur is: +* Pod Owner calls `DelegationManager.undelegate`, which queues a withdrawal in the `DelegationManager`. The Pod Owner's shares are set to 0 while the withdrawal is in the queue. +* Pod Owner's beacon chain ETH balance decreases (maybe due to slashing), and someone provides a proof of this to `EigenPod.verifyBalanceUpdates`. In this case, the Pod Owner will have negative shares in the `EigenPodManager`. +* After a delay, the Pod Owner calls `DelegationManager.completeQueuedWithdrawal`. The negative shares are then repaid out of the withdrawn assets. + +For the validator whose balance should be updated, the caller must supply: +* `validatorIndex`: the validator's `ValidatorIndex` (see [consensus specs](https://eth2book.info/capella/part3/config/types/#validatorindex)) +* `stateRootProof`: a proof that will verify `stateRootProof.beaconStateRoot` against an oracle-provided beacon block root +* `validatorFieldsProofs`: a proof that the `Validator` container belongs to the associated validator at the given `ValidatorIndex` within `stateRootProof.beaconStateRoot` +* `validatorFields`: the fields of the `Validator` container associated with the validator (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)) +* `oracleTimestamp`: a timestamp used to fetch a beacon block root from `EigenPodManager.beaconChainOracle` + +*Beacon chain proofs used*: +* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) +* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) + +*Effects*: +* Updates the validator's stored info: + * `restakedBalanceGwei` is updated to the newly-proven effective balance + * `mostRecentBalanceUpdateTimestamp` is set to the `oracleTimestamp` used to fetch the beacon block root +* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE` +* Balance updates should only be made before a validator has fully exited. If the validator has exited, any further proofs should follow the `verifyAndProcessWithdrawals` path. + * This is to prevent someone from providing a "balance update" on an exited validator that "proves" a balance of 0, when we want to process that update as a withdrawal instead. +* `oracleTimestamp`: + * MUST be no more than `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` (~4.5 hrs) old + * MUST be newer than the validator's `mostRecentBalanceUpdateTimestamp` + * MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) +* `validatorFields[0]` MUST be a pubkey hash corresponding to a validator whose withdrawal credentials have been proven, and is not yet withdrawn (`VALIDATOR_STATUS.ACTIVE`) +* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` +* `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` +* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) + +--- + +### Withdrawal Processing + +The `DelegationManager` is the entry point for all undelegation and withdrawals, which must be queued for a time before being completed. When a withdrawal is initiated, the following method is used: +* [`EigenPodManager.removeShares`](#eigenpodmanagerremoveshares) + +When completing a queued undelegation or withdrawal, the `DelegationManager` calls one of these two methods: +* [`EigenPodManager.addShares`](#eigenpodmanageraddshares) +* [`EigenPodManager.withdrawSharesAsTokens`](#eigenpodmanagerwithdrawsharesastokens) + * [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth) + +If a Staker wishes to fully withdraw their beacon chain ETH (via `withdrawSharesAsTokens`), they need to exit their validator and prove the withdrawal *prior to* completing the queued withdrawal. They do so using this method: +* [`EigenPod.verifyAndProcessWithdrawals`](#eigenpodverifyandprocesswithdrawals) + +Some withdrawals are sent to their destination via the `DelayedWithdrawalRouter`: +* [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) +* [`DelayedWithdrawalRouter.claimDelayedWithdrawals`](#delayedwithdrawalrouterclaimdelayedwithdrawals) + +#### `EigenPodManager.removeShares` + +```solidity +function removeShares( + address podOwner, + uint256 shares +) + external + onlyDelegationManager +``` + +The `DelegationManager` calls this method when a Staker queues a withdrawal (or undelegates, which also queues a withdrawal). The shares are removed while the withdrawal is in the queue, and when the queue completes, the shares will either be re-awarded or withdrawn as tokens (`addShares` and `withdrawSharesAsTokens`, respectively). + +The Staker's share balance is decreased by the removed `shares`. + +This method is not allowed to cause the `Staker's` balance to go negative. This prevents a Staker from queueing a withdrawal for more shares than they have (or more shares than they delegated to an Operator). + +*Entry Points*: +* `DelegationManager.undelegate` +* `DelegationManager.queueWithdrawals` + +*Effects*: +* Removes `shares` from `podOwner's` share balance + +*Requirements*: +* `podOwner` MUST NOT be zero +* `shares` MUST NOT be negative when converted to `int256` +* `shares` MUST NOT be greater than `podOwner's` share balance +* `shares` MUST be a whole Gwei amount + +#### `EigenPodManager.addShares` + +```solidity +function addShares( + address podOwner, + uint256 shares +) + external + onlyDelegationManager + returns (uint256) +``` + +The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as "shares" (rather than as the underlying tokens). A Pod Owner might want to do this in order to change their delegated Operator without needing to fully exit their validators. + +Note that typically, shares from completed withdrawals are awarded to a `withdrawer` specified when the withdrawal is initiated in `DelegationManager.queueWithdrawals`. However, because beacon chain ETH shares are linked to proofs provided to a Pod Owner's `EigenPod`, this method is used to award shares to the original Pod Owner. + +If the Pod Owner has a share deficit (negative shares), the deficit is repaid out of the added `shares`. If the Pod Owner's positive share count increases, this change is returned to the `DelegationManager` to be delegated to the Pod Owner's Operator (if they have one). + +*Entry Points*: +* `DelegationManager.completeQueuedWithdrawal` +* `DelegationManager.completeQueuedWithdrawals` + +*Effects*: +* The `podOwner's` share balance is increased by `shares` + +*Requirements*: +* `podOwner` MUST NOT be zero +* `shares` MUST NOT be negative when converted to an `int256` +* `shares` MUST be a whole Gwei amount + +#### `EigenPodManager.withdrawSharesAsTokens` + +```solidity +function withdrawSharesAsTokens( + address podOwner, + address destination, + uint256 shares +) + external + onlyDelegationManager +``` + +The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as tokens (rather than shares). This can be used to "fully exit" some amount of beacon chain ETH and send it to a recipient (via `EigenPod.withdrawRestakedBeaconChainETH`). + +Note that because this method entails withdrawing and sending beacon chain ETH, two conditions must be met for this method to succeed: (i) the ETH being withdrawn should already be in the `EigenPod`, and (ii) the beacon chain withdrawals responsible for the ETH should already be proven. + +This means that before completing their queued withdrawal, a Pod Owner needs to prove their beacon chain withdrawals via `EigenPod.verifyAndProcessWithdrawals`. + +Also note that, like `addShares`, if the original Pod Owner has a share deficit (negative shares), the deficit is repaid out of the withdrawn `shares` before any native ETH is withdrawn. + +*Entry Points*: +* `DelegationManager.completeQueuedWithdrawal` +* `DelegationManager.completeQueuedWithdrawals` + +*Effects*: +* If `podOwner's` share balance is negative, `shares` are added until the balance hits 0 + * Any remaining shares are withdrawn and sent to `destination` (see [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth)) + +*Requirements*: +* `podOwner` MUST NOT be zero +* `destination` MUST NOT be zero +* `shares` MUST NOT be negative when converted to an `int256` +* `shares` MUST be a whole Gwei amount +* See [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth) + +##### `EigenPod.withdrawRestakedBeaconChainETH` + +```solidity +function withdrawRestakedBeaconChainETH( + address recipient, + uint256 amountWei +) + external + onlyEigenPodManager +``` + +The `EigenPodManager` calls this method when withdrawing a Pod Owner's shares as tokens (native ETH). The input `amountWei` is converted to Gwei and subtracted from `withdrawableRestakedExecutionLayerGwei`, which tracks Gwei that has been provably withdrawn (via `EigenPod.verifyAndProcessWithdrawals`). + +As such: +* If a withdrawal has not been proven that sufficiently raises `withdrawableRestakedExecutionLayerGwei`, this method will revert. +* If the `EigenPod` does not have `amountWei` available to transfer, this method will revert + +*Effects*: +* Decreases the pod's `withdrawableRestakedExecutionLayerGwei` by `amountWei / GWEI_TO_WEI` +* Sends `amountWei` ETH to `recipient` + +*Requirements*: +* `amountWei / GWEI_TO_WEI` MUST NOT be greater than the proven `withdrawableRestakedExecutionLayerGwei` +* Pod MUST have at least `amountWei` ETH balance +* `recipient` MUST NOT revert when transferred `amountWei` +* `amountWei` MUST be a whole Gwei amount + +#### `EigenPod.verifyAndProcessWithdrawals` + +```solidity +function verifyAndProcessWithdrawals( + uint64 oracleTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, + bytes[] calldata validatorFieldsProofs, + bytes32[][] calldata validatorFields, + bytes32[][] calldata withdrawalFields +) + external + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_WITHDRAWAL) + onlyNotFrozen +``` + +Anyone (not just the Pod Owner) can call this method to prove that one or more validators associated with an `EigenPod` have performed a full or partial withdrawal from the beacon chain. + +Whether each withdrawal is a full or partial withdrawal is determined by the validator's "withdrawable epoch" in the `Validator` container given by `validatorFields` (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)). If the withdrawal proof timestamp is after this epoch, the withdrawal is a full withdrawal. +* Partial withdrawals are performed automatically by the beacon chain when a validator has an effective balance over 32 ETH. This method can be used to prove that these withdrawals occurred, allowing the Pod Owner to withdraw the excess ETH (via [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)). +* Full withdrawals are performed when a Pod Owner decides to fully exit a validator from the beacon chain. To do this, the Pod Owner should follow these steps: + 1. Undelegate or queue a withdrawal (via the `DelegationManager`: ["Undelegating and Withdrawing"](./DelegationManager.md#undelegating-and-withdrawing)) + 2. Exit their validator from the beacon chain and provide a proof to this method + 3. Complete their withdrawal (via [`DelegationManager.completeQueuedWithdrawal`](./DelegationManager.md#completequeuedwithdrawal)). + +If the Pod Owner only exits their validator, the ETH of the pod owner is still staked through EigenLayer and can be used to service AVSs, even though their ETH has been withdrawn from the beacon chain. The protocol allows for this edge case. + +*Beacon chain proofs used*: +* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) +* [`verifyWithdrawal`](./proofs/BeaconChainProofs.md#beaconchainproofsverifywithdrawal) +* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) + +*Effects*: +* For each proven withdrawal: + * The validator in question is recorded as having a proven withdrawal at the timestamp given by `withdrawalProof.timestampRoot` + * This is to prevent the same withdrawal from being proven twice + * If this is a full withdrawal: + * Any withdrawal amount in excess of `MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR` is immediately withdrawn (see [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)) + * The remainder (`MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR`) must be withdrawn through the `DelegationManager's` withdrawal flow, but in the meantime is added to `EigenPod.withdrawableRestakedExecutionLayerGwei` + * If the amount being withdrawn is not equal to the current accounted-for validator balance, a `shareDelta` is calculated to be sent to ([`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate)). + * The validator's info is updated to reflect its `WITHDRAWN` status, and `restakedBalanceGwei` is set to 0 + * If this is a partial withdrawal: + * The withdrawal amount is added to `sumOfPartialWithdrawalsClaimedGwei` + * The withdrawal amount is withdrawn (via [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_WITHDRAWAL` +* All input array lengths MUST be equal +* `oracleTimestamp` MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) +* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` +* For each withdrawal being proven: + * The time of the withdrawal (`withdrawalProof.timestampRoot`) must be AFTER the `EigenPod's` `mostRecentWithdrawalTimestamp` + * The validator MUST be in either status: `ACTIVE` or `WITHDRAWN` + * `WITHDRAWN` is permitted because technically, it's possible to deposit additional ETH into an exited validator and have the ETH be auto-withdrawn. + * If the withdrawal is a full withdrawal, only `ACTIVE` is permitted + * The validator MUST NOT have already proven a withdrawal at the `withdrawalProof.timestampRoot` + * `BeaconChainProofs.verifyWithdrawal` MUST verify the provided `withdrawalFields` against the provided `beaconStateRoot` + * `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` + +#### `DelayedWithdrawalRouter.createDelayedWithdrawal` + +```solidity +function createDelayedWithdrawal( + address podOwner, + address recipient +) + external + payable + onlyEigenPod(podOwner) + onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) +``` + +Used by `EigenPods` to queue a withdrawal of beacon chain ETH that can be claimed by a `recipient` after `withdrawalDelayBlocks` have passed. + +*Effects*: +* Creates a `DelayedWithdrawal` for the `recipient` in the amount of `msg.value`, starting at the current block + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_DELAYED_WITHDRAWAL_CLAIMS` +* Caller MUST be the `EigenPod` associated with the `podOwner` +* `recipient` MUST NOT be zero + +#### `DelayedWithdrawalRouter.claimDelayedWithdrawals` + +```solidity +function claimDelayedWithdrawals( + address recipient, + uint256 maxNumberOfDelayedWithdrawalsToClaim +) + external + nonReentrant + onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) + +// (Uses `msg.sender` as `recipient`) +function claimDelayedWithdrawals( + uint256 maxNumberOfDelayedWithdrawalsToClaim +) + external + nonReentrant + onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) +``` + +After `withdrawalDelayBlocks`, withdrawals can be claimed using these methods. Claims may be processed on behalf of someone else by passing their address in as the `recipient`. Otherwise, claims are processed on behalf of `msg.sender`. + +This method loops over up to `maxNumberOfDelayedWithdrawalsToClaim` withdrawals, tallys each withdrawal amount, and sends the total to the `recipient`. + +*Effects*: +* Updates the `recipient's` `delayedWithdrawalsCompleted` +* Sends ETH from completed withdrawals to the `recipient` + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_DELAYED_WITHDRAWAL_CLAIMS` + +--- + +### System Configuration + +* [`EigenPodManager.updateBeaconChainOracle`](#eigenpodmanagerupdatebeaconchainoracle) +* [`DelayedWithdrawalRouter.setWithdrawalDelayBlocks`](#delayedwithdrawalroutersetwithdrawaldelayblocks) + +#### `EigenPodManager.updateBeaconChainOracle` + +```solidity +function updateBeaconChainOracle(IBeaconChainOracle newBeaconChainOracle) external onlyOwner +``` + +Allows the owner to update the address of the oracle used by `EigenPods` to retrieve beacon chain state roots (used when verifying beacon chain state proofs). + +*Effects*: +* Updates `EigenPodManager.beaconChainOracle` + +*Requirements*: +* Caller MUST be the owner + +#### `DelayedWithdrawalRouter.setWithdrawalDelayBlocks` + +```solidity +function setWithdrawalDelayBlocks(uint256 newValue) external onlyOwner +``` + +Allows the `DelayedWithdrawalRouter` to update the delay between withdrawal creation and claimability. + +The new delay can't exceed `MAX_WITHDRAWAL_DELAY_BLOCKS`. + +*Effects*: +* Updates `DelayedWithdrawalRouter.withdrawalDelayBlocks` + +*Requirements*: +* Caller MUST be the owner +* `newValue` MUST NOT be greater than `MAX_WITHDRAWAL_DELAY_BLOCKS` + +--- + +### Other Methods + +This section details various methods that don't fit well into other sections. + +Stakers' balance updates are accounted for when the Staker's `EigenPod` calls this method: +* [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) + +*For pods deployed prior to M2*, the following methods are callable: +* [`EigenPod.activateRestaking`](#eigenpodactivaterestaking) +* [`EigenPod.withdrawBeforeRestaking`](#eigenpodwithdrawbeforerestaking) + +The `EigenPod` also includes two token recovery mechanisms: +* [`EigenPod.withdrawNonBeaconChainETHBalanceWei`](#eigenpodwithdrawnonbeaconchainethbalancewei) +* [`EigenPod.recoverTokens`](#eigenpodrecovertokens) + +#### `EigenPodManager.recordBeaconChainETHBalanceUpdate` + +```solidity +function recordBeaconChainETHBalanceUpdate( + address podOwner, + int256 sharesDelta +) + external + onlyEigenPod(podOwner) + nonReentrant +``` + +This method is called by an `EigenPod` during a balance update or withdrawal. It accepts a positive or negative `sharesDelta`, which is added/subtracted against the Pod Owner's shares. + +If the Pod Owner is not in undelegation limbo and is delegated to an Operator, the `sharesDelta` is also sent to the `DelegationManager` to either increase or decrease the Operator's delegated shares. + +*Entry Points*: +* `EigenPod.verifyWithdrawalCredentials` +* `EigenPod.verifyBalanceUpdates` +* `EigenPod.verifyAndProcessWithdrawals` + +*Effects*: +* Adds or removes `sharesDelta` from the Pod Owner's shares +* If the Pod Owner is NOT in undelegation limbo: + * If `sharesDelta` is negative: see [`DelegationManager.decreaseDelegatedShares`](./DelegationManager.md#decreasedelegatedshares) + * If `sharesDelta` is positive: see [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) + +*Requirements*: +* Caller MUST be the `EigenPod` associated with the passed-in `podOwner` +* `sharesDelta`: + * MUST NOT be 0 + * If negative, `sharesDelta` MUST NOT remove more shares than the Pod Owner has + * MUST be a whole Gwei amount + +#### `EigenPod.activateRestaking` + +```solidity +function activateRestaking() + external + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) + onlyEigenPodOwner + hasNeverRestaked +``` + +Note: This method is only callable on pods deployed before M2. After M2, restaking is enabled by default. + +`activateRestaking` allows a Pod Owner to designate their pod (and any future ETH sent to it) as being restaked. Calling this method first withdraws any ETH in the `EigenPod` via the `DelayedWithdrawalRouter`, and then prevents further calls to `withdrawBeforeRestaking`. + +Withdrawing any future ETH sent via beacon chain withdrawal to the `EigenPod` requires providing beacon chain state proofs. However, ETH sent to the pod's `receive` function should be withdrawable without proofs (see [`withdrawNonBeaconChainETHBalanceWei`](#eigenpodwithdrawnonbeaconchainethbalancewei)). + +*Effects*: +* Sets `hasRestaked = true` +* Sets the pod's `nonBeaconChainETHBalanceWei` to 0 (only incremented in the fallback function) +* Updates the pod's most recent withdrawal timestamp to the current time +* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) + +*Requirements*: +* Caller MUST be the Pod Owner +* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` +* Pod MUST NOT have already activated restaking +* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) + +*As of M2*: restaking is automatically activated for newly-deployed `EigenPods` (`hasRestaked = true`). However, for `EigenPods` deployed *before* M2, restaking may not be active (unless the Pod Owner has called this method). + +#### `EigenPod.withdrawBeforeRestaking` + +```solidity +function withdrawBeforeRestaking() + external + onlyEigenPodOwner + hasNeverRestaked +``` + +Note: This method is only callable on pods deployed before M2. After M2, restaking is enabled by default. + +Allows the Pod Owner to withdraw any ETH in the `EigenPod` via the `DelayedWithdrawalRouter`, assuming restaking has not yet been activated. See [`EigenPod.activateRestaking`](#eigenpodactivaterestaking) for more details. + +*Effects*: +* Sets the pod's `nonBeaconChainETHBalanceWei` to 0 (only incremented in the fallback function) +* Updates the pod's most recent withdrawal timestamp to the current time +* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) + +*Requirements*: +* Caller MUST be the Pod Owner +* Pod MUST NOT have already activated restaking +* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) + +*As of M2*: restaking is automatically activated for newly-deployed `EigenPods`, making this method uncallable for pods deployed after M2. However, for `EigenPods` deployed *before* M2, restaking may not be active, and this method may be callable. + +#### `EigenPod.withdrawNonBeaconChainETHBalanceWei` + +```solidity +function withdrawNonBeaconChainETHBalanceWei( + address recipient, + uint256 amountToWithdraw +) + external + onlyEigenPodOwner + onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) +``` + +Allows the Pod Owner to withdraw ETH accidentally sent to the contract's `receive` function. + +The `receive` function updates `nonBeaconChainETHBalanceWei`, which this function uses to calculate how much can be withdrawn. + +Withdrawals from this function are sent via the `DelayedWithdrawalRouter`, and can be claimed by the passed-in `recipient`. + +*Effects:* +* Decrements `nonBeaconChainETHBalanceWei` +* Sends `amountToWithdraw` wei to [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) + +*Requirements:* +* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` +* Caller MUST be the Pod Owner +* `amountToWithdraw` MUST NOT be greater than the amount sent to the contract's `receive` function +* See [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) + +#### `EigenPod.recoverTokens` + +```solidity +function recoverTokens( + IERC20[] memory tokenList, + uint256[] memory amountsToWithdraw, + address recipient +) + external + onlyEigenPodOwner + onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) +``` + +Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`. + +*Effects:* +* Calls `transfer` on each of the ERC20's in `tokenList`, sending the corresponding `amountsToWithdraw` to the `recipient` + +*Requirements:* +* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` +* `tokenList` and `amountsToWithdraw` MUST have equal lengths +* Caller MUST be the Pod Owner diff --git a/docs/core/StrategyManager.md b/docs/core/StrategyManager.md new file mode 100644 index 000000000..a6fdb4cbd --- /dev/null +++ b/docs/core/StrategyManager.md @@ -0,0 +1,351 @@ +## StrategyManager + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`StrategyManager.sol`](../../src/contracts/core/StrategyManager.sol) | Singleton | Transparent proxy | +| [`StrategyBaseTVLLimits.sol`](../../src/contracts/strategies/StrategyBaseTVLLimits.sol) | 3 instances (for cbETH, rETH, stETH) | Transparent proxy | + +The primary function of the `StrategyManager` is to handle accounting for individual Stakers as they deposit and withdraw LSTs from their corresponding strategies. It is responsible for (i) allowing Stakers to deposit LSTs into the corresponding strategy, (ii) allowing the `DelegationManager` to remove shares when a Staker queues a withdrawal, and (iii) allowing the `DelegationManager` to complete a withdrawal by either adding shares back to the Staker or withdrawing the shares as tokens via the corresponding strategy. + +As of M2, three LSTs are supported and each has its own instance of `StrategyBaseTVLLimits`: cbETH, rETH, and stETH. Each `StrategyBaseTVLLimits` has two main functions (`deposit` and `withdraw`), both of which can only be called by the `StrategyManager`. These `StrategyBaseTVLLimits` contracts are fairly simple deposit/withdraw contracts that hold tokens deposited by Stakers. Because these strategies are essentially extensions of the `StrategyManager`, their functions are documented in this file (see below). + +#### High-level Concepts + +This document organizes methods according to the following themes (click each to be taken to the relevant section): +* [Depositing Into Strategies](#depositing-into-strategies) +* [Withdrawal Processing](#withdrawal-processing) +* [Strategies](#strategies) +* [System Configuration](#system-configuration) + +#### Important state variables + +* `mapping(address => mapping(IStrategy => uint256)) public stakerStrategyShares`: Tracks the current balance a Staker holds in a given strategy. Updated on deposit/withdraw. +* `mapping(address => IStrategy[]) public stakerStrategyList`: Maintains a list of the strategies a Staker holds a nonzero number of shares in. + * Updated as needed when Stakers deposit and withdraw: if a Staker has a zero balance in a Strategy, it is removed from the list. Likewise, if a Staker deposits into a Strategy and did not previously have a balance, it is added to the list. +* `mapping(IStrategy => bool) public strategyIsWhitelistedForDeposit`: The `strategyWhitelister` is (as of M2) a permissioned role that can be changed by the contract owner. The `strategyWhitelister` has currently whitelisted 3 `StrategyBaseTVLLimits` contracts in this mapping, one for each supported LST. +* `mapping(IStrategy => bool) public thirdPartyTransfersForbidden`: The `strategyWhitelister` can disable third party transfers for a given strategy. If `thirdPartyTransfersForbidden[strategy] == true`: + * Users cannot deposit on behalf of someone else (see [`depositIntoStrategyWithSignature`](#depositintostrategywithsignature)). + * Users cannot withdraw on behalf of someone else. (see [`DelegationManager.queueWithdrawals`](./DelegationManager.md#queuewithdrawals)) + +#### Helpful definitions + +* `stakerStrategyListLength(address staker) -> (uint)`: + * Gives `stakerStrategyList[staker].length` + * Used (especially by the `DelegationManager`) to determine whether a Staker has shares in any strategy in the `StrategyManager` (will be 0 if not) + +--- + +### Depositing Into Strategies + +The following methods are called by Stakers as they (i) deposit LSTs into strategies to receive shares: + +* [`StrategyManager.depositIntoStrategy`](#depositintostrategy) +* [`StrategyManager.depositIntoStrategyWithSignature`](#depositintostrategywithsignature) + +Withdrawals are performed through the `DelegationManager` (see [`DelegationManager.md`](./DelegationManager.md)). + +#### `depositIntoStrategy` + +```solidity +function depositIntoStrategy( + IStrategy strategy, + IERC20 token, + uint256 amount +) + external + onlyWhenNotPaused(PAUSED_DEPOSITS) + onlyNotFrozen(msg.sender) + nonReentrant + returns (uint256 shares) +``` + +Allows a Staker to deposit some `amount` of `token` into the specified `strategy` in exchange for shares of that strategy. The underlying `strategy` must be one of the three whitelisted `StrategyBaseTVLLimits` instances, and the `token` being deposited must correspond to that `strategy's` underlying token (cbETH, rETH, or stETH). + +The number of shares received is calculated by the `strategy` using an internal exchange rate that depends on the previous number of tokens deposited. + +If the Staker is delegated to an Operator, the Operator's delegated shares are increased in the `DelegationManager`. + +*Effects*: +* `token.safeTransferFrom`: Transfers `amount` of `token` to `strategy` on behalf of the caller. +* See [`StrategyBaseTVLLimits.deposit`](#strategybasetvllimitsdeposit) +* `StrategyManager` awards the Staker with the newly-created shares +* See [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_DEPOSITS` +* Caller MUST allow at least `amount` of `token` to be transferred by `StrategyManager` to the strategy +* `strategy` in question MUST be whitelisted for deposits. +* See [`StrategyBaseTVLLimits.deposit`](#strategybasetvllimitsdeposit) + +#### `depositIntoStrategyWithSignature` + +```solidity +function depositIntoStrategyWithSignature( + IStrategy strategy, + IERC20 token, + uint256 amount, + address staker, + uint256 expiry, + bytes memory signature +) + external + onlyWhenNotPaused(PAUSED_DEPOSITS) + onlyNotFrozen(staker) + nonReentrant + returns (uint256 shares) +``` + +*Effects*: See `depositIntoStrategy` above. Additionally: +* The Staker's nonce is incremented + +*Requirements*: See `depositIntoStrategy` above. Additionally: +* Caller MUST provide a valid, unexpired signature over the correct fields +* `thirdPartyTransfersForbidden[strategy]` MUST be false + +--- + +### Withdrawal Processing + +These methods are callable ONLY by the `DelegationManager`, and are used when processing undelegations and withdrawals: +* [`StrategyManager.removeShares`](#removeshares) +* [`StrategyManager.addShares`](#addshares) +* [`StrategyManager.withdrawSharesAsTokens`](#withdrawsharesastokens) + +See [`DelegationManager.md`](./DelegationManager.md) for more context on how these methods are used. + +#### `removeShares` + +```solidity +function removeShares( + address staker, + IStrategy strategy, + uint256 shares +) + external + onlyDelegationManager +``` + +The `DelegationManager` calls this method when a Staker queues a withdrawal (or undelegates, which also queues a withdrawal). The shares are removed while the withdrawal is in the queue, and when the queue completes, the shares will either be re-awarded or withdrawn as tokens (`addShares` and `withdrawSharesAsTokens`, respectively). + +The Staker's share balance for the `strategy` is decreased by the removed `shares`. If this causes the Staker's share balance to hit zero, the `strategy` is removed from the Staker's strategy list. + +*Entry Points*: +* `DelegationManager.undelegate` +* `DelegationManager.queueWithdrawals` + +*Effects*: +* The Staker's share balance for the given `strategy` is decreased by the given `shares` + * If this causes the balance to hit zero, the `strategy` is removed from the Staker's strategy list + +*Requirements*: +* Caller MUST be the `DelegationManager` +* `staker` parameter MUST NOT be zero +* `shares` parameter MUST NOT be zero +* `staker` MUST have at least `shares` balance for the given `strategy` + +#### `addShares` + +```solidity +function addShares( + address staker, + IStrategy strategy, + uint256 shares +) + external + onlyDelegationManager +``` + +The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as "shares" (rather than as the underlying tokens). In this case, the `shares` originally removed (via `removeShares`) are awarded to the `staker` passed in by the `DelegationManager`. + +*Entry Points*: +* `DelegationManager.completeQueuedWithdrawal` +* `DelegationManager.completeQueuedWithdrawals` + +*Effects*: +* The `staker's` share balance for the given `strategy` is increased by `shares` + * If the prior balance was zero, the `strategy` is added to the `staker's` strategy list + +*Requirements*: +* Caller MUST be the `DelegationManager` +* `staker` parameter MUST NOT be zero +* `shares` parameter MUST NOT be zero + +#### `withdrawSharesAsTokens` + +```solidity +function withdrawSharesAsTokens( + address recipient, + IStrategy strategy, + uint shares, + IERC20 token +) + external + onlyDelegationManager +``` + +The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as the tokens underlying the shares. In this case, the `shares` originally removed (via `removeShares`) are converted to tokens within the `strategy` and sent to the `recipient`. + +*Entry Points*: +* `DelegationManager.completeQueuedWithdrawal` +* `DelegationManager.completeQueuedWithdrawals` + +*Effects*: +* Calls [`StrategyBaseTVLLimits.withdraw`](#strategybasetvllimitswithdraw) + +*Requirements*: +* Caller MUST be the `DelegationManager` +* See [`StrategyBaseTVLLimits.withdraw`](#strategybasetvllimitswithdraw) + +--- + +### Strategies + +`StrategyBaseTVLLimits` only has two methods of note, and both can only be called by the `StrategyManager`. Documentation for these methods are included below, rather than in a separate file: +* [`StrategyBaseTVLLimits.deposit`](#strategybasetvllimitsdeposit) +* [`StrategyBaseTVLLimits.withdraw`](#strategybasetvllimitswithdraw) + +#### `StrategyBaseTVLLimits.deposit` + +```solidity +function deposit( + IERC20 token, + uint256 amount +) + external + onlyWhenNotPaused(PAUSED_DEPOSITS) + onlyStrategyManager + returns (uint256 newShares) +``` + +The `StrategyManager` calls this method when Stakers deposit LSTs into a strategy. At the time this method is called, the tokens have already been transferred to the strategy. The role of this method is to (i) calculate the number of shares the deposited tokens represent according to the exchange rate, and (ii) add the new shares to the strategy's recorded total shares. + +The new shares created are returned to the `StrategyManager` to be added to the Staker's strategy share balance. + +*Entry Points*: +* `StrategyManager.depositIntoStrategy` +* `StrategyManager.depositIntoStrategyWithSignature` + +*Effects*: +* `StrategyBaseTVLLimits.totalShares` is increased to account for the new shares created by the deposit + +*Requirements*: +* Caller MUST be the `StrategyManager` +* Pause status MUST NOT be set: `PAUSED_DEPOSITS` +* The passed-in `token` MUST match the strategy's `underlyingToken` +* The token amount being deposited MUST NOT exceed the per-deposit cap +* After deposit, the strategy's current token balance MUST NOT exceed the total-deposit cap +* When converted to shares via the strategy's exchange rate, the `amount` of `token` deposited MUST represent at least 1 new share for the depositor + +#### `StrategyBaseTVLLimits.withdraw` + +```solidity +function withdraw( + address recipient, + IERC20 token, + uint256 amountShares +) + external + onlyWhenNotPaused(PAUSED_WITHDRAWALS) + onlyStrategyManager +``` + +The `StrategyManager` calls this method when a queued withdrawal is completed and the withdrawer has specified they would like to convert their withdrawn shares to tokens. + +This method converts the withdrawal shares back into tokens using the strategy's exchange rate. The strategy's total shares are decreased to reflect the withdrawal before transferring the tokens to the `recipient`. + +*Entry Points*: +* `DelegationManager.completeQueuedWithdrawal` +* `DelegationManager.completeQueuedWithdrawals` + +*Effects*: +* `StrategyBaseTVLLimits.totalShares` is decreased to account for the shares being withdrawn +* `underlyingToken.safeTransfer` is called to transfer the tokens to the `recipient` + +*Requirements*: +* Caller MUST be the `StrategyManager` +* Pause status MUST NOT be set: `PAUSED_WITHDRAWALS` +* The passed-in `token` MUST match the strategy's `underlyingToken` +* The `amountShares` being withdrawn MUST NOT exceed the `totalShares` in the strategy +* The tokens represented by `amountShares` MUST NOT exceed the strategy's token balance + +--- + +### System Configuration + +* [`StrategyManager.setStrategyWhitelister`](#setstrategywhitelister) +* [`StrategyManager.addStrategiesToDepositWhitelist`](#addstrategiestodepositwhitelist) +* [`StrategyManager.removeStrategiesFromDepositWhitelist`](#removestrategiesfromdepositwhitelist) +* [`StrategyManager.setThirdPartyTransfersForbidden`](#setthirdpartytransfersforbidden) + +#### `setStrategyWhitelister` + +```solidity +function setStrategyWhitelister(address newStrategyWhitelister) external onlyOwner +``` + +Allows the `owner` to update the Strategy Whitelister address. + +*Effects*: +* Updates `StrategyManager.strategyWhitelister` + +*Requirements*: +* Caller MUST be the `owner` + +#### `addStrategiesToDepositWhitelist` + +```solidity +function addStrategiesToDepositWhitelist( + IStrategy[] calldata strategiesToWhitelist, + bool[] calldata thirdPartyTransfersForbiddenValues +) + external + onlyStrategyWhitelister +``` + +Allows the Strategy Whitelister to add any number of strategies to the `StrategyManager` whitelist, and configure whether third party transfers are enabled or disabled for each. Strategies on the whitelist are eligible for deposit via `depositIntoStrategy`. + +*Effects*: +* Adds entries to `StrategyManager.strategyIsWhitelistedForDeposit` +* Sets `thirdPartyTransfersForbidden` for each added strategy + +*Requirements*: +* Caller MUST be the `strategyWhitelister` + +#### `removeStrategiesFromDepositWhitelist` + +```solidity +function removeStrategiesFromDepositWhitelist( + IStrategy[] calldata strategiesToRemoveFromWhitelist +) + external + onlyStrategyWhitelister +``` + +Allows the Strategy Whitelister to remove any number of strategies from the `StrategyManager` whitelist. The removed strategies will no longer be eligible for deposit via `depositIntoStrategy`. However, withdrawals for previously-whitelisted strategies may still be initiated and completed, as long as the Staker has shares to withdraw. + +*Effects*: +* Removes entries from `StrategyManager.strategyIsWhitelistedForDeposit` + +*Requirements*: +* Caller MUST be the `strategyWhitelister` + +#### `setThirdPartyTransfersForbidden` + +```solidity +function setThirdPartyTransfersForbidden( + IStrategy strategy, + bool value +) + external + onlyStrategyWhitelister +``` + +Allows the Strategy Whitelister to enable or disable third-party transfers for any `strategy`. If third-party transfers are disabled: +* Deposits via [`depositIntoStrategyWithSiganture`](#depositintostrategywithsignature) are disabled. +* Withdrawals to a different address via [`DelegationManager.queueWithdrawals`](./DelegationManager.md#queuewithdrawals) are disabled. + +*Effects*: +* Sets `thirdPartyTransfersForbidden[strategy]`, even if that strategy is not currently whitelisted + +*Requirements*: +* Caller MUST be the `strategyWhitelister` \ No newline at end of file diff --git a/docs/core/proofs/BeaconChainProofs.md b/docs/core/proofs/BeaconChainProofs.md new file mode 100644 index 000000000..c174ef942 --- /dev/null +++ b/docs/core/proofs/BeaconChainProofs.md @@ -0,0 +1,66 @@ +### Important Details About Proofs +#### How Indices Are Calculated +To prove a leaf in a merkle tree, you need several things - A proof, the leaf, the index of that leaf in a list of leaves and the root you are proving against. The beacon state can be represented as several merkle trees stacked on top of each other, i.e., each leaf in the topmost tree is a root of another tree and so on. This means that theoretically, proving most things about the beacon state involves making multiple proofs about each of the merkle trees that are stacked on top of each other. + +However there is a way we can combine these proofs into a single proof. This is by concatenating each of the individual proofs into one large proof and proving that against the topmost root. However, how do we calculate the "index" for this mega-proof? + +The idea is simple, in a Merkle tree, every node has two children: left (or 0) and right (or 1). Starting from the root and moving down to a specific leaf, you can interpret each bit in the binary representation of the leaf's index as an instruction to traverse left (for 0) or right (for 1). The length of a binary representation of an index is just `log(num_leaves) = height_of_the tree`. + +Taking an example, let's say I had one merkle tree A whose Nth leaf was the root of merkle tree B. So to calculate the index for the Mth leaf in B against the root of A, the index would be: +`index_B_against_A = N << height_of_merkle_tree_B | M`. In the image below, the blue nodes indicate the path we are trying to prove, the pink nodes are nodes in merkle tree B, which is a subtree of merkle tree A. + +![Sample Merkle Tree](../../images/samplemerkle.png) + +Below are the explanations of each individual proof function that we use to prove various attributes about the state of the beacon chain and validators who are restaking via the EigenPods subprotocol. +#### `BeaconChainProofs.verifyValidatorFields` + +```solidity +function verifyValidatorFields( + bytes32 beaconStateRoot, + bytes32[] calldata validatorFields, + bytes calldata validatorFieldsProof, + uint40 validatorIndex +) + internal +``` +Verifies the proof of a provided [validator container](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator) against the beacon state root. This proof can be used to verify any field in the validator container. In the EigenPods system, this proof is used to prove a validator's withdrawal credentials as well as their effective balance. Below is a diagram that illustrates exactly how the proof is structured relative to the [beacon state object](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#beaconstate). + +![Verify Validator Fields Proof Structure](../../images/Withdrawal_Credential_Proof.png) + + +#### `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` + +```solidity +function verifyStateRootAgainstLatestBlockRoot( + bytes32 latestBlockRoot, + bytes32 beaconStateRoot, + bytes calldata stateRootProof +) + internal +``` +Verifies the proof of a beacon state root against the oracle provided block root. Every [beacon block](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblock) in the beacon state contains the state root corresponding with that block. Thus to prove anything against a state root, we must first prove the state root against the corresponding oracle block root. + +![Verify State Root Proof Structure](../../images/staterootproof.png) + + +#### `BeaconChainProofs.verifyWithdrawal` + +```solidity +function verifyWithdrawal( + bytes32 beaconStateRoot, + bytes32[] calldata withdrawalFields, + WithdrawalProof calldata withdrawalProof, + uint64 denebForkTimestamp +) + internal +``` +Verifies a withdrawal, either [full or partial](https://eth2book.info/capella/part2/deposits-withdrawals/withdrawal-processing/#partial-and-full-withdrawals), of a validator. There are a maximum of 16 withdrawals per block in the consensus layer. This proof proves the inclusion of a given [withdrawal](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#withdrawal) in the block for a given slot. + +One important note is that we use [`historical_summaries`](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#historical-summaries-updates) to prove the blocks that contain withdrawals. Each new [historical summary](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#historicalsummary) is added every 8192 slots, i.e., if `slot % 8192 = 0`, then `slot.state_roots` and `slot.block_roots` are merkleized and are used to create the latest `historical_summaries` entry. + +This method also uses `denebForkTimestamp` to determine the height of the execution payload header field tree. + +![Verify Withdrawal Proof Structure](../../images/Withdrawal_Proof.png) + + + diff --git a/docs/docgen/core/DelegationManager.md b/docs/docgen/core/DelegationManager.md deleted file mode 100644 index a397526f8..000000000 --- a/docs/docgen/core/DelegationManager.md +++ /dev/null @@ -1,208 +0,0 @@ -# Solidity API - -## DelegationManager - -This is the contract for delegation in EigenLayer. The main functionalities of this contract are -- enabling anyone to register as an operator in EigenLayer -- allowing new operators to provide a DelegationTerms-type contract, which may mediate their interactions with stakers who delegate to them -- enabling any staker to delegate its stake to the operator of its choice -- enabling a staker to undelegate its assets from an operator (performed as part of the withdrawal process, initiated through the StrategyManager) - -### PAUSED_NEW_DELEGATION - -```solidity -uint8 PAUSED_NEW_DELEGATION -``` - -### ERC1271_MAGICVALUE - -```solidity -bytes4 ERC1271_MAGICVALUE -``` - -### ORIGINAL_CHAIN_ID - -```solidity -uint256 ORIGINAL_CHAIN_ID -``` - -### onlyStrategyManager - -```solidity -modifier onlyStrategyManager() -``` - -Simple permission for functions that are only callable by the StrategyManager contract. - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract ISlasher _slasher) public -``` - -### OnDelegationReceivedCallFailure - -```solidity -event OnDelegationReceivedCallFailure(contract IDelegationTerms delegationTerms, bytes32 returnData) -``` - -_Emitted when a low-level call to `delegationTerms.onDelegationReceived` fails, returning `returnData`_ - -### OnDelegationWithdrawnCallFailure - -```solidity -event OnDelegationWithdrawnCallFailure(contract IDelegationTerms delegationTerms, bytes32 returnData) -``` - -_Emitted when a low-level call to `delegationTerms.onDelegationWithdrawn` fails, returning `returnData`_ - -### RegisterAsOperator - -```solidity -event RegisterAsOperator(address operator, contract IDelegationTerms delegationTerms) -``` - -_Emitted when an entity registers itself as an operator in the DelegationManager_ - -### initialize - -```solidity -function initialize(address initialOwner, contract IPauserRegistry _pauserRegistry, uint256 initialPausedStatus) external -``` - -### registerAsOperator - -```solidity -function registerAsOperator(contract IDelegationTerms dt) external -``` - -This will be called by an operator to register itself as an operator that stakers can choose to delegate to. - -_An operator can set `dt` equal to their own address (or another EOA address), in the event that they want to split payments -in a more 'trustful' manner. -In the present design, once set, there is no way for an operator to ever modify the address of their DelegationTerms contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| dt | contract IDelegationTerms | is the `DelegationTerms` contract that the operator has for those who delegate to them. | - -### delegateTo - -```solidity -function delegateTo(address operator) external -``` - -@notice This will be called by a staker to delegate its assets to some operator. - @param operator is the operator to whom staker (msg.sender) is delegating its assets - -### delegateToBySignature - -```solidity -function delegateToBySignature(address staker, address operator, uint256 expiry, bytes signature) external -``` - -Delegates from `staker` to `operator`. - -_requires that: -1) if `staker` is an EOA, then `signature` is valid ECDSA signature from `staker`, indicating their intention for this action -2) if `staker` is a contract, then `signature` must will be checked according to EIP-1271_ - -### undelegate - -```solidity -function undelegate(address staker) external -``` - -Undelegates `staker` from the operator who they are delegated to. -Callable only by the StrategyManager - -_Should only ever be called in the event that the `staker` has no active deposits in EigenLayer._ - -### increaseDelegatedShares - -```solidity -function increaseDelegatedShares(address staker, contract IStrategy strategy, uint256 shares) external -``` - -Increases the `staker`'s delegated shares in `strategy` by `shares, typically called when the staker has further deposits into EigenLayer - -_Callable only by the StrategyManager_ - -### decreaseDelegatedShares - -```solidity -function decreaseDelegatedShares(address staker, contract IStrategy[] strategies, uint256[] shares) external -``` - -Decreases the `staker`'s delegated shares in each entry of `strategies` by its respective `shares[i]`, typically called when the staker withdraws from EigenLayer - -_Callable only by the StrategyManager_ - -### _delegationReceivedHook - -```solidity -function _delegationReceivedHook(contract IDelegationTerms dt, address staker, contract IStrategy[] strategies, uint256[] shares) internal -``` - -Makes a low-level call to `dt.onDelegationReceived(staker, strategies, shares)`, ignoring reverts and with a gas budget -equal to `LOW_LEVEL_GAS_BUDGET` (a constant defined in this contract). - -_*If* the low-level call fails, then this function emits the event `OnDelegationReceivedCallFailure(dt, returnData)`, where -`returnData` is *only the first 32 bytes* returned by the call to `dt`._ - -### _delegationWithdrawnHook - -```solidity -function _delegationWithdrawnHook(contract IDelegationTerms dt, address staker, contract IStrategy[] strategies, uint256[] shares) internal -``` - -Makes a low-level call to `dt.onDelegationWithdrawn(staker, strategies, shares)`, ignoring reverts and with a gas budget -equal to `LOW_LEVEL_GAS_BUDGET` (a constant defined in this contract). - -_*If* the low-level call fails, then this function emits the event `OnDelegationReceivedCallFailure(dt, returnData)`, where -`returnData` is *only the first 32 bytes* returned by the call to `dt`._ - -### _delegate - -```solidity -function _delegate(address staker, address operator) internal -``` - -Internal function implementing the delegation *from* `staker` *to* `operator`. - -_Ensures that the operator has registered as a delegate (`address(dt) != address(0)`), verifies that `staker` is not already -delegated, and records the new delegation._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| staker | address | The address to delegate *from* -- this address is delegating control of its own assets. | -| operator | address | The address to delegate *to* -- this address is being given power to place the `staker`'s assets at risk on services | - -### isDelegated - -```solidity -function isDelegated(address staker) public view returns (bool) -``` - -Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise. - -### isNotDelegated - -```solidity -function isNotDelegated(address staker) public view returns (bool) -``` - -Returns 'true' if `staker` is *not* actively delegated, and 'false' otherwise. - -### isOperator - -```solidity -function isOperator(address operator) public view returns (bool) -``` - -Returns if an operator can be delegated to, i.e. it has called `registerAsOperator`. - diff --git a/docs/docgen/core/DelegationManagerStorage.md b/docs/docgen/core/DelegationManagerStorage.md deleted file mode 100644 index 58b0fe0f9..000000000 --- a/docs/docgen/core/DelegationManagerStorage.md +++ /dev/null @@ -1,102 +0,0 @@ -# Solidity API - -## DelegationManagerStorage - -This storage contract is separate from the logic to simplify the upgrade process. - -### LOW_LEVEL_GAS_BUDGET - -```solidity -uint256 LOW_LEVEL_GAS_BUDGET -``` - -Gas budget provided in calls to DelegationTerms contracts - -### DOMAIN_TYPEHASH - -```solidity -bytes32 DOMAIN_TYPEHASH -``` - -The EIP-712 typehash for the contract's domain - -### DELEGATION_TYPEHASH - -```solidity -bytes32 DELEGATION_TYPEHASH -``` - -The EIP-712 typehash for the delegation struct used by the contract - -### DOMAIN_SEPARATOR - -```solidity -bytes32 DOMAIN_SEPARATOR -``` - -EIP-712 Domain separator - -### strategyManager - -```solidity -contract IStrategyManager strategyManager -``` - -The StrategyManager contract for EigenLayer - -### slasher - -```solidity -contract ISlasher slasher -``` - -The Slasher contract for EigenLayer - -### operatorShares - -```solidity -mapping(address => mapping(contract IStrategy => uint256)) operatorShares -``` - -Mapping: operator => strategy => total number of shares in the strategy delegated to the operator - -### delegationTerms - -```solidity -mapping(address => contract IDelegationTerms) delegationTerms -``` - -Mapping: operator => delegation terms contract - -### delegatedTo - -```solidity -mapping(address => address) delegatedTo -``` - -Mapping: staker => operator whom the staker has delegated to - -### nonces - -```solidity -mapping(address => uint256) nonces -``` - -Mapping: delegator => number of signed delegation nonce (used in delegateToBySignature) - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract ISlasher _slasher) internal -``` - -### __gap - -```solidity -uint256[46] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/core/Slasher.md b/docs/docgen/core/Slasher.md deleted file mode 100644 index 8fa9dd3ae..000000000 --- a/docs/docgen/core/Slasher.md +++ /dev/null @@ -1,470 +0,0 @@ -# Solidity API - -## Slasher - -This contract specifies details on slashing. The functionalities are: -- adding contracts who have permission to perform slashing, -- revoking permission for slashing from specified contracts, -- tracking historic stake updates to ensure that withdrawals can only be completed once no middlewares have slashing rights -over the funds being withdrawn - -### HEAD - -```solidity -uint256 HEAD -``` - -### PAUSED_OPT_INTO_SLASHING - -```solidity -uint8 PAUSED_OPT_INTO_SLASHING -``` - -### PAUSED_FIRST_STAKE_UPDATE - -```solidity -uint8 PAUSED_FIRST_STAKE_UPDATE -``` - -### PAUSED_NEW_FREEZING - -```solidity -uint8 PAUSED_NEW_FREEZING -``` - -### strategyManager - -```solidity -contract IStrategyManager strategyManager -``` - -The central StrategyManager contract of EigenLayer - -### delegation - -```solidity -contract IDelegationManager delegation -``` - -The DelegationManager contract of EigenLayer - -### _whitelistedContractDetails - -```solidity -mapping(address => mapping(address => struct ISlasher.MiddlewareDetails)) _whitelistedContractDetails -``` - -### frozenStatus - -```solidity -mapping(address => bool) frozenStatus -``` - -### MAX_CAN_SLASH_UNTIL - -```solidity -uint32 MAX_CAN_SLASH_UNTIL -``` - -### _operatorToWhitelistedContractsByUpdate - -```solidity -mapping(address => struct StructuredLinkedList.List) _operatorToWhitelistedContractsByUpdate -``` - -operator => a linked list of the addresses of the whitelisted middleware with permission to slash the operator, i.e. which -the operator is serving. Sorted by the block at which they were last updated (content of updates below) in ascending order. -This means the 'HEAD' (i.e. start) of the linked list will have the stalest 'updateBlock' value. - -### _operatorToMiddlewareTimes - -```solidity -mapping(address => struct ISlasher.MiddlewareTimes[]) _operatorToMiddlewareTimes -``` - -operator => - [ - ( - the least recent update block of all of the middlewares it's serving/served, - latest time that the stake bonded at that update needed to serve until - ) - ] - -### MiddlewareTimesAdded - -```solidity -event MiddlewareTimesAdded(address operator, uint256 index, uint32 stalestUpdateBlock, uint32 latestServeUntilBlock) -``` - -Emitted when a middleware times is added to `operator`'s array. - -### OptedIntoSlashing - -```solidity -event OptedIntoSlashing(address operator, address contractAddress) -``` - -Emitted when `operator` begins to allow `contractAddress` to slash them. - -### SlashingAbilityRevoked - -```solidity -event SlashingAbilityRevoked(address operator, address contractAddress, uint32 contractCanSlashOperatorUntilBlock) -``` - -Emitted when `contractAddress` signals that it will no longer be able to slash `operator` after the `contractCanSlashOperatorUntilBlock`. - -### OperatorFrozen - -```solidity -event OperatorFrozen(address slashedOperator, address slashingContract) -``` - -Emitted when `slashingContract` 'freezes' the `slashedOperator`. - -_The `slashingContract` must have permission to slash the `slashedOperator`, i.e. `canSlash(slasherOperator, slashingContract)` must return 'true'._ - -### FrozenStatusReset - -```solidity -event FrozenStatusReset(address previouslySlashedAddress) -``` - -Emitted when `previouslySlashedAddress` is 'unfrozen', allowing them to again move deposited funds within EigenLayer. - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IDelegationManager _delegation) public -``` - -### onlyRegisteredForService - -```solidity -modifier onlyRegisteredForService(address operator) -``` - -Ensures that the operator has opted into slashing by the caller, and that the caller has never revoked its slashing ability. - -### initialize - -```solidity -function initialize(address initialOwner, contract IPauserRegistry _pauserRegistry, uint256 initialPausedStatus) external -``` - -### optIntoSlashing - -```solidity -function optIntoSlashing(address contractAddress) external -``` - -Gives the `contractAddress` permission to slash the funds of the caller. - -_Typically, this function must be called prior to registering for a middleware._ - -### freezeOperator - -```solidity -function freezeOperator(address toBeFrozen) external -``` - -Used for 'slashing' a certain operator. - -_Technically the operator is 'frozen' (hence the name of this function), and then subject to slashing pending a decision by a human-in-the-loop. -The operator must have previously given the caller (which should be a contract) the ability to slash them, through a call to `optIntoSlashing`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| toBeFrozen | address | The operator to be frozen. | - -### resetFrozenStatus - -```solidity -function resetFrozenStatus(address[] frozenAddresses) external -``` - -Removes the 'frozen' status from each of the `frozenAddresses` - -_Callable only by the contract owner (i.e. governance)._ - -### recordFirstStakeUpdate - -```solidity -function recordFirstStakeUpdate(address operator, uint32 serveUntilBlock) external -``` - -this function is a called by middlewares during an operator's registration to make sure the operator's stake at registration - is slashable until serveUntilBlock - -_adds the middleware's slashing contract to the operator's linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the operator whose stake update is being recorded | -| serveUntilBlock | uint32 | the block until which the operator's stake at the current block is slashable | - -### recordStakeUpdate - -```solidity -function recordStakeUpdate(address operator, uint32 updateBlock, uint32 serveUntilBlock, uint256 insertAfter) external -``` - -this function is a called by middlewares during a stake update for an operator (perhaps to free pending withdrawals) - to make sure the operator's stake at updateBlock is slashable until serveUntilBlock - -_insertAfter should be calculated offchain before making the transaction that calls this. this is subject to race conditions, - but it is anticipated to be rare and not detrimental._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the operator whose stake update is being recorded | -| updateBlock | uint32 | the block for which the stake update is being recorded | -| serveUntilBlock | uint32 | the block until which the operator's stake at updateBlock is slashable | -| insertAfter | uint256 | the element of the operators linked list that the currently updating middleware should be inserted after | - -### recordLastStakeUpdateAndRevokeSlashingAbility - -```solidity -function recordLastStakeUpdateAndRevokeSlashingAbility(address operator, uint32 serveUntilBlock) external -``` - -this function is a called by middlewares during an operator's deregistration to make sure the operator's stake at deregistration - is slashable until serveUntilBlock - -_removes the middleware's slashing contract to the operator's linked list and revokes the middleware's (i.e. caller's) ability to -slash `operator` once `serveUntilBlock` is reached_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the operator whose stake update is being recorded | -| serveUntilBlock | uint32 | the block until which the operator's stake at the current block is slashable | - -### contractCanSlashOperatorUntilBlock - -```solidity -function contractCanSlashOperatorUntilBlock(address operator, address serviceContract) external view returns (uint32) -``` - -Returns the block until which `serviceContract` is allowed to slash the `operator`. - -### latestUpdateBlock - -```solidity -function latestUpdateBlock(address operator, address serviceContract) external view returns (uint32) -``` - -Returns the block at which the `serviceContract` last updated its view of the `operator`'s stake - -### whitelistedContractDetails - -```solidity -function whitelistedContractDetails(address operator, address serviceContract) external view returns (struct ISlasher.MiddlewareDetails) -``` - -### isFrozen - -```solidity -function isFrozen(address staker) external view returns (bool) -``` - -Used to determine whether `staker` is actively 'frozen'. If a staker is frozen, then they are potentially subject to -slashing of their funds, and cannot cannot deposit or withdraw from the strategyManager until the slashing process is completed -and the staker's status is reset (to 'unfrozen'). - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| staker | address | The staker of interest. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | Returns 'true' if `staker` themselves has their status set to frozen, OR if the staker is delegated to an operator who has their status set to frozen. Otherwise returns 'false'. | - -### canSlash - -```solidity -function canSlash(address toBeSlashed, address slashingContract) public view returns (bool) -``` - -Returns true if `slashingContract` is currently allowed to slash `toBeSlashed`. - -### canWithdraw - -```solidity -function canWithdraw(address operator, uint32 withdrawalStartBlock, uint256 middlewareTimesIndex) external view returns (bool) -``` - -Returns 'true' if `operator` can currently complete a withdrawal started at the `withdrawalStartBlock`, with `middlewareTimesIndex` used -to specify the index of a `MiddlewareTimes` struct in the operator's list (i.e. an index in `_operatorToMiddlewareTimes[operator]`). The specified -struct is consulted as proof of the `operator`'s ability (or lack thereof) to complete the withdrawal. -This function will return 'false' if the operator cannot currently complete a withdrawal started at the `withdrawalStartBlock`, *or* in the event -that an incorrect `middlewareTimesIndex` is supplied, even if one or more correct inputs exist. - -_The correct `middlewareTimesIndex` input should be computable off-chain._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | Either the operator who queued the withdrawal themselves, or if the withdrawing party is a staker who delegated to an operator, this address is the operator *who the staker was delegated to* at the time of the `withdrawalStartBlock`. | -| withdrawalStartBlock | uint32 | The block number at which the withdrawal was initiated. | -| middlewareTimesIndex | uint256 | Indicates an index in `_operatorToMiddlewareTimes[operator]` to consult as proof of the `operator`'s ability to withdraw | - -### operatorToMiddlewareTimes - -```solidity -function operatorToMiddlewareTimes(address operator, uint256 arrayIndex) external view returns (struct ISlasher.MiddlewareTimes) -``` - -Getter function for fetching `_operatorToMiddlewareTimes[operator][arrayIndex]`. - -### middlewareTimesLength - -```solidity -function middlewareTimesLength(address operator) external view returns (uint256) -``` - -Getter function for fetching `_operatorToMiddlewareTimes[operator].length`. - -### getMiddlewareTimesIndexBlock - -```solidity -function getMiddlewareTimesIndexBlock(address operator, uint32 index) external view returns (uint32) -``` - -Getter function for fetching `_operatorToMiddlewareTimes[operator][index].stalestUpdateBlock`. - -### getMiddlewareTimesIndexServeUntilBlock - -```solidity -function getMiddlewareTimesIndexServeUntilBlock(address operator, uint32 index) external view returns (uint32) -``` - -Getter function for fetching `_operatorToMiddlewareTimes[operator][index].latestServeUntilBlock`. - -### operatorWhitelistedContractsLinkedListSize - -```solidity -function operatorWhitelistedContractsLinkedListSize(address operator) external view returns (uint256) -``` - -Getter function for fetching `_operatorToWhitelistedContractsByUpdate[operator].size`. - -### operatorWhitelistedContractsLinkedListEntry - -```solidity -function operatorWhitelistedContractsLinkedListEntry(address operator, address node) external view returns (bool, uint256, uint256) -``` - -Getter function for fetching a single node in the operator's linked list (`_operatorToWhitelistedContractsByUpdate[operator]`). - -### getCorrectValueForInsertAfter - -```solidity -function getCorrectValueForInsertAfter(address operator, uint32 updateBlock) public view returns (uint256) -``` - -A search routine for finding the correct input value of `insertAfter` to `recordStakeUpdate` / `_updateMiddlewareList`. - -_Used within this contract only as a fallback in the case when an incorrect value of `insertAfter` is supplied as an input to `_updateMiddlewareList`. -The return value should *either* be 'HEAD' (i.e. zero) in the event that the node being inserted in the linked list has an `updateBlock` -that is less than the HEAD of the list, *or* the return value should specify the last `node` in the linked list for which -`_whitelistedContractDetails[operator][node].latestUpdateBlock <= updateBlock`, -i.e. the node such that the *next* node either doesn't exist, -OR -`_whitelistedContractDetails[operator][nextNode].latestUpdateBlock > updateBlock`._ - -### getPreviousWhitelistedContractByUpdate - -```solidity -function getPreviousWhitelistedContractByUpdate(address operator, uint256 node) external view returns (bool, uint256) -``` - -gets the node previous to the given node in the operators middleware update linked list - -_used in offchain libs for updating stakes_ - -### _optIntoSlashing - -```solidity -function _optIntoSlashing(address operator, address contractAddress) internal -``` - -### _revokeSlashingAbility - -```solidity -function _revokeSlashingAbility(address operator, address contractAddress, uint32 serveUntilBlock) internal -``` - -### _freezeOperator - -```solidity -function _freezeOperator(address toBeFrozen, address slashingContract) internal -``` - -### _resetFrozenStatus - -```solidity -function _resetFrozenStatus(address previouslySlashedAddress) internal -``` - -### _recordUpdateAndAddToMiddlewareTimes - -```solidity -function _recordUpdateAndAddToMiddlewareTimes(address operator, uint32 updateBlock, uint32 serveUntilBlock) internal -``` - -records the most recent updateBlock for the currently updating middleware and appends an entry to the operator's list of - MiddlewareTimes if relavent information has updated - -_this function is only called during externally called stake updates by middleware contracts that can slash operator_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the entity whose stake update is being recorded | -| updateBlock | uint32 | the block number for which the currently updating middleware is updating the serveUntilBlock for | -| serveUntilBlock | uint32 | the block until which the operator's stake at updateBlock is slashable | - -### _updateMiddlewareList - -```solidity -function _updateMiddlewareList(address operator, uint32 updateBlock, uint256 insertAfter) internal -``` - -A routine for updating the `operator`'s linked list of middlewares, inside `recordStakeUpdate`. - -### _addressToUint - -```solidity -function _addressToUint(address addr) internal pure returns (uint256) -``` - -### _uintToAddress - -```solidity -function _uintToAddress(uint256 x) internal pure returns (address) -``` - -### __gap - -```solidity -uint256[46] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/core/StrategyManager.md b/docs/docgen/core/StrategyManager.md deleted file mode 100644 index 4ddd4764c..000000000 --- a/docs/docgen/core/StrategyManager.md +++ /dev/null @@ -1,666 +0,0 @@ -# Solidity API - -## StrategyManager - -This contract is for managing deposits in different strategies. The main -functionalities are: -- adding and removing strategies that any delegator can deposit into -- enabling deposit of assets into specified strategy(s) -- enabling withdrawal of assets from specified strategy(s) -- recording deposit of ETH into settlement layer -- slashing of assets for permissioned strategies - -### GWEI_TO_WEI - -```solidity -uint256 GWEI_TO_WEI -``` - -### PAUSED_DEPOSITS - -```solidity -uint8 PAUSED_DEPOSITS -``` - -### PAUSED_WITHDRAWALS - -```solidity -uint8 PAUSED_WITHDRAWALS -``` - -### ORIGINAL_CHAIN_ID - -```solidity -uint256 ORIGINAL_CHAIN_ID -``` - -### ERC1271_MAGICVALUE - -```solidity -bytes4 ERC1271_MAGICVALUE -``` - -### Deposit - -```solidity -event Deposit(address depositor, contract IERC20 token, contract IStrategy strategy, uint256 shares) -``` - -Emitted when a new deposit occurs on behalf of `depositor`. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | Is the staker who is depositing funds into EigenLayer. | -| token | contract IERC20 | Is the token that `depositor` deposited. | -| strategy | contract IStrategy | Is the strategy that `depositor` has deposited into. | -| shares | uint256 | Is the number of new shares `depositor` has been granted in `strategy`. | - -### ShareWithdrawalQueued - -```solidity -event ShareWithdrawalQueued(address depositor, uint96 nonce, contract IStrategy strategy, uint256 shares) -``` - -Emitted when a new withdrawal occurs on behalf of `depositor`. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | Is the staker who is queuing a withdrawal from EigenLayer. | -| nonce | uint96 | Is the withdrawal's unique identifier (to the depositor). | -| strategy | contract IStrategy | Is the strategy that `depositor` has queued to withdraw from. | -| shares | uint256 | Is the number of shares `depositor` has queued to withdraw. | - -### WithdrawalQueued - -```solidity -event WithdrawalQueued(address depositor, uint96 nonce, address withdrawer, address delegatedAddress, bytes32 withdrawalRoot) -``` - -Emitted when a new withdrawal is queued by `depositor`. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | Is the staker who is withdrawing funds from EigenLayer. | -| nonce | uint96 | Is the withdrawal's unique identifier (to the depositor). | -| withdrawer | address | Is the party specified by `staker` who will be able to complete the queued withdrawal and receive the withdrawn funds. | -| delegatedAddress | address | Is the party who the `staker` was delegated to at the time of creating the queued withdrawal | -| withdrawalRoot | bytes32 | Is a hash of the input data for the withdrawal. | - -### WithdrawalCompleted - -```solidity -event WithdrawalCompleted(address depositor, uint96 nonce, address withdrawer, bytes32 withdrawalRoot) -``` - -Emitted when a queued withdrawal is completed - -### StrategyWhitelisterChanged - -```solidity -event StrategyWhitelisterChanged(address previousAddress, address newAddress) -``` - -Emitted when the `strategyWhitelister` is changed - -### StrategyAddedToDepositWhitelist - -```solidity -event StrategyAddedToDepositWhitelist(contract IStrategy strategy) -``` - -Emitted when a strategy is added to the approved list of strategies for deposit - -### StrategyRemovedFromDepositWhitelist - -```solidity -event StrategyRemovedFromDepositWhitelist(contract IStrategy strategy) -``` - -Emitted when a strategy is removed from the approved list of strategies for deposit - -### WithdrawalDelayBlocksSet - -```solidity -event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -``` - -Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - -### onlyNotFrozen - -```solidity -modifier onlyNotFrozen(address staker) -``` - -### onlyFrozen - -```solidity -modifier onlyFrozen(address staker) -``` - -### onlyEigenPodManager - -```solidity -modifier onlyEigenPodManager() -``` - -### onlyStrategyWhitelister - -```solidity -modifier onlyStrategyWhitelister() -``` - -### onlyStrategiesWhitelistedForDeposit - -```solidity -modifier onlyStrategiesWhitelistedForDeposit(contract IStrategy strategy) -``` - -### constructor - -```solidity -constructor(contract IDelegationManager _delegation, contract IEigenPodManager _eigenPodManager, contract ISlasher _slasher) public -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _delegation | contract IDelegationManager | The delegation contract of EigenLayer. | -| _eigenPodManager | contract IEigenPodManager | The contract that keeps track of EigenPod stakes for restaking beacon chain ether. | -| _slasher | contract ISlasher | The primary slashing contract of EigenLayer. | - -### initialize - -```solidity -function initialize(address initialOwner, address initialStrategyWhitelister, contract IPauserRegistry _pauserRegistry, uint256 initialPausedStatus, uint256 _withdrawalDelayBlocks) external -``` - -Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set), -and transfers contract ownership to the specified `initialOwner`. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| initialOwner | address | Ownership of this contract is transferred to this address. | -| initialStrategyWhitelister | address | The initial value of `strategyWhitelister` to set. | -| _pauserRegistry | contract IPauserRegistry | Used for access control of pausing. | -| initialPausedStatus | uint256 | The initial value of `_paused` to set. | -| _withdrawalDelayBlocks | uint256 | The initial value of `withdrawalDelayBlocks` to set. | - -### depositBeaconChainETH - -```solidity -function depositBeaconChainETH(address staker, uint256 amount) external -``` - -Deposits `amount` of beaconchain ETH into this contract on behalf of `staker` - -_Only callable by EigenPodManager._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| staker | address | is the entity that is restaking in eigenlayer, | -| amount | uint256 | is the amount of beaconchain ETH being restaked, | - -### recordOvercommittedBeaconChainETH - -```solidity -function recordOvercommittedBeaconChainETH(address overcommittedPodOwner, uint256 beaconChainETHStrategyIndex, uint256 amount) external -``` - -Records an overcommitment event on behalf of a staker. The staker's beaconChainETH shares are decremented by `amount`. - -_Only callable by EigenPodManager._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| overcommittedPodOwner | address | is the pod owner to be slashed | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy in case it must be removed, | -| amount | uint256 | is the amount to decrement the slashedAddress's beaconChainETHStrategy shares | - -### depositIntoStrategy - -```solidity -function depositIntoStrategy(contract IStrategy strategy, contract IERC20 token, uint256 amount) external returns (uint256 shares) -``` - -Deposits `amount` of `token` into the specified `strategy`, with the resultant shares credited to `msg.sender` - -_The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf. -Cannot be called by an address that is 'frozen' (this function will revert if the `msg.sender` is frozen). - -WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors - where the token balance and corresponding strategy shares are not in sync upon reentrancy._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategy | contract IStrategy | is the specified strategy where deposit is to be made, | -| token | contract IERC20 | is the denomination in which the deposit is to be made, | -| amount | uint256 | is the amount of token to be deposited in the strategy by the depositor | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| shares | uint256 | The amount of new shares in the `strategy` created as part of the action. | - -### depositIntoStrategyWithSignature - -```solidity -function depositIntoStrategyWithSignature(contract IStrategy strategy, contract IERC20 token, uint256 amount, address staker, uint256 expiry, bytes signature) external returns (uint256 shares) -``` - -Used for depositing an asset into the specified strategy with the resultant shares credited to `staker`, -who must sign off on the action. -Note that the assets are transferred out/from the `msg.sender`, not from the `staker`; this function is explicitly designed -purely to help one address deposit 'for' another. - -_The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf. -A signature is required for this function to eliminate the possibility of griefing attacks, specifically those -targeting stakers who may be attempting to undelegate. -Cannot be called on behalf of a staker that is 'frozen' (this function will revert if the `staker` is frozen). - - WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors - where the token balance and corresponding strategy shares are not in sync upon reentrancy_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategy | contract IStrategy | is the specified strategy where deposit is to be made, | -| token | contract IERC20 | is the denomination in which the deposit is to be made, | -| amount | uint256 | is the amount of token to be deposited in the strategy by the depositor | -| staker | address | the staker that the deposited assets will be credited to | -| expiry | uint256 | the timestamp at which the signature expires | -| signature | bytes | is a valid signature from the `staker`. either an ECDSA signature if the `staker` is an EOA, or data to forward following EIP-1271 if the `staker` is a contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| shares | uint256 | The amount of new shares in the `strategy` created as part of the action. | - -### undelegate - -```solidity -function undelegate() external -``` - -Called by a staker to undelegate entirely from EigenLayer. The staker must first withdraw all of their existing deposits -(through use of the `queueWithdrawal` function), or else otherwise have never deposited in EigenLayer prior to delegating. - -### queueWithdrawal - -```solidity -function queueWithdrawal(uint256[] strategyIndexes, contract IStrategy[] strategies, uint256[] shares, address withdrawer, bool undelegateIfPossible) external returns (bytes32) -``` - -Called by a staker to queue a withdrawal of the given amount of `shares` from each of the respective given `strategies`. - -_Stakers will complete their withdrawal by calling the 'completeQueuedWithdrawal' function. -User shares are decreased in this function, but the total number of shares in each strategy remains the same. -The total number of shares is decremented in the 'completeQueuedWithdrawal' function instead, which is where -the funds are actually sent to the user through use of the strategies' 'withdrawal' function. This ensures -that the value per share reported by each strategy will remain consistent, and that the shares will continue -to accrue gains during the enforced withdrawal waiting period. -Strategies are removed from `stakerStrategyList` by swapping the last entry with the entry to be removed, then -popping off the last entry in `stakerStrategyList`. The simplest way to calculate the correct `strategyIndexes` to input -is to order the strategies *for which `msg.sender` is withdrawing 100% of their shares* from highest index in -`stakerStrategyList` to lowest index -Note that if the withdrawal includes shares in the enshrined 'beaconChainETH' strategy, then it must *only* include shares in this strategy, and -`withdrawer` must match the caller's address. The first condition is because slashing of queued withdrawals cannot be guaranteed -for Beacon Chain ETH (since we cannot trigger a withdrawal from the beacon chain through a smart contract) and the second condition is because shares in -the enshrined 'beaconChainETH' strategy technically represent non-fungible positions (deposits to the Beacon Chain, each pointed at a specific EigenPod)._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategyIndexes | uint256[] | is a list of the indices in `stakerStrategyList[msg.sender]` that correspond to the strategies for which `msg.sender` is withdrawing 100% of their shares | -| strategies | contract IStrategy[] | The Strategies to withdraw from | -| shares | uint256[] | The amount of shares to withdraw from each of the respective Strategies in the `strategies` array | -| withdrawer | address | The address that can complete the withdrawal and will receive any withdrawn funds or shares upon completing the withdrawal | -| undelegateIfPossible | bool | If this param is marked as 'true' *and the withdrawal will result in `msg.sender` having no shares in any Strategy,* then this function will also make an internal call to `undelegate(msg.sender)` to undelegate the `msg.sender`. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The 'withdrawalRoot' of the newly created Queued Withdrawal | - -### completeQueuedWithdrawal - -```solidity -function completeQueuedWithdrawal(struct IStrategyManager.QueuedWithdrawal queuedWithdrawal, contract IERC20[] tokens, uint256 middlewareTimesIndex, bool receiveAsTokens) external -``` - -Used to complete the specified `queuedWithdrawal`. The function caller must match `queuedWithdrawal.withdrawer` - -_middlewareTimesIndex should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw`_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| queuedWithdrawal | struct IStrategyManager.QueuedWithdrawal | The QueuedWithdrawal to complete. | -| tokens | contract IERC20[] | Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `strategies` array of the `queuedWithdrawal`. This input can be provided with zero length if `receiveAsTokens` is set to 'false' (since in that case, this input will be unused) | -| middlewareTimesIndex | uint256 | is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array | -| receiveAsTokens | bool | If true, the shares specified in the queued withdrawal will be withdrawn from the specified strategies themselves and sent to the caller, through calls to `queuedWithdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies will simply be transferred to the caller directly. | - -### completeQueuedWithdrawals - -```solidity -function completeQueuedWithdrawals(struct IStrategyManager.QueuedWithdrawal[] queuedWithdrawals, contract IERC20[][] tokens, uint256[] middlewareTimesIndexes, bool[] receiveAsTokens) external -``` - -Used to complete the specified `queuedWithdrawals`. The function caller must match `queuedWithdrawals[...].withdrawer` - -_Array-ified version of `completeQueuedWithdrawal` -middlewareTimesIndex should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw`_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| queuedWithdrawals | struct IStrategyManager.QueuedWithdrawal[] | The QueuedWithdrawals to complete. | -| tokens | contract IERC20[][] | Array of tokens for each QueuedWithdrawal. See `completeQueuedWithdrawal` for the usage of a single array. | -| middlewareTimesIndexes | uint256[] | One index to reference per QueuedWithdrawal. See `completeQueuedWithdrawal` for the usage of a single index. | -| receiveAsTokens | bool[] | If true, the shares specified in the queued withdrawal will be withdrawn from the specified strategies themselves and sent to the caller, through calls to `queuedWithdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies will simply be transferred to the caller directly. | - -### slashShares - -```solidity -function slashShares(address slashedAddress, address recipient, contract IStrategy[] strategies, contract IERC20[] tokens, uint256[] strategyIndexes, uint256[] shareAmounts) external -``` - -Slashes the shares of a 'frozen' operator (or a staker delegated to one) - -_strategies are removed from `stakerStrategyList` by swapping the last entry with the entry to be removed, then -popping off the last entry in `stakerStrategyList`. The simplest way to calculate the correct `strategyIndexes` to input -is to order the strategies *for which `msg.sender` is withdrawing 100% of their shares* from highest index in -`stakerStrategyList` to lowest index_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| slashedAddress | address | is the frozen address that is having its shares slashed | -| recipient | address | is the address that will receive the slashed funds, which could e.g. be a harmed party themself, or a MerkleDistributor-type contract that further sub-divides the slashed funds. | -| strategies | contract IStrategy[] | Strategies to slash | -| tokens | contract IERC20[] | The tokens to use as input to the `withdraw` function of each of the provided `strategies` | -| strategyIndexes | uint256[] | is a list of the indices in `stakerStrategyList[msg.sender]` that correspond to the strategies for which `msg.sender` is withdrawing 100% of their shares | -| shareAmounts | uint256[] | The amount of shares to slash in each of the provided `strategies` | - -### slashQueuedWithdrawal - -```solidity -function slashQueuedWithdrawal(address recipient, struct IStrategyManager.QueuedWithdrawal queuedWithdrawal, contract IERC20[] tokens, uint256[] indicesToSkip) external -``` - -Slashes an existing queued withdrawal that was created by a 'frozen' operator (or a staker delegated to one) - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| recipient | address | The funds in the slashed withdrawal are withdrawn as tokens to this address. | -| queuedWithdrawal | struct IStrategyManager.QueuedWithdrawal | The previously queued withdrawal to be slashed | -| tokens | contract IERC20[] | Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `strategies` array of the `queuedWithdrawal`. | -| indicesToSkip | uint256[] | Optional input parameter -- indices in the `strategies` array to skip (i.e. not call the 'withdraw' function on). This input exists so that, e.g., if the slashed QueuedWithdrawal contains a malicious strategy in the `strategies` array which always reverts on calls to its 'withdraw' function, then the malicious strategy can be skipped (with the shares in effect "burned"), while the non-malicious strategies are still called as normal. | - -### setWithdrawalDelayBlocks - -```solidity -function setWithdrawalDelayBlocks(uint256 _withdrawalDelayBlocks) external -``` - -Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _withdrawalDelayBlocks | uint256 | new value of `withdrawalDelayBlocks`. | - -### setStrategyWhitelister - -```solidity -function setStrategyWhitelister(address newStrategyWhitelister) external -``` - -Owner-only function to change the `strategyWhitelister` address. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newStrategyWhitelister | address | new address for the `strategyWhitelister`. | - -### addStrategiesToDepositWhitelist - -```solidity -function addStrategiesToDepositWhitelist(contract IStrategy[] strategiesToWhitelist) external -``` - -Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategiesToWhitelist | contract IStrategy[] | Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already) | - -### removeStrategiesFromDepositWhitelist - -```solidity -function removeStrategiesFromDepositWhitelist(contract IStrategy[] strategiesToRemoveFromWhitelist) external -``` - -Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategiesToRemoveFromWhitelist | contract IStrategy[] | Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it) | - -### _addShares - -```solidity -function _addShares(address depositor, contract IStrategy strategy, uint256 shares) internal -``` - -This function adds `shares` for a given `strategy` to the `depositor` and runs through the necessary update logic. - -_In particular, this function calls `delegation.increaseDelegatedShares(depositor, strategy, shares)` to ensure that all -delegated shares are tracked, increases the stored share amount in `stakerStrategyShares[depositor][strategy]`, and adds `strategy` -to the `depositor`'s list of strategies, if it is not in the list already._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | The address to add shares to | -| strategy | contract IStrategy | The Strategy in which the `depositor` is receiving shares | -| shares | uint256 | The amount of shares to grant to the `depositor` | - -### _depositIntoStrategy - -```solidity -function _depositIntoStrategy(address depositor, contract IStrategy strategy, contract IERC20 token, uint256 amount) internal returns (uint256 shares) -``` - -Internal function in which `amount` of ERC20 `token` is transferred from `msg.sender` to the Strategy-type contract -`strategy`, with the resulting shares credited to `depositor`. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | The address that will be credited with the new shares. | -| strategy | contract IStrategy | The Strategy contract to deposit into. | -| token | contract IERC20 | The ERC20 token to deposit. | -| amount | uint256 | The amount of `token` to deposit. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| shares | uint256 | The amount of *new* shares in `strategy` that have been credited to the `depositor`. | - -### _removeShares - -```solidity -function _removeShares(address depositor, uint256 strategyIndex, contract IStrategy strategy, uint256 shareAmount) internal returns (bool) -``` - -Decreases the shares that `depositor` holds in `strategy` by `shareAmount`. - -_If the amount of shares represents all of the depositor`s shares in said strategy, -then the strategy is removed from stakerStrategyList[depositor] and 'true' is returned. Otherwise 'false' is returned._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | The address to decrement shares from | -| strategyIndex | uint256 | The `strategyIndex` input for the internal `_removeStrategyFromStakerStrategyList`. Used only in the case that the removal of the depositor's shares results in them having zero remaining shares in the `strategy` | -| strategy | contract IStrategy | The strategy for which the `depositor`'s shares are being decremented | -| shareAmount | uint256 | The amount of shares to decrement | - -### _removeStrategyFromStakerStrategyList - -```solidity -function _removeStrategyFromStakerStrategyList(address depositor, uint256 strategyIndex, contract IStrategy strategy) internal -``` - -Removes `strategy` from `depositor`'s dynamic array of strategies, i.e. from `stakerStrategyList[depositor]` - -_the provided `strategyIndex` input is optimistically used to find the strategy quickly in the list. If the specified -index is incorrect, then we revert to a brute-force search._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | The user whose array will have an entry removed | -| strategyIndex | uint256 | Preferably the index of `strategy` in `stakerStrategyList[depositor]`. If the input is incorrect, then a brute-force fallback routine will be used to find the correct input | -| strategy | contract IStrategy | The Strategy to remove from `stakerStrategyList[depositor]` | - -### _completeQueuedWithdrawal - -```solidity -function _completeQueuedWithdrawal(struct IStrategyManager.QueuedWithdrawal queuedWithdrawal, contract IERC20[] tokens, uint256 middlewareTimesIndex, bool receiveAsTokens) internal -``` - -Internal function for completing the given `queuedWithdrawal`. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| queuedWithdrawal | struct IStrategyManager.QueuedWithdrawal | The QueuedWithdrawal to complete | -| tokens | contract IERC20[] | The ERC20 tokens to provide as inputs to `Strategy.withdraw`. Only relevant if `receiveAsTokens = true` | -| middlewareTimesIndex | uint256 | Passed on as an input to the `slasher.canWithdraw` function, to ensure the withdrawal is completable. | -| receiveAsTokens | bool | If marked 'true', then calls will be passed on to the `Strategy.withdraw` function for each strategy. If marked 'false', then the shares will simply be internally transferred to the `msg.sender`. | - -### _undelegate - -```solidity -function _undelegate(address depositor) internal -``` - -If the `depositor` has no existing shares, then they can `undelegate` themselves. -This allows people a "hard reset" in their relationship with EigenLayer after withdrawing all of their stake. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | The address to undelegate. Passed on as an input to the `delegation.undelegate` function. | - -### _withdrawBeaconChainETH - -```solidity -function _withdrawBeaconChainETH(address staker, address recipient, uint256 amount) internal -``` - -### _setWithdrawalDelayBlocks - -```solidity -function _setWithdrawalDelayBlocks(uint256 _withdrawalDelayBlocks) internal -``` - -internal function for changing the value of `withdrawalDelayBlocks`. Also performs sanity check and emits an event. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _withdrawalDelayBlocks | uint256 | The new value for `withdrawalDelayBlocks` to take. | - -### _setStrategyWhitelister - -```solidity -function _setStrategyWhitelister(address newStrategyWhitelister) internal -``` - -Internal function for modifying the `strategyWhitelister`. Used inside of the `setStrategyWhitelister` and `initialize` functions. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newStrategyWhitelister | address | The new address for the `strategyWhitelister` to take. | - -### getDeposits - -```solidity -function getDeposits(address depositor) external view returns (contract IStrategy[], uint256[]) -``` - -Get all details on the depositor's deposits and corresponding shares - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | The staker of interest, whose deposits this function will fetch | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | contract IStrategy[] | (depositor's strategies, shares in these strategies) | -| [1] | uint256[] | | - -### stakerStrategyListLength - -```solidity -function stakerStrategyListLength(address staker) external view returns (uint256) -``` - -Simple getter function that returns `stakerStrategyList[staker].length`. - -### calculateWithdrawalRoot - -```solidity -function calculateWithdrawalRoot(struct IStrategyManager.QueuedWithdrawal queuedWithdrawal) public pure returns (bytes32) -``` - -Returns the keccak256 hash of `queuedWithdrawal`. - diff --git a/docs/docgen/core/StrategyManagerStorage.md b/docs/docgen/core/StrategyManagerStorage.md deleted file mode 100644 index 10b7dfc9d..000000000 --- a/docs/docgen/core/StrategyManagerStorage.md +++ /dev/null @@ -1,160 +0,0 @@ -# Solidity API - -## StrategyManagerStorage - -This storage contract is separate from the logic to simplify the upgrade process. - -### DOMAIN_TYPEHASH - -```solidity -bytes32 DOMAIN_TYPEHASH -``` - -The EIP-712 typehash for the contract's domain - -### DEPOSIT_TYPEHASH - -```solidity -bytes32 DEPOSIT_TYPEHASH -``` - -The EIP-712 typehash for the deposit struct used by the contract - -### DOMAIN_SEPARATOR - -```solidity -bytes32 DOMAIN_SEPARATOR -``` - -EIP-712 Domain separator - -### nonces - -```solidity -mapping(address => uint256) nonces -``` - -### MAX_STAKER_STRATEGY_LIST_LENGTH - -```solidity -uint8 MAX_STAKER_STRATEGY_LIST_LENGTH -``` - -### delegation - -```solidity -contract IDelegationManager delegation -``` - -Returns the single, central Delegation contract of EigenLayer - -### eigenPodManager - -```solidity -contract IEigenPodManager eigenPodManager -``` - -### slasher - -```solidity -contract ISlasher slasher -``` - -Returns the single, central Slasher contract of EigenLayer - -### strategyWhitelister - -```solidity -address strategyWhitelister -``` - -Permissioned role, which can be changed by the contract owner. Has the ability to edit the strategy whitelist - -### withdrawalDelayBlocks - -```solidity -uint256 withdrawalDelayBlocks -``` - -Minimum delay enforced by this contract for completing queued withdrawals. Measured in blocks, and adjustable by this contract's owner, -up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced). - -_Note that the withdrawal delay is not enforced on withdrawals of 'beaconChainETH', as the EigenPods have their own separate delay mechanic -and we want to avoid stacking multiple enforced delays onto a single withdrawal._ - -### MAX_WITHDRAWAL_DELAY_BLOCKS - -```solidity -uint256 MAX_WITHDRAWAL_DELAY_BLOCKS -``` - -### stakerStrategyShares - -```solidity -mapping(address => mapping(contract IStrategy => uint256)) stakerStrategyShares -``` - -Mapping: staker => Strategy => number of shares which they currently hold - -### stakerStrategyList - -```solidity -mapping(address => contract IStrategy[]) stakerStrategyList -``` - -Mapping: staker => array of strategies in which they have nonzero shares - -### withdrawalRootPending - -```solidity -mapping(bytes32 => bool) withdrawalRootPending -``` - -Mapping: hash of withdrawal inputs, aka 'withdrawalRoot' => whether the withdrawal is pending - -### numWithdrawalsQueued - -```solidity -mapping(address => uint256) numWithdrawalsQueued -``` - -Mapping: staker => cumulative number of queued withdrawals they have ever initiated. only increments (doesn't decrement) - -### strategyIsWhitelistedForDeposit - -```solidity -mapping(contract IStrategy => bool) strategyIsWhitelistedForDeposit -``` - -Mapping: strategy => whether or not stakers are allowed to deposit into it - -### beaconChainETHSharesToDecrementOnWithdrawal - -```solidity -mapping(address => uint256) beaconChainETHSharesToDecrementOnWithdrawal -``` - -### beaconChainETHStrategy - -```solidity -contract IStrategy beaconChainETHStrategy -``` - -returns the enshrined, virtual 'beaconChainETH' Strategy - -### constructor - -```solidity -constructor(contract IDelegationManager _delegation, contract IEigenPodManager _eigenPodManager, contract ISlasher _slasher) internal -``` - -### __gap - -```solidity -uint256[40] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/interfaces/IBLSPublicKeyCompendium.md b/docs/docgen/interfaces/IBLSPublicKeyCompendium.md deleted file mode 100644 index 2c365a74d..000000000 --- a/docs/docgen/interfaces/IBLSPublicKeyCompendium.md +++ /dev/null @@ -1,40 +0,0 @@ -# Solidity API - -## IBLSPublicKeyCompendium - -### operatorToPubkeyHash - -```solidity -function operatorToPubkeyHash(address operator) external view returns (bytes32) -``` - -mapping from operator address to pubkey hash. -Returns *zero* if the `operator` has never registered, and otherwise returns the hash of the public key of the operator. - -### pubkeyHashToOperator - -```solidity -function pubkeyHashToOperator(bytes32 pubkeyHash) external view returns (address) -``` - -mapping from pubkey hash to operator address. -Returns *zero* if no operator has ever registered the public key corresponding to `pubkeyHash`, -and otherwise returns the (unique) registered operator who owns the BLS public key that is the preimage of `pubkeyHash`. - -### registerBLSPublicKey - -```solidity -function registerBLSPublicKey(uint256 s, struct BN254.G1Point rPoint, struct BN254.G1Point pubkeyG1, struct BN254.G2Point pubkeyG2) external -``` - -Called by an operator to register themselves as the owner of a BLS public key and reveal their G1 and G2 public key. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| s | uint256 | is the field element of the operator's Schnorr signature | -| rPoint | struct BN254.G1Point | is the group element of the operator's Schnorr signature | -| pubkeyG1 | struct BN254.G1Point | is the the G1 pubkey of the operator | -| pubkeyG2 | struct BN254.G2Point | is the G2 with the same private key as the pubkeyG1 | - diff --git a/docs/docgen/interfaces/IBLSRegistry.md b/docs/docgen/interfaces/IBLSRegistry.md deleted file mode 100644 index 8c78a3731..000000000 --- a/docs/docgen/interfaces/IBLSRegistry.md +++ /dev/null @@ -1,84 +0,0 @@ -# Solidity API - -## IBLSRegistry - -Adds BLS-specific functions to the base interface. - -### ApkUpdate - -```solidity -struct ApkUpdate { - bytes32 apkHash; - uint32 blockNumber; -} -``` - -### getCorrectApkHash - -```solidity -function getCorrectApkHash(uint256 index, uint32 blockNumber) external returns (bytes32) -``` - -get hash of a historical aggregated public key corresponding to a given index; -called by checkSignatures in BLSSignatureChecker.sol. - -### apkUpdates - -```solidity -function apkUpdates(uint256 index) external view returns (struct IBLSRegistry.ApkUpdate) -``` - -returns the `ApkUpdate` struct at `index` in the list of APK updates - -### apkHashes - -```solidity -function apkHashes(uint256 index) external view returns (bytes32) -``` - -returns the APK hash that resulted from the `index`th APK update - -### apkUpdateBlockNumbers - -```solidity -function apkUpdateBlockNumbers(uint256 index) external view returns (uint32) -``` - -returns the block number at which the `index`th APK update occurred - -### operatorWhitelister - -```solidity -function operatorWhitelister() external view returns (address) -``` - -### operatorWhitelistEnabled - -```solidity -function operatorWhitelistEnabled() external view returns (bool) -``` - -### whitelisted - -```solidity -function whitelisted(address) external view returns (bool) -``` - -### setOperatorWhitelistStatus - -```solidity -function setOperatorWhitelistStatus(bool _operatorWhitelistEnabled) external -``` - -### addToOperatorWhitelist - -```solidity -function addToOperatorWhitelist(address[]) external -``` - -### removeFromWhitelist - -```solidity -function removeFromWhitelist(address[] operators) external -``` - diff --git a/docs/docgen/interfaces/IBeaconChainOracle.md b/docs/docgen/interfaces/IBeaconChainOracle.md deleted file mode 100644 index 5c5aa2aac..000000000 --- a/docs/docgen/interfaces/IBeaconChainOracle.md +++ /dev/null @@ -1,129 +0,0 @@ -# Solidity API - -## IBeaconChainOracle - -### latestConfirmedOracleBlockNumber - -```solidity -function latestConfirmedOracleBlockNumber() external view returns (uint64) -``` - -Largest blockNumber that has been confirmed by the oracle. - -### beaconStateRootAtBlockNumber - -```solidity -function beaconStateRootAtBlockNumber(uint64 blockNumber) external view returns (bytes32) -``` - -Mapping: Beacon Chain blockNumber => the Beacon Chain state root at the specified blockNumber. - -_This will return `bytes32(0)` if the state root at the specified blockNumber is not yet confirmed._ - -### isOracleSigner - -```solidity -function isOracleSigner(address _oracleSigner) external view returns (bool) -``` - -Mapping: address => whether or not the address is in the set of oracle signers. - -### hasVoted - -```solidity -function hasVoted(uint64 blockNumber, address oracleSigner) external view returns (bool) -``` - -Mapping: Beacon Chain blockNumber => oracle signer address => whether or not the oracle signer has voted on the state root at the blockNumber. - -### stateRootVotes - -```solidity -function stateRootVotes(uint64 blockNumber, bytes32 stateRoot) external view returns (uint256) -``` - -Mapping: Beacon Chain blockNumber => state root => total number of oracle signer votes for the state root at the blockNumber. - -### totalOracleSigners - -```solidity -function totalOracleSigners() external view returns (uint256) -``` - -Total number of members of the set of oracle signers. - -### threshold - -```solidity -function threshold() external view returns (uint256) -``` - -Number of oracle signers that must vote for a state root in order for the state root to be confirmed. -Adjustable by this contract's owner through use of the `setThreshold` function. - -_We note that there is an edge case -- when the threshold is adjusted downward, if a state root already has enough votes to meet the *new* threshold, -the state root must still receive one additional vote from an oracle signer to be confirmed. This behavior is intended, to minimize unexpected root confirmations._ - -### setThreshold - -```solidity -function setThreshold(uint256 _threshold) external -``` - -Owner-only function used to modify the value of the `threshold` variable. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _threshold | uint256 | Desired new value for the `threshold` variable. Function will revert if this is set to zero. | - -### addOracleSigners - -```solidity -function addOracleSigners(address[] _oracleSigners) external -``` - -Owner-only function used to add a signer to the set of oracle signers. - -_Function will have no effect on the i-th input address if `_oracleSigners[i]`is already in the set of oracle signers._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleSigners | address[] | Array of address to be added to the set. | - -### removeOracleSigners - -```solidity -function removeOracleSigners(address[] _oracleSigners) external -``` - -Owner-only function used to remove a signer from the set of oracle signers. - -_Function will have no effect on the i-th input address if `_oracleSigners[i]`is already not in the set of oracle signers._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleSigners | address[] | Array of address to be removed from the set. | - -### voteForBeaconChainStateRoot - -```solidity -function voteForBeaconChainStateRoot(uint64 blockNumber, bytes32 stateRoot) external -``` - -Called by a member of the set of oracle signers to assert that the Beacon Chain state root is `stateRoot` at `blockNumber`. - -_The state root will be finalized once the total number of votes *for this exact state root at this exact blockNumber* meets the `threshold` value._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| blockNumber | uint64 | The Beacon Chain blockNumber of interest. | -| stateRoot | bytes32 | The Beacon Chain state root that the caller asserts was the correct root, at the specified `blockNumber`. | - diff --git a/docs/docgen/interfaces/IDelayedService.md b/docs/docgen/interfaces/IDelayedService.md deleted file mode 100644 index 07bbe5552..000000000 --- a/docs/docgen/interfaces/IDelayedService.md +++ /dev/null @@ -1,19 +0,0 @@ -# Solidity API - -## IDelayedService - -Specifically, this interface is designed for services that consult stake amounts up to `BLOCK_STALE_MEASURE` -blocks in the past. This may be necessary due to, e.g., network processing & communication delays, or to avoid race conditions -that could be present with coordinating aggregate operator signatures while service operators are registering & de-registering. - -_To clarify edge cases, the middleware can look `BLOCK_STALE_MEASURE` blocks into the past, i.e. it may trust stakes from the interval -[block.number - BLOCK_STALE_MEASURE, block.number] (specifically, *inclusive* of the block that is `BLOCK_STALE_MEASURE` before the current one)_ - -### BLOCK_STALE_MEASURE - -```solidity -function BLOCK_STALE_MEASURE() external view returns (uint32) -``` - -The maximum amount of blocks in the past that the service will consider stake amounts to still be 'valid'. - diff --git a/docs/docgen/interfaces/IDelayedWithdrawalRouter.md b/docs/docgen/interfaces/IDelayedWithdrawalRouter.md deleted file mode 100644 index 31708eb16..000000000 --- a/docs/docgen/interfaces/IDelayedWithdrawalRouter.md +++ /dev/null @@ -1,118 +0,0 @@ -# Solidity API - -## IDelayedWithdrawalRouter - -### DelayedWithdrawal - -```solidity -struct DelayedWithdrawal { - uint224 amount; - uint32 blockCreated; -} -``` - -### UserDelayedWithdrawals - -```solidity -struct UserDelayedWithdrawals { - uint256 delayedWithdrawalsCompleted; - struct IDelayedWithdrawalRouter.DelayedWithdrawal[] delayedWithdrawals; -} -``` - -### createDelayedWithdrawal - -```solidity -function createDelayedWithdrawal(address podOwner, address recipient) external payable -``` - -Creates an delayed withdrawal for `msg.value` to the `recipient`. - -_Only callable by the `podOwner`'s EigenPod contract._ - -### claimDelayedWithdrawals - -```solidity -function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfWithdrawalsToClaim) external -``` - -Called in order to withdraw delayed withdrawals made to the `recipient` that have passed the `withdrawalDelayBlocks` period. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| recipient | address | The address to claim delayedWithdrawals for. | -| maxNumberOfWithdrawalsToClaim | uint256 | Used to limit the maximum number of withdrawals to loop through claiming. | - -### claimDelayedWithdrawals - -```solidity -function claimDelayedWithdrawals(uint256 maxNumberOfWithdrawalsToClaim) external -``` - -Called in order to withdraw delayed withdrawals made to the caller that have passed the `withdrawalDelayBlocks` period. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| maxNumberOfWithdrawalsToClaim | uint256 | Used to limit the maximum number of withdrawals to loop through claiming. | - -### setWithdrawalDelayBlocks - -```solidity -function setWithdrawalDelayBlocks(uint256 newValue) external -``` - -Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable. - -### userWithdrawals - -```solidity -function userWithdrawals(address user) external view returns (struct IDelayedWithdrawalRouter.UserDelayedWithdrawals) -``` - -Getter function for the mapping `_userWithdrawals` - -### claimableUserDelayedWithdrawals - -```solidity -function claimableUserDelayedWithdrawals(address user) external view returns (struct IDelayedWithdrawalRouter.DelayedWithdrawal[]) -``` - -Getter function to get all delayedWithdrawals that are currently claimable by the `user` - -### userDelayedWithdrawalByIndex - -```solidity -function userDelayedWithdrawalByIndex(address user, uint256 index) external view returns (struct IDelayedWithdrawalRouter.DelayedWithdrawal) -``` - -Getter function for fetching the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array - -### userWithdrawalsLength - -```solidity -function userWithdrawalsLength(address user) external view returns (uint256) -``` - -Getter function for fetching the length of the delayedWithdrawals array of a specific user - -### canClaimDelayedWithdrawal - -```solidity -function canClaimDelayedWithdrawal(address user, uint256 index) external view returns (bool) -``` - -Convenience function for checking whether or not the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array is currently claimable - -### withdrawalDelayBlocks - -```solidity -function withdrawalDelayBlocks() external view returns (uint256) -``` - -Delay enforced by this contract for completing any delayedWithdrawal. Measured in blocks, and adjustable by this contract's owner, -up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced). - diff --git a/docs/docgen/interfaces/IDelegationManager.md b/docs/docgen/interfaces/IDelegationManager.md deleted file mode 100644 index 4c031f801..000000000 --- a/docs/docgen/interfaces/IDelegationManager.md +++ /dev/null @@ -1,128 +0,0 @@ -# Solidity API - -## IDelegationManager - -This is the contract for delegation in EigenLayer. The main functionalities of this contract are -- enabling anyone to register as an operator in EigenLayer -- allowing new operators to provide a DelegationTerms-type contract, which may mediate their interactions with stakers who delegate to them -- enabling any staker to delegate its stake to the operator of its choice -- enabling a staker to undelegate its assets from an operator (performed as part of the withdrawal process, initiated through the StrategyManager) - -### registerAsOperator - -```solidity -function registerAsOperator(contract IDelegationTerms dt) external -``` - -This will be called by an operator to register itself as an operator that stakers can choose to delegate to. - -_An operator can set `dt` equal to their own address (or another EOA address), in the event that they want to split payments -in a more 'trustful' manner. -In the present design, once set, there is no way for an operator to ever modify the address of their DelegationTerms contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| dt | contract IDelegationTerms | is the `DelegationTerms` contract that the operator has for those who delegate to them. | - -### delegateTo - -```solidity -function delegateTo(address operator) external -``` - -@notice This will be called by a staker to delegate its assets to some operator. - @param operator is the operator to whom staker (msg.sender) is delegating its assets - -### delegateToBySignature - -```solidity -function delegateToBySignature(address staker, address operator, uint256 expiry, bytes signature) external -``` - -Delegates from `staker` to `operator`. - -_requires that: -1) if `staker` is an EOA, then `signature` is valid ECDSA signature from `staker`, indicating their intention for this action -2) if `staker` is a contract, then `signature` must will be checked according to EIP-1271_ - -### undelegate - -```solidity -function undelegate(address staker) external -``` - -Undelegates `staker` from the operator who they are delegated to. -Callable only by the StrategyManager - -_Should only ever be called in the event that the `staker` has no active deposits in EigenLayer._ - -### delegatedTo - -```solidity -function delegatedTo(address staker) external view returns (address) -``` - -returns the address of the operator that `staker` is delegated to. - -### delegationTerms - -```solidity -function delegationTerms(address operator) external view returns (contract IDelegationTerms) -``` - -returns the DelegationTerms of the `operator`, which may mediate their interactions with stakers who delegate to them. - -### operatorShares - -```solidity -function operatorShares(address operator, contract IStrategy strategy) external view returns (uint256) -``` - -returns the total number of shares in `strategy` that are delegated to `operator`. - -### increaseDelegatedShares - -```solidity -function increaseDelegatedShares(address staker, contract IStrategy strategy, uint256 shares) external -``` - -Increases the `staker`'s delegated shares in `strategy` by `shares, typically called when the staker has further deposits into EigenLayer - -_Callable only by the StrategyManager_ - -### decreaseDelegatedShares - -```solidity -function decreaseDelegatedShares(address staker, contract IStrategy[] strategies, uint256[] shares) external -``` - -Decreases the `staker`'s delegated shares in each entry of `strategies` by its respective `shares[i]`, typically called when the staker withdraws from EigenLayer - -_Callable only by the StrategyManager_ - -### isDelegated - -```solidity -function isDelegated(address staker) external view returns (bool) -``` - -Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise. - -### isNotDelegated - -```solidity -function isNotDelegated(address staker) external view returns (bool) -``` - -Returns 'true' if `staker` is *not* actively delegated, and 'false' otherwise. - -### isOperator - -```solidity -function isOperator(address operator) external view returns (bool) -``` - -Returns if an operator can be delegated to, i.e. it has called `registerAsOperator`. - diff --git a/docs/docgen/interfaces/IDelegationTerms.md b/docs/docgen/interfaces/IDelegationTerms.md deleted file mode 100644 index b0f207b3e..000000000 --- a/docs/docgen/interfaces/IDelegationTerms.md +++ /dev/null @@ -1,24 +0,0 @@ -# Solidity API - -## IDelegationTerms - -The gas budget provided to this contract in calls from EigenLayer contracts is limited. - -### payForService - -```solidity -function payForService(contract IERC20 token, uint256 amount) external payable -``` - -### onDelegationWithdrawn - -```solidity -function onDelegationWithdrawn(address delegator, contract IStrategy[] stakerStrategyList, uint256[] stakerShares) external returns (bytes) -``` - -### onDelegationReceived - -```solidity -function onDelegationReceived(address delegator, contract IStrategy[] stakerStrategyList, uint256[] stakerShares) external returns (bytes) -``` - diff --git a/docs/docgen/interfaces/IETHPOSDeposit.md b/docs/docgen/interfaces/IETHPOSDeposit.md deleted file mode 100644 index b7fbbcfde..000000000 --- a/docs/docgen/interfaces/IETHPOSDeposit.md +++ /dev/null @@ -1,60 +0,0 @@ -# Solidity API - -## IETHPOSDeposit - -This is the Ethereum 2.0 deposit contract interface. -For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs - -### DepositEvent - -```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) -``` - -A processed deposit event. - -### deposit - -```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable -``` - -Submit a Phase 0 DepositData object. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | - -### get_deposit_root - -```solidity -function get_deposit_root() external view returns (bytes32) -``` - -Query the current deposit root hash. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | - -### get_deposit_count - -```solidity -function get_deposit_count() external view returns (bytes) -``` - -Query the current deposit count. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | - diff --git a/docs/docgen/interfaces/IEigenPod.md b/docs/docgen/interfaces/IEigenPod.md deleted file mode 100644 index a1d497b0f..000000000 --- a/docs/docgen/interfaces/IEigenPod.md +++ /dev/null @@ -1,215 +0,0 @@ -# Solidity API - -## IEigenPod - -The main functionalities are: -- creating new ETH validators with their withdrawal credentials pointed to this contract -- proving from beacon chain state roots that withdrawal credentials are pointed to this contract -- proving from beacon chain state roots the balances of ETH validators with their withdrawal credentials - pointed to this contract -- updating aggregate balances in the EigenPodManager -- withdrawing eth when withdrawals are initiated - -_Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose - to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts_ - -### VALIDATOR_STATUS - -```solidity -enum VALIDATOR_STATUS { - INACTIVE, - ACTIVE, - OVERCOMMITTED, - WITHDRAWN -} -``` - -### PartialWithdrawalClaim - -```solidity -struct PartialWithdrawalClaim { - enum IEigenPod.PARTIAL_WITHDRAWAL_CLAIM_STATUS status; - uint32 creationBlockNumber; - uint32 fraudproofPeriodEndBlockNumber; - uint64 partialWithdrawalAmountGwei; -} -``` - -### PARTIAL_WITHDRAWAL_CLAIM_STATUS - -```solidity -enum PARTIAL_WITHDRAWAL_CLAIM_STATUS { - REDEEMED, - PENDING, - FAILED -} -``` - -### REQUIRED_BALANCE_GWEI - -```solidity -function REQUIRED_BALANCE_GWEI() external view returns (uint64) -``` - -The amount of eth, in gwei, that is restaked per validator - -### REQUIRED_BALANCE_WEI - -```solidity -function REQUIRED_BALANCE_WEI() external view returns (uint256) -``` - -The amount of eth, in wei, that is restaked per validator - -### validatorStatus - -```solidity -function validatorStatus(uint40 validatorIndex) external view returns (enum IEigenPod.VALIDATOR_STATUS) -``` - -this is a mapping of validator indices to a Validator struct containing pertinent info about the validator - -### restakedExecutionLayerGwei - -```solidity -function restakedExecutionLayerGwei() external view returns (uint64) -``` - -the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), - -### initialize - -```solidity -function initialize(address owner) external -``` - -Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager - -### stake - -```solidity -function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) external payable -``` - -Called by EigenPodManager when the owner wants to create another ETH validator. - -### withdrawRestakedBeaconChainETH - -```solidity -function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) external -``` - -Transfers `amountWei` in ether from this contract to the specified `recipient` address -Called by EigenPodManager to withdrawBeaconChainETH that has been added to the EigenPod's balance due to a withdrawal from the beacon chain. - -_Called during withdrawal or slashing. -Note that this function is marked as non-reentrant to prevent the recipient calling back into it_ - -### eigenPodManager - -```solidity -function eigenPodManager() external view returns (contract IEigenPodManager) -``` - -The single EigenPodManager for EigenLayer - -### podOwner - -```solidity -function podOwner() external view returns (address) -``` - -The owner of this EigenPod - -### hasRestaked - -```solidity -function hasRestaked() external view returns (bool) -``` - -an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. - -### mostRecentWithdrawalBlockNumber - -```solidity -function mostRecentWithdrawalBlockNumber() external view returns (uint64) -``` - -block number of the most recent withdrawal - -### provenPartialWithdrawal - -```solidity -function provenPartialWithdrawal(uint40 validatorIndex, uint64 slot) external view returns (bool) -``` - -mapping that tracks proven partial withdrawals - -### verifyWithdrawalCredentialsAndBalance - -```solidity -function verifyWithdrawalCredentialsAndBalance(uint64 oracleBlockNumber, uint40 validatorIndex, struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs proofs, bytes32[] validatorFields) external -``` - -This function verifies that the withdrawal credentials of the podOwner are pointed to -this contract. It also verifies the current (not effective) balance of the validator. It verifies the provided proof of the ETH validator against the beacon chain state -root, marks the validator as 'active' in EigenLayer, and credits the restaked ETH in Eigenlayer. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| oracleBlockNumber | uint64 | is the Beacon Chain blockNumber whose state root the `proof` will be proven against. | -| validatorIndex | uint40 | is the index of the validator being proven, refer to consensus specs | -| proofs | struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs | is the bytes that prove the ETH validator's balance and withdrawal credentials against a beacon chain state root | -| validatorFields | bytes32[] | are the fields of the "Validator Container", refer to consensus specs for details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator | - -### verifyOvercommittedStake - -```solidity -function verifyOvercommittedStake(uint40 validatorIndex, struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs proofs, bytes32[] validatorFields, uint256 beaconChainETHStrategyIndex, uint64 oracleBlockNumber) external -``` - -This function records an overcommitment of stake to EigenLayer on behalf of a certain ETH validator. - If successful, the overcommitted balance is penalized (available for withdrawal whenever the pod's balance allows). - The ETH validator's shares in the enshrined beaconChainETH strategy are also removed from the StrategyManager and undelegated. - -_For more details on the Beacon Chain spec, see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| validatorIndex | uint40 | is the index of the validator being proven, refer to consensus specs | -| proofs | struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs | is the proof of the validator's balance and validatorFields in the balance tree and the balanceRoot to prove for | -| validatorFields | bytes32[] | are the fields of the "Validator Container", refer to consensus specs | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy for the pod owner for the callback to the StrategyManager in case it must be removed from the list of the podOwners strategies | -| oracleBlockNumber | uint64 | The oracleBlockNumber whose state root the `proof` will be proven against. Must be within `VERIFY_OVERCOMMITTED_WINDOW_BLOCKS` of the current block. | - -### verifyAndProcessWithdrawal - -```solidity -function verifyAndProcessWithdrawal(struct BeaconChainProofs.WithdrawalProofs withdrawalProofs, bytes validatorFieldsProof, bytes32[] validatorFields, bytes32[] withdrawalFields, uint256 beaconChainETHStrategyIndex, uint64 oracleBlockNumber) external -``` - -This function records a full withdrawal on behalf of one of the Ethereum validators for this EigenPod - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| withdrawalProofs | struct BeaconChainProofs.WithdrawalProofs | is the information needed to check the veracity of the block number and withdrawal being proven | -| validatorFieldsProof | bytes | is the proof of the validator's fields in the validator tree | -| validatorFields | bytes32[] | are the fields of the validator being proven | -| withdrawalFields | bytes32[] | are the fields of the withdrawal being proven | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy for the pod owner for the callback to the EigenPodManager to the StrategyManager in case it must be removed from the podOwner's list of strategies | -| oracleBlockNumber | uint64 | | - -### withdrawBeforeRestaking - -```solidity -function withdrawBeforeRestaking() external -``` - -Called by the pod owner to withdraw the balance of the pod when `hasRestaked` is set to false - diff --git a/docs/docgen/interfaces/IEigenPodManager.md b/docs/docgen/interfaces/IEigenPodManager.md deleted file mode 100644 index d20647bdf..000000000 --- a/docs/docgen/interfaces/IEigenPodManager.md +++ /dev/null @@ -1,155 +0,0 @@ -# Solidity API - -## IEigenPodManager - -### createPod - -```solidity -function createPod() external -``` - -Creates an EigenPod for the sender. - -_Function will revert if the `msg.sender` already has an EigenPod._ - -### stake - -```solidity -function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) external payable -``` - -Stakes for a new beacon chain validator on the sender's EigenPod. -Also creates an EigenPod for the sender if they don't have one already. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | The 48 bytes public key of the beacon chain validator. | -| signature | bytes | The validator's signature of the deposit data. | -| depositDataRoot | bytes32 | The root/hash of the deposit data for the validator's deposit. | - -### restakeBeaconChainETH - -```solidity -function restakeBeaconChainETH(address podOwner, uint256 amount) external -``` - -Deposits/Restakes beacon chain ETH in EigenLayer on behalf of the owner of an EigenPod. - -_Callable only by the podOwner's EigenPod contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| podOwner | address | The owner of the pod whose balance must be deposited. | -| amount | uint256 | The amount of ETH to 'deposit' (i.e. be credited to the podOwner). | - -### recordOvercommittedBeaconChainETH - -```solidity -function recordOvercommittedBeaconChainETH(address podOwner, uint256 beaconChainETHStrategyIndex, uint256 amount) external -``` - -Removes beacon chain ETH from EigenLayer on behalf of the owner of an EigenPod, when the - balance of a validator is lower than how much stake they have committed to EigenLayer - -_Callable only by the podOwner's EigenPod contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| podOwner | address | The owner of the pod whose balance must be removed. | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy for the pod owner for the callback to the StrategyManager in case it must be removed from the list of the podOwner's strategies | -| amount | uint256 | The amount of ETH to remove. | - -### withdrawRestakedBeaconChainETH - -```solidity -function withdrawRestakedBeaconChainETH(address podOwner, address recipient, uint256 amount) external -``` - -Withdraws ETH from an EigenPod. The ETH must have first been withdrawn from the beacon chain. - -_Callable only by the StrategyManager contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| podOwner | address | The owner of the pod whose balance must be withdrawn. | -| recipient | address | The recipient of the withdrawn ETH. | -| amount | uint256 | The amount of ETH to withdraw. | - -### updateBeaconChainOracle - -```solidity -function updateBeaconChainOracle(contract IBeaconChainOracle newBeaconChainOracle) external -``` - -Updates the oracle contract that provides the beacon chain state root - -_Callable only by the owner of this contract (i.e. governance)_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newBeaconChainOracle | contract IBeaconChainOracle | is the new oracle contract being pointed to | - -### ownerToPod - -```solidity -function ownerToPod(address podOwner) external view returns (contract IEigenPod) -``` - -Returns the address of the `podOwner`'s EigenPod if it has been deployed. - -### getPod - -```solidity -function getPod(address podOwner) external view returns (contract IEigenPod) -``` - -Returns the address of the `podOwner`'s EigenPod (whether it is deployed yet or not). - -### beaconChainOracle - -```solidity -function beaconChainOracle() external view returns (contract IBeaconChainOracle) -``` - -Oracle contract that provides updates to the beacon chain's state - -### getBeaconChainStateRoot - -```solidity -function getBeaconChainStateRoot(uint64 blockNumber) external view returns (bytes32) -``` - -Returns the Beacon Chain state root at `blockNumber`. Reverts if the Beacon Chain state root at `blockNumber` has not yet been finalized. - -### strategyManager - -```solidity -function strategyManager() external view returns (contract IStrategyManager) -``` - -EigenLayer's StrategyManager contract - -### slasher - -```solidity -function slasher() external view returns (contract ISlasher) -``` - -EigenLayer's Slasher contract - -### hasPod - -```solidity -function hasPod(address podOwner) external view returns (bool) -``` - diff --git a/docs/docgen/interfaces/IPausable.md b/docs/docgen/interfaces/IPausable.md deleted file mode 100644 index 69619507f..000000000 --- a/docs/docgen/interfaces/IPausable.md +++ /dev/null @@ -1,83 +0,0 @@ -# Solidity API - -## IPausable - -Contracts that inherit from this contract may define their own `pause` and `unpause` (and/or related) functions. -These functions should be permissioned as "onlyPauser" which defers to a `PauserRegistry` for determining access control. - -_Pausability is implemented using a uint256, which allows up to 256 different single bit-flags; each bit can potentially pause different functionality. -Inspiration for this was taken from the NearBridge design here https://etherscan.io/address/0x3FEFc5A4B1c02f21cBc8D3613643ba0635b9a873#code. -For the `pause` and `unpause` functions we've implemented, if you pause, you can only flip (any number of) switches to on/1 (aka "paused"), and if you unpause, -you can only flip (any number of) switches to off/0 (aka "paused"). -If you want a pauseXYZ function that just flips a single bit / "pausing flag", it will: -1) 'bit-wise and' (aka `&`) a flag with the current paused state (as a uint256) -2) update the paused state to this new value -We note as well that we have chosen to identify flags by their *bit index* as opposed to their numerical value, so, e.g. defining `DEPOSITS_PAUSED = 3` -indicates specifically that if the *third bit* of `_paused` is flipped -- i.e. it is a '1' -- then deposits should be paused_ - -### pauserRegistry - -```solidity -function pauserRegistry() external view returns (contract IPauserRegistry) -``` - -Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing). - -### pause - -```solidity -function pause(uint256 newPausedStatus) external -``` - -This function is used to pause an EigenLayer contract's functionality. -It is permissioned to the `pauser` address, which is expected to be a low threshold multisig. - -_This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newPausedStatus | uint256 | represents the new value for `_paused` to take, which means it may flip several bits at once. | - -### pauseAll - -```solidity -function pauseAll() external -``` - -Alias for `pause(type(uint256).max)`. - -### unpause - -```solidity -function unpause(uint256 newPausedStatus) external -``` - -This function is used to unpause an EigenLayer contract's functionality. -It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract. - -_This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newPausedStatus | uint256 | represents the new value for `_paused` to take, which means it may flip several bits at once. | - -### paused - -```solidity -function paused() external view returns (uint256) -``` - -Returns the current paused status as a uint256. - -### paused - -```solidity -function paused(uint8 index) external view returns (bool) -``` - -Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise - diff --git a/docs/docgen/interfaces/IPauserRegistry.md b/docs/docgen/interfaces/IPauserRegistry.md deleted file mode 100644 index 5a7002e32..000000000 --- a/docs/docgen/interfaces/IPauserRegistry.md +++ /dev/null @@ -1,20 +0,0 @@ -# Solidity API - -## IPauserRegistry - -### pauser - -```solidity -function pauser() external view returns (address) -``` - -Unique address that holds the pauser role. - -### unpauser - -```solidity -function unpauser() external view returns (address) -``` - -Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses. - diff --git a/docs/docgen/interfaces/IPaymentManager.md b/docs/docgen/interfaces/IPaymentManager.md deleted file mode 100644 index df975704e..000000000 --- a/docs/docgen/interfaces/IPaymentManager.md +++ /dev/null @@ -1,268 +0,0 @@ -# Solidity API - -## IPaymentManager - -### DissectionType - -```solidity -enum DissectionType { - INVALID, - FIRST_HALF, - SECOND_HALF -} -``` - -### PaymentStatus - -```solidity -enum PaymentStatus { - REDEEMED, - COMMITTED, - CHALLENGED -} -``` - -### ChallengeStatus - -```solidity -enum ChallengeStatus { - RESOLVED, - OPERATOR_TURN, - CHALLENGER_TURN, - OPERATOR_TURN_ONE_STEP, - CHALLENGER_TURN_ONE_STEP -} -``` - -### Payment - -```solidity -struct Payment { - uint32 fromTaskNumber; - uint32 toTaskNumber; - uint32 confirmAt; - uint96 amount; - enum IPaymentManager.PaymentStatus status; - uint256 challengeAmount; -} -``` - -### PaymentChallenge - -```solidity -struct PaymentChallenge { - address operator; - address challenger; - address serviceManager; - uint32 fromTaskNumber; - uint32 toTaskNumber; - uint96 amount1; - uint96 amount2; - uint32 settleAt; - enum IPaymentManager.ChallengeStatus status; -} -``` - -### TotalStakes - -```solidity -struct TotalStakes { - uint256 signedStakeFirstQuorum; - uint256 signedStakeSecondQuorum; -} -``` - -### depositFutureFees - -```solidity -function depositFutureFees(address depositFor, uint256 amount) external -``` - -deposit one-time fees by the `msg.sender` with this contract to pay for future tasks of this middleware - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositFor | address | could be the `msg.sender` themselves, or a different address for whom `msg.sender` is depositing these future fees | -| amount | uint256 | is amount of futures fees being deposited | - -### setAllowance - -```solidity -function setAllowance(address allowed, uint256 amount) external -``` - -Allows the `allowed` address to spend up to `amount` of the `msg.sender`'s funds that have been deposited in this contract - -### takeFee - -```solidity -function takeFee(address initiator, address payer, uint256 feeAmount) external -``` - -Used for deducting the fees from the payer to the middleware - -### setPaymentChallengeAmount - -```solidity -function setPaymentChallengeAmount(uint256 _paymentChallengeAmount) external -``` - -Modifies the `paymentChallengeAmount` amount. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _paymentChallengeAmount | uint256 | The new value for `paymentChallengeAmount` to take. | - -### commitPayment - -```solidity -function commitPayment(uint32 toTaskNumber, uint96 amount) external -``` - -This is used by an operator to make a claim on the amount that they deserve for their service from their last payment until `toTaskNumber` - -_Once this payment is recorded, a fraud proof period commences during which a challenger can dispute the proposed payment._ - -### redeemPayment - -```solidity -function redeemPayment() external -``` - -Called by an operator to redeem a payment that they previously 'committed' to by calling `commitPayment`. - -_This function can only be called after the challenge window for the payment claim has completed._ - -### initPaymentChallenge - -```solidity -function initPaymentChallenge(address operator, uint96 amount1, uint96 amount2) external -``` - -This function is called by a fraud prover to challenge a payment, initiating an interactive-type fraudproof. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator against whose payment claim the fraudproof is being made | -| amount1 | uint96 | is the reward amount the challenger in that round claims is for the first half of tasks | -| amount2 | uint96 | is the reward amount the challenger in that round claims is for the second half of tasks | - -### performChallengeBisectionStep - -```solidity -function performChallengeBisectionStep(address operator, bool secondHalf, uint96 amount1, uint96 amount2) external -``` - -Perform a single bisection step in an existing interactive payment challenge. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | The middleware operator who was challenged (used to look up challenge details) | -| secondHalf | bool | If true, then the caller wishes to challenge the amount claimed as payment in the *second half* of the previous bisection step. If false then the *first half* is indicated instead. | -| amount1 | uint96 | The amount that the caller asserts the operator is entitled to, for the first half *of the challenged half* of the previous bisection. | -| amount2 | uint96 | The amount that the caller asserts the operator is entitled to, for the second half *of the challenged half* of the previous bisection. | - -### resolveChallenge - -```solidity -function resolveChallenge(address operator) external -``` - -resolve an existing PaymentChallenge for an operator - -### paymentFraudproofInterval - -```solidity -function paymentFraudproofInterval() external view returns (uint256) -``` - -Challenge window for submitting fraudproof in the case of an incorrect payment claim by a registered operator. - -### paymentChallengeAmount - -```solidity -function paymentChallengeAmount() external view returns (uint256) -``` - -Specifies the payment that has to be made as a guarantee for fraudproof during payment challenges. - -### paymentToken - -```solidity -function paymentToken() external view returns (contract IERC20) -``` - -the ERC20 token that will be used by the disperser to pay the service fees to middleware nodes. - -### paymentChallengeToken - -```solidity -function paymentChallengeToken() external view returns (contract IERC20) -``` - -Token used for placing a guarantee on challenges & payment commits - -### getChallengeStatus - -```solidity -function getChallengeStatus(address operator) external view returns (enum IPaymentManager.ChallengeStatus) -``` - -Returns the ChallengeStatus for the `operator`'s payment claim. - -### getAmount1 - -```solidity -function getAmount1(address operator) external view returns (uint96) -``` - -Returns the 'amount1' for the `operator`'s payment claim. - -### getAmount2 - -```solidity -function getAmount2(address operator) external view returns (uint96) -``` - -Returns the 'amount2' for the `operator`'s payment claim. - -### getToTaskNumber - -```solidity -function getToTaskNumber(address operator) external view returns (uint48) -``` - -Returns the 'toTaskNumber' for the `operator`'s payment claim. - -### getFromTaskNumber - -```solidity -function getFromTaskNumber(address operator) external view returns (uint48) -``` - -Returns the 'fromTaskNumber' for the `operator`'s payment claim. - -### getDiff - -```solidity -function getDiff(address operator) external view returns (uint48) -``` - -Returns the task number difference for the `operator`'s payment claim. - -### getPaymentChallengeAmount - -```solidity -function getPaymentChallengeAmount(address) external view returns (uint256) -``` - -Returns the active guarantee amount of the `operator` placed on their payment claim. - diff --git a/docs/docgen/interfaces/IQuorumRegistry.md b/docs/docgen/interfaces/IQuorumRegistry.md deleted file mode 100644 index fd90f7ab1..000000000 --- a/docs/docgen/interfaces/IQuorumRegistry.md +++ /dev/null @@ -1,220 +0,0 @@ -# Solidity API - -## IQuorumRegistry - -This contract does not currently support n-quorums where n >= 3. -Note in particular the presence of only `firstQuorumStake` and `secondQuorumStake` in the `OperatorStake` struct. - -### Status - -```solidity -enum Status { - INACTIVE, - ACTIVE -} -``` - -### Operator - -```solidity -struct Operator { - bytes32 pubkeyHash; - uint32 fromTaskNumber; - enum IQuorumRegistry.Status status; -} -``` - -### OperatorIndex - -```solidity -struct OperatorIndex { - uint32 toBlockNumber; - uint32 index; -} -``` - -### OperatorStake - -```solidity -struct OperatorStake { - uint32 updateBlockNumber; - uint32 nextUpdateBlockNumber; - uint96 firstQuorumStake; - uint96 secondQuorumStake; -} -``` - -### getLengthOfTotalStakeHistory - -```solidity -function getLengthOfTotalStakeHistory() external view returns (uint256) -``` - -### getTotalStakeFromIndex - -```solidity -function getTotalStakeFromIndex(uint256 index) external view returns (struct IQuorumRegistry.OperatorStake) -``` - -Returns the `index`-th entry in the dynamic array of total stake, `totalStakeHistory`. - -_Function will revert in the event that `index` is out-of-bounds._ - -### getOperatorPubkeyHash - -```solidity -function getOperatorPubkeyHash(address operator) external view returns (bytes32) -``` - -Returns the stored pubkeyHash for the specified `operator`. - -### getFromTaskNumberForOperator - -```solidity -function getFromTaskNumberForOperator(address operator) external view returns (uint32) -``` - -Returns task number from when `operator` has been registered. - -### getStakeFromPubkeyHashAndIndex - -```solidity -function getStakeFromPubkeyHashAndIndex(bytes32 pubkeyHash, uint256 index) external view returns (struct IQuorumRegistry.OperatorStake) -``` - -Returns the stake weight corresponding to `pubkeyHash`, at the -`index`-th entry in the `pubkeyHashToStakeHistory[pubkeyHash]` array. - -_Function will revert if `index` is out-of-bounds._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkeyHash | bytes32 | Hash of the public key of the operator of interest. | -| index | uint256 | Array index for lookup, within the dynamic array `pubkeyHashToStakeHistory[pubkeyHash]`. | - -### checkOperatorActiveAtBlockNumber - -```solidity -function checkOperatorActiveAtBlockNumber(address operator, uint256 blockNumber, uint256 stakeHistoryIndex) external view returns (bool) -``` - -Checks that the `operator` was active at the `blockNumber`, using the specified `stakeHistoryIndex` as proof. - -_In order for this function to return 'true', the inputs must satisfy all of the following list: -1) `pubkeyHashToStakeHistory[pubkeyHash][index].updateBlockNumber <= blockNumber` -2) `pubkeyHashToStakeHistory[pubkeyHash][index].nextUpdateBlockNumber` must be either `0` (signifying no next update) or -is must be strictly greater than `blockNumber` -3) `pubkeyHashToStakeHistory[pubkeyHash][index].firstQuorumStake > 0` -or `pubkeyHashToStakeHistory[pubkeyHash][index].secondQuorumStake > 0`, i.e. the operator had nonzero stake -Note that a return value of 'false' does not guarantee that the `operator` was inactive at `blockNumber`, since a -bad `stakeHistoryIndex` can be supplied in order to obtain a response of 'false'._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator of interest | -| blockNumber | uint256 | is the block number of interest | -| stakeHistoryIndex | uint256 | specifies an index in `pubkeyHashToStakeHistory[pubkeyHash]`, where `pubkeyHash` is looked up in `registry[operator].pubkeyHash` | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | 'true' if it is successfully proven that the `operator` was active at the `blockNumber`, and 'false' otherwise | - -### checkOperatorInactiveAtBlockNumber - -```solidity -function checkOperatorInactiveAtBlockNumber(address operator, uint256 blockNumber, uint256 stakeHistoryIndex) external view returns (bool) -``` - -Checks that the `operator` was inactive at the `blockNumber`, using the specified `stakeHistoryIndex` as proof. - -_In order for this function to return 'true', the inputs must satisfy all of the following list: -1) `pubkeyHashToStakeHistory[pubkeyHash][index].updateBlockNumber <= blockNumber` -2) `pubkeyHashToStakeHistory[pubkeyHash][index].nextUpdateBlockNumber` must be either `0` (signifying no next update) or -is must be strictly greater than `blockNumber` -3) `pubkeyHashToStakeHistory[pubkeyHash][index].firstQuorumStake > 0` -or `pubkeyHashToStakeHistory[pubkeyHash][index].secondQuorumStake > 0`, i.e. the operator had nonzero stake -Note that a return value of 'false' does not guarantee that the `operator` was active at `blockNumber`, since a -bad `stakeHistoryIndex` can be supplied in order to obtain a response of 'false'._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator of interest | -| blockNumber | uint256 | is the block number of interest | -| stakeHistoryIndex | uint256 | specifies an index in `pubkeyHashToStakeHistory[pubkeyHash]`, where `pubkeyHash` is looked up in `registry[operator].pubkeyHash` | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | 'true' if it is successfully proven that the `operator` was inactive at the `blockNumber`, and 'false' otherwise | - -### getOperatorIndex - -```solidity -function getOperatorIndex(address operator, uint32 blockNumber, uint32 index) external view returns (uint32) -``` - -Looks up the `operator`'s index in the dynamic array `operatorList` at the specified `blockNumber`. - -_Function will revert in the event that the specified `index` input does not identify the appropriate entry in the -array `pubkeyHashToIndexHistory[pubkeyHash]` to pull the info from._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | | -| blockNumber | uint32 | Is the desired block number at which we wish to query the operator's position in the `operatorList` array | -| index | uint32 | Used to specify the entry within the dynamic array `pubkeyHashToIndexHistory[pubkeyHash]` to read data from, where `pubkeyHash` is looked up from `operator`'s registration info | - -### getTotalOperators - -```solidity -function getTotalOperators(uint32 blockNumber, uint32 index) external view returns (uint32) -``` - -Looks up the number of total operators at the specified `blockNumber`. - -_This function will revert if the provided `index` is out of bounds._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| blockNumber | uint32 | | -| index | uint32 | Input used to specify the entry within the dynamic array `totalOperatorsHistory` to read data from. | - -### numOperators - -```solidity -function numOperators() external view returns (uint32) -``` - -Returns the current number of operators of this service. - -### operatorStakes - -```solidity -function operatorStakes(address operator) external view returns (uint96, uint96) -``` - -Returns the most recent stake weights for the `operator` - -_Function returns weights of **0** in the event that the operator has no stake history_ - -### totalStake - -```solidity -function totalStake() external view returns (uint96, uint96) -``` - -Returns the stake amounts from the latest entry in `totalStakeHistory`. - diff --git a/docs/docgen/interfaces/IRegistry.md b/docs/docgen/interfaces/IRegistry.md deleted file mode 100644 index 49a8a221c..000000000 --- a/docs/docgen/interfaces/IRegistry.md +++ /dev/null @@ -1,15 +0,0 @@ -# Solidity API - -## IRegistry - -Functions related to the registration process itself have been intentionally excluded -because their function signatures may vary significantly. - -### isActiveOperator - -```solidity -function isActiveOperator(address operator) external view returns (bool) -``` - -Returns 'true' if `operator` is registered as an active operator, and 'false' otherwise. - diff --git a/docs/docgen/interfaces/ISafe.md b/docs/docgen/interfaces/ISafe.md deleted file mode 100644 index 24b5c8bbc..000000000 --- a/docs/docgen/interfaces/ISafe.md +++ /dev/null @@ -1,37 +0,0 @@ -# Solidity API - -## ISafe - -### Operation - -```solidity -enum Operation { - Call, - DelegateCall -} -``` - -### setup - -```solidity -function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address payable paymentReceiver) external -``` - -### execTransaction - -```solidity -function execTransaction(address to, uint256 value, bytes data, enum ISafe.Operation operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address payable refundReceiver, bytes signatures) external payable returns (bytes) -``` - -### checkSignatures - -```solidity -function checkSignatures(bytes32 dataHash, bytes signatures) external view -``` - -### approveHash - -```solidity -function approveHash(bytes32 hashToApprove) external -``` - diff --git a/docs/docgen/interfaces/IServiceManager.md b/docs/docgen/interfaces/IServiceManager.md deleted file mode 100644 index daa191bde..000000000 --- a/docs/docgen/interfaces/IServiceManager.md +++ /dev/null @@ -1,58 +0,0 @@ -# Solidity API - -## IServiceManager - -### taskNumber - -```solidity -function taskNumber() external view returns (uint32) -``` - -Returns the current 'taskNumber' for the middleware - -### freezeOperator - -```solidity -function freezeOperator(address operator) external -``` - -Permissioned function that causes the ServiceManager to freeze the operator on EigenLayer, through a call to the Slasher contract - -### recordFirstStakeUpdate - -```solidity -function recordFirstStakeUpdate(address operator, uint32 serveUntilBlock) external -``` - -Permissioned function to have the ServiceManager forward a call to the slasher, recording an initial stake update (on operator registration) - -### recordStakeUpdate - -```solidity -function recordStakeUpdate(address operator, uint32 updateBlock, uint32 serveUntilBlock, uint256 prevElement) external -``` - -Permissioned function to have the ServiceManager forward a call to the slasher, recording a stake update - -### recordLastStakeUpdateAndRevokeSlashingAbility - -```solidity -function recordLastStakeUpdateAndRevokeSlashingAbility(address operator, uint32 serveUntilBlock) external -``` - -Permissioned function to have the ServiceManager forward a call to the slasher, recording a final stake update (on operator deregistration) - -### latestServeUntilBlock - -```solidity -function latestServeUntilBlock() external view returns (uint32) -``` - -Returns the latest block until which operators must serve. - -### owner - -```solidity -function owner() external view returns (address) -``` - diff --git a/docs/docgen/interfaces/ISlasher.md b/docs/docgen/interfaces/ISlasher.md deleted file mode 100644 index b01db6c95..000000000 --- a/docs/docgen/interfaces/ISlasher.md +++ /dev/null @@ -1,249 +0,0 @@ -# Solidity API - -## ISlasher - -See the `Slasher` contract itself for implementation details. - -### MiddlewareTimes - -```solidity -struct MiddlewareTimes { - uint32 stalestUpdateBlock; - uint32 latestServeUntilBlock; -} -``` - -### MiddlewareDetails - -```solidity -struct MiddlewareDetails { - uint32 contractCanSlashOperatorUntilBlock; - uint32 latestUpdateBlock; -} -``` - -### optIntoSlashing - -```solidity -function optIntoSlashing(address contractAddress) external -``` - -Gives the `contractAddress` permission to slash the funds of the caller. - -_Typically, this function must be called prior to registering for a middleware._ - -### freezeOperator - -```solidity -function freezeOperator(address toBeFrozen) external -``` - -Used for 'slashing' a certain operator. - -_Technically the operator is 'frozen' (hence the name of this function), and then subject to slashing pending a decision by a human-in-the-loop. -The operator must have previously given the caller (which should be a contract) the ability to slash them, through a call to `optIntoSlashing`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| toBeFrozen | address | The operator to be frozen. | - -### resetFrozenStatus - -```solidity -function resetFrozenStatus(address[] frozenAddresses) external -``` - -Removes the 'frozen' status from each of the `frozenAddresses` - -_Callable only by the contract owner (i.e. governance)._ - -### recordFirstStakeUpdate - -```solidity -function recordFirstStakeUpdate(address operator, uint32 serveUntilBlock) external -``` - -this function is a called by middlewares during an operator's registration to make sure the operator's stake at registration - is slashable until serveUntil - -_adds the middleware's slashing contract to the operator's linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the operator whose stake update is being recorded | -| serveUntilBlock | uint32 | the block until which the operator's stake at the current block is slashable | - -### recordStakeUpdate - -```solidity -function recordStakeUpdate(address operator, uint32 updateBlock, uint32 serveUntilBlock, uint256 insertAfter) external -``` - -this function is a called by middlewares during a stake update for an operator (perhaps to free pending withdrawals) - to make sure the operator's stake at updateBlock is slashable until serveUntil - -_insertAfter should be calculated offchain before making the transaction that calls this. this is subject to race conditions, - but it is anticipated to be rare and not detrimental._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the operator whose stake update is being recorded | -| updateBlock | uint32 | the block for which the stake update is being recorded | -| serveUntilBlock | uint32 | the block until which the operator's stake at updateBlock is slashable | -| insertAfter | uint256 | the element of the operators linked list that the currently updating middleware should be inserted after | - -### recordLastStakeUpdateAndRevokeSlashingAbility - -```solidity -function recordLastStakeUpdateAndRevokeSlashingAbility(address operator, uint32 serveUntilBlock) external -``` - -this function is a called by middlewares during an operator's deregistration to make sure the operator's stake at deregistration - is slashable until serveUntil - -_removes the middleware's slashing contract to the operator's linked list and revokes the middleware's (i.e. caller's) ability to -slash `operator` once `serveUntil` is reached_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | the operator whose stake update is being recorded | -| serveUntilBlock | uint32 | the block until which the operator's stake at the current block is slashable | - -### isFrozen - -```solidity -function isFrozen(address staker) external view returns (bool) -``` - -Used to determine whether `staker` is actively 'frozen'. If a staker is frozen, then they are potentially subject to -slashing of their funds, and cannot cannot deposit or withdraw from the strategyManager until the slashing process is completed -and the staker's status is reset (to 'unfrozen'). - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| staker | address | The staker of interest. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | Returns 'true' if `staker` themselves has their status set to frozen, OR if the staker is delegated to an operator who has their status set to frozen. Otherwise returns 'false'. | - -### canSlash - -```solidity -function canSlash(address toBeSlashed, address slashingContract) external view returns (bool) -``` - -Returns true if `slashingContract` is currently allowed to slash `toBeSlashed`. - -### contractCanSlashOperatorUntilBlock - -```solidity -function contractCanSlashOperatorUntilBlock(address operator, address serviceContract) external view returns (uint32) -``` - -Returns the block until which `serviceContract` is allowed to slash the `operator`. - -### latestUpdateBlock - -```solidity -function latestUpdateBlock(address operator, address serviceContract) external view returns (uint32) -``` - -Returns the block at which the `serviceContract` last updated its view of the `operator`'s stake - -### getCorrectValueForInsertAfter - -```solidity -function getCorrectValueForInsertAfter(address operator, uint32 updateBlock) external view returns (uint256) -``` - -A search routine for finding the correct input value of `insertAfter` to `recordStakeUpdate` / `_updateMiddlewareList`. - -### canWithdraw - -```solidity -function canWithdraw(address operator, uint32 withdrawalStartBlock, uint256 middlewareTimesIndex) external returns (bool) -``` - -Returns 'true' if `operator` can currently complete a withdrawal started at the `withdrawalStartBlock`, with `middlewareTimesIndex` used -to specify the index of a `MiddlewareTimes` struct in the operator's list (i.e. an index in `operatorToMiddlewareTimes[operator]`). The specified -struct is consulted as proof of the `operator`'s ability (or lack thereof) to complete the withdrawal. -This function will return 'false' if the operator cannot currently complete a withdrawal started at the `withdrawalStartBlock`, *or* in the event -that an incorrect `middlewareTimesIndex` is supplied, even if one or more correct inputs exist. - -_The correct `middlewareTimesIndex` input should be computable off-chain._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | Either the operator who queued the withdrawal themselves, or if the withdrawing party is a staker who delegated to an operator, this address is the operator *who the staker was delegated to* at the time of the `withdrawalStartBlock`. | -| withdrawalStartBlock | uint32 | The block number at which the withdrawal was initiated. | -| middlewareTimesIndex | uint256 | Indicates an index in `operatorToMiddlewareTimes[operator]` to consult as proof of the `operator`'s ability to withdraw | - -### operatorToMiddlewareTimes - -```solidity -function operatorToMiddlewareTimes(address operator, uint256 arrayIndex) external view returns (struct ISlasher.MiddlewareTimes) -``` - -operator => - [ - ( - the least recent update block of all of the middlewares it's serving/served, - latest time that the stake bonded at that update needed to serve until - ) - ] - -### middlewareTimesLength - -```solidity -function middlewareTimesLength(address operator) external view returns (uint256) -``` - -Getter function for fetching `operatorToMiddlewareTimes[operator].length` - -### getMiddlewareTimesIndexBlock - -```solidity -function getMiddlewareTimesIndexBlock(address operator, uint32 index) external view returns (uint32) -``` - -Getter function for fetching `operatorToMiddlewareTimes[operator][index].stalestUpdateBlock`. - -### getMiddlewareTimesIndexServeUntilBlock - -```solidity -function getMiddlewareTimesIndexServeUntilBlock(address operator, uint32 index) external view returns (uint32) -``` - -Getter function for fetching `operatorToMiddlewareTimes[operator][index].latestServeUntil`. - -### operatorWhitelistedContractsLinkedListSize - -```solidity -function operatorWhitelistedContractsLinkedListSize(address operator) external view returns (uint256) -``` - -Getter function for fetching `_operatorToWhitelistedContractsByUpdate[operator].size`. - -### operatorWhitelistedContractsLinkedListEntry - -```solidity -function operatorWhitelistedContractsLinkedListEntry(address operator, address node) external view returns (bool, uint256, uint256) -``` - -Getter function for fetching a single node in the operator's linked list (`_operatorToWhitelistedContractsByUpdate[operator]`). - diff --git a/docs/docgen/interfaces/IStrategy.md b/docs/docgen/interfaces/IStrategy.md deleted file mode 100644 index 7753401b9..000000000 --- a/docs/docgen/interfaces/IStrategy.md +++ /dev/null @@ -1,183 +0,0 @@ -# Solidity API - -## IStrategy - -Custom `Strategy` implementations may expand extensively on this interface. - -### deposit - -```solidity -function deposit(contract IERC20 token, uint256 amount) external returns (uint256) -``` - -Used to deposit tokens into this Strategy - -_This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's -`depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| token | contract IERC20 | is the ERC20 token being deposited | -| amount | uint256 | is the amount of token being deposited | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | newShares is the number of new shares issued at the current exchange ratio. | - -### withdraw - -```solidity -function withdraw(address depositor, contract IERC20 token, uint256 amountShares) external -``` - -Used to withdraw tokens from this Strategy, to the `depositor`'s address - -_This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's -other functions, and individual share balances are recorded in the strategyManager as well._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | is the address to receive the withdrawn funds | -| token | contract IERC20 | is the ERC20 token being transferred out | -| amountShares | uint256 | is the amount of shares being withdrawn | - -### sharesToUnderlying - -```solidity -function sharesToUnderlying(uint256 amountShares) external returns (uint256) -``` - -Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. -In contrast to `sharesToUnderlyingView`, this function **may** make state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountShares | uint256 | is the amount of shares to calculate its conversion into the underlying token | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of underlying tokens corresponding to the input `amountShares` | - -### underlyingToShares - -```solidity -function underlyingToShares(uint256 amountUnderlying) external returns (uint256) -``` - -Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. -In contrast to `underlyingToSharesView`, this function **may** make state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountUnderlying | uint256 | is the amount of `underlyingToken` to calculate its conversion into strategy shares | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of underlying tokens corresponding to the input `amountShares` | - -### userUnderlying - -```solidity -function userUnderlying(address user) external returns (uint256) -``` - -convenience function for fetching the current underlying value of all of the `user`'s shares in -this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications - -### sharesToUnderlyingView - -```solidity -function sharesToUnderlyingView(uint256 amountShares) external view returns (uint256) -``` - -Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. -In contrast to `sharesToUnderlying`, this function guarantees no state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountShares | uint256 | is the amount of shares to calculate its conversion into the underlying token | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of shares corresponding to the input `amountUnderlying` | - -### underlyingToSharesView - -```solidity -function underlyingToSharesView(uint256 amountUnderlying) external view returns (uint256) -``` - -Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. -In contrast to `underlyingToShares`, this function guarantees no state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountUnderlying | uint256 | is the amount of `underlyingToken` to calculate its conversion into strategy shares | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of shares corresponding to the input `amountUnderlying` | - -### userUnderlyingView - -```solidity -function userUnderlyingView(address user) external view returns (uint256) -``` - -convenience function for fetching the current underlying value of all of the `user`'s shares in -this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications - -### underlyingToken - -```solidity -function underlyingToken() external view returns (contract IERC20) -``` - -The underlying token for shares in this Strategy - -### totalShares - -```solidity -function totalShares() external view returns (uint256) -``` - -The total number of extant shares in this Strategy - -### explanation - -```solidity -function explanation() external view returns (string) -``` - -Returns either a brief string explaining the strategy's goal & purpose, or a link to metadata that explains in more detail. - diff --git a/docs/docgen/interfaces/IStrategyManager.md b/docs/docgen/interfaces/IStrategyManager.md deleted file mode 100644 index 52c17f208..000000000 --- a/docs/docgen/interfaces/IStrategyManager.md +++ /dev/null @@ -1,345 +0,0 @@ -# Solidity API - -## IStrategyManager - -See the `StrategyManager` contract itself for implementation details. - -### WithdrawerAndNonce - -```solidity -struct WithdrawerAndNonce { - address withdrawer; - uint96 nonce; -} -``` - -### QueuedWithdrawal - -```solidity -struct QueuedWithdrawal { - contract IStrategy[] strategies; - uint256[] shares; - address depositor; - struct IStrategyManager.WithdrawerAndNonce withdrawerAndNonce; - uint32 withdrawalStartBlock; - address delegatedAddress; -} -``` - -### depositIntoStrategy - -```solidity -function depositIntoStrategy(contract IStrategy strategy, contract IERC20 token, uint256 amount) external returns (uint256 shares) -``` - -Deposits `amount` of `token` into the specified `strategy`, with the resultant shares credited to `msg.sender` - -_The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf. -Cannot be called by an address that is 'frozen' (this function will revert if the `msg.sender` is frozen). - -WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors - where the token balance and corresponding strategy shares are not in sync upon reentrancy._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategy | contract IStrategy | is the specified strategy where deposit is to be made, | -| token | contract IERC20 | is the denomination in which the deposit is to be made, | -| amount | uint256 | is the amount of token to be deposited in the strategy by the depositor | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| shares | uint256 | The amount of new shares in the `strategy` created as part of the action. | - -### depositBeaconChainETH - -```solidity -function depositBeaconChainETH(address staker, uint256 amount) external -``` - -Deposits `amount` of beaconchain ETH into this contract on behalf of `staker` - -_Only callable by EigenPodManager._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| staker | address | is the entity that is restaking in eigenlayer, | -| amount | uint256 | is the amount of beaconchain ETH being restaked, | - -### recordOvercommittedBeaconChainETH - -```solidity -function recordOvercommittedBeaconChainETH(address overcommittedPodOwner, uint256 beaconChainETHStrategyIndex, uint256 amount) external -``` - -Records an overcommitment event on behalf of a staker. The staker's beaconChainETH shares are decremented by `amount`. - -_Only callable by EigenPodManager._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| overcommittedPodOwner | address | is the pod owner to be slashed | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy in case it must be removed, | -| amount | uint256 | is the amount to decrement the slashedAddress's beaconChainETHStrategy shares | - -### depositIntoStrategyWithSignature - -```solidity -function depositIntoStrategyWithSignature(contract IStrategy strategy, contract IERC20 token, uint256 amount, address staker, uint256 expiry, bytes signature) external returns (uint256 shares) -``` - -Used for depositing an asset into the specified strategy with the resultant shares credited to `staker`, -who must sign off on the action. -Note that the assets are transferred out/from the `msg.sender`, not from the `staker`; this function is explicitly designed -purely to help one address deposit 'for' another. - -_The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf. -A signature is required for this function to eliminate the possibility of griefing attacks, specifically those -targeting stakers who may be attempting to undelegate. -Cannot be called on behalf of a staker that is 'frozen' (this function will revert if the `staker` is frozen). - - WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors - where the token balance and corresponding strategy shares are not in sync upon reentrancy_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategy | contract IStrategy | is the specified strategy where deposit is to be made, | -| token | contract IERC20 | is the denomination in which the deposit is to be made, | -| amount | uint256 | is the amount of token to be deposited in the strategy by the depositor | -| staker | address | the staker that the deposited assets will be credited to | -| expiry | uint256 | the timestamp at which the signature expires | -| signature | bytes | is a valid signature from the `staker`. either an ECDSA signature if the `staker` is an EOA, or data to forward following EIP-1271 if the `staker` is a contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| shares | uint256 | The amount of new shares in the `strategy` created as part of the action. | - -### stakerStrategyShares - -```solidity -function stakerStrategyShares(address user, contract IStrategy strategy) external view returns (uint256 shares) -``` - -Returns the current shares of `user` in `strategy` - -### getDeposits - -```solidity -function getDeposits(address depositor) external view returns (contract IStrategy[], uint256[]) -``` - -Get all details on the depositor's deposits and corresponding shares - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | contract IStrategy[] | (depositor's strategies, shares in these strategies) | -| [1] | uint256[] | | - -### stakerStrategyListLength - -```solidity -function stakerStrategyListLength(address staker) external view returns (uint256) -``` - -Simple getter function that returns `stakerStrategyList[staker].length`. - -### queueWithdrawal - -```solidity -function queueWithdrawal(uint256[] strategyIndexes, contract IStrategy[] strategies, uint256[] shares, address withdrawer, bool undelegateIfPossible) external returns (bytes32) -``` - -Called by a staker to queue a withdrawal of the given amount of `shares` from each of the respective given `strategies`. - -_Stakers will complete their withdrawal by calling the 'completeQueuedWithdrawal' function. -User shares are decreased in this function, but the total number of shares in each strategy remains the same. -The total number of shares is decremented in the 'completeQueuedWithdrawal' function instead, which is where -the funds are actually sent to the user through use of the strategies' 'withdrawal' function. This ensures -that the value per share reported by each strategy will remain consistent, and that the shares will continue -to accrue gains during the enforced withdrawal waiting period. -Strategies are removed from `stakerStrategyList` by swapping the last entry with the entry to be removed, then -popping off the last entry in `stakerStrategyList`. The simplest way to calculate the correct `strategyIndexes` to input -is to order the strategies *for which `msg.sender` is withdrawing 100% of their shares* from highest index in -`stakerStrategyList` to lowest index -Note that if the withdrawal includes shares in the enshrined 'beaconChainETH' strategy, then it must *only* include shares in this strategy, and -`withdrawer` must match the caller's address. The first condition is because slashing of queued withdrawals cannot be guaranteed -for Beacon Chain ETH (since we cannot trigger a withdrawal from the beacon chain through a smart contract) and the second condition is because shares in -the enshrined 'beaconChainETH' strategy technically represent non-fungible positions (deposits to the Beacon Chain, each pointed at a specific EigenPod)._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategyIndexes | uint256[] | is a list of the indices in `stakerStrategyList[msg.sender]` that correspond to the strategies for which `msg.sender` is withdrawing 100% of their shares | -| strategies | contract IStrategy[] | The Strategies to withdraw from | -| shares | uint256[] | The amount of shares to withdraw from each of the respective Strategies in the `strategies` array | -| withdrawer | address | The address that can complete the withdrawal and will receive any withdrawn funds or shares upon completing the withdrawal | -| undelegateIfPossible | bool | If this param is marked as 'true' *and the withdrawal will result in `msg.sender` having no shares in any Strategy,* then this function will also make an internal call to `undelegate(msg.sender)` to undelegate the `msg.sender`. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The 'withdrawalRoot' of the newly created Queued Withdrawal | - -### completeQueuedWithdrawal - -```solidity -function completeQueuedWithdrawal(struct IStrategyManager.QueuedWithdrawal queuedWithdrawal, contract IERC20[] tokens, uint256 middlewareTimesIndex, bool receiveAsTokens) external -``` - -Used to complete the specified `queuedWithdrawal`. The function caller must match `queuedWithdrawal.withdrawer` - -_middlewareTimesIndex should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw`_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| queuedWithdrawal | struct IStrategyManager.QueuedWithdrawal | The QueuedWithdrawal to complete. | -| tokens | contract IERC20[] | Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `strategies` array of the `queuedWithdrawal`. This input can be provided with zero length if `receiveAsTokens` is set to 'false' (since in that case, this input will be unused) | -| middlewareTimesIndex | uint256 | is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array | -| receiveAsTokens | bool | If true, the shares specified in the queued withdrawal will be withdrawn from the specified strategies themselves and sent to the caller, through calls to `queuedWithdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies will simply be transferred to the caller directly. | - -### completeQueuedWithdrawals - -```solidity -function completeQueuedWithdrawals(struct IStrategyManager.QueuedWithdrawal[] queuedWithdrawals, contract IERC20[][] tokens, uint256[] middlewareTimesIndexes, bool[] receiveAsTokens) external -``` - -Used to complete the specified `queuedWithdrawals`. The function caller must match `queuedWithdrawals[...].withdrawer` - -_Array-ified version of `completeQueuedWithdrawal` -middlewareTimesIndex should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw`_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| queuedWithdrawals | struct IStrategyManager.QueuedWithdrawal[] | The QueuedWithdrawals to complete. | -| tokens | contract IERC20[][] | Array of tokens for each QueuedWithdrawal. See `completeQueuedWithdrawal` for the usage of a single array. | -| middlewareTimesIndexes | uint256[] | One index to reference per QueuedWithdrawal. See `completeQueuedWithdrawal` for the usage of a single index. | -| receiveAsTokens | bool[] | If true, the shares specified in the queued withdrawal will be withdrawn from the specified strategies themselves and sent to the caller, through calls to `queuedWithdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies will simply be transferred to the caller directly. | - -### slashShares - -```solidity -function slashShares(address slashedAddress, address recipient, contract IStrategy[] strategies, contract IERC20[] tokens, uint256[] strategyIndexes, uint256[] shareAmounts) external -``` - -Slashes the shares of a 'frozen' operator (or a staker delegated to one) - -_strategies are removed from `stakerStrategyList` by swapping the last entry with the entry to be removed, then -popping off the last entry in `stakerStrategyList`. The simplest way to calculate the correct `strategyIndexes` to input -is to order the strategies *for which `msg.sender` is withdrawing 100% of their shares* from highest index in -`stakerStrategyList` to lowest index_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| slashedAddress | address | is the frozen address that is having its shares slashed | -| recipient | address | is the address that will receive the slashed funds, which could e.g. be a harmed party themself, or a MerkleDistributor-type contract that further sub-divides the slashed funds. | -| strategies | contract IStrategy[] | Strategies to slash | -| tokens | contract IERC20[] | The tokens to use as input to the `withdraw` function of each of the provided `strategies` | -| strategyIndexes | uint256[] | is a list of the indices in `stakerStrategyList[msg.sender]` that correspond to the strategies for which `msg.sender` is withdrawing 100% of their shares | -| shareAmounts | uint256[] | The amount of shares to slash in each of the provided `strategies` | - -### slashQueuedWithdrawal - -```solidity -function slashQueuedWithdrawal(address recipient, struct IStrategyManager.QueuedWithdrawal queuedWithdrawal, contract IERC20[] tokens, uint256[] indicesToSkip) external -``` - -Slashes an existing queued withdrawal that was created by a 'frozen' operator (or a staker delegated to one) - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| recipient | address | The funds in the slashed withdrawal are withdrawn as tokens to this address. | -| queuedWithdrawal | struct IStrategyManager.QueuedWithdrawal | The previously queued withdrawal to be slashed | -| tokens | contract IERC20[] | Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `strategies` array of the `queuedWithdrawal`. | -| indicesToSkip | uint256[] | Optional input parameter -- indices in the `strategies` array to skip (i.e. not call the 'withdraw' function on). This input exists so that, e.g., if the slashed QueuedWithdrawal contains a malicious strategy in the `strategies` array which always reverts on calls to its 'withdraw' function, then the malicious strategy can be skipped (with the shares in effect "burned"), while the non-malicious strategies are still called as normal. | - -### calculateWithdrawalRoot - -```solidity -function calculateWithdrawalRoot(struct IStrategyManager.QueuedWithdrawal queuedWithdrawal) external pure returns (bytes32) -``` - -Returns the keccak256 hash of `queuedWithdrawal`. - -### addStrategiesToDepositWhitelist - -```solidity -function addStrategiesToDepositWhitelist(contract IStrategy[] strategiesToWhitelist) external -``` - -Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategiesToWhitelist | contract IStrategy[] | Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already) | - -### removeStrategiesFromDepositWhitelist - -```solidity -function removeStrategiesFromDepositWhitelist(contract IStrategy[] strategiesToRemoveFromWhitelist) external -``` - -Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| strategiesToRemoveFromWhitelist | contract IStrategy[] | Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it) | - -### delegation - -```solidity -function delegation() external view returns (contract IDelegationManager) -``` - -Returns the single, central Delegation contract of EigenLayer - -### slasher - -```solidity -function slasher() external view returns (contract ISlasher) -``` - -Returns the single, central Slasher contract of EigenLayer - -### beaconChainETHStrategy - -```solidity -function beaconChainETHStrategy() external view returns (contract IStrategy) -``` - -returns the enshrined, virtual 'beaconChainETH' Strategy - -### withdrawalDelayBlocks - -```solidity -function withdrawalDelayBlocks() external view returns (uint256) -``` - -Returns the number of blocks that must pass between the time a withdrawal is queued and the time it can be completed - diff --git a/docs/docgen/interfaces/IVoteWeigher.md b/docs/docgen/interfaces/IVoteWeigher.md deleted file mode 100644 index 10e91a839..000000000 --- a/docs/docgen/interfaces/IVoteWeigher.md +++ /dev/null @@ -1,34 +0,0 @@ -# Solidity API - -## IVoteWeigher - -Note that `NUMBER_OF_QUORUMS` is expected to remain constant, as suggested by its uppercase formatting. - -### weightOfOperator - -```solidity -function weightOfOperator(address operator, uint256 quorumNumber) external returns (uint96) -``` - -This function computes the total weight of the @param operator in the quorum @param quorumNumber. - -_returns zero in the case that `quorumNumber` is greater than or equal to `NUMBER_OF_QUORUMS`_ - -### NUMBER_OF_QUORUMS - -```solidity -function NUMBER_OF_QUORUMS() external view returns (uint256) -``` - -Number of quorums that are being used by the middleware. - -### quorumBips - -```solidity -function quorumBips(uint256 quorumNumber) external view returns (uint256) -``` - -This defines the earnings split between different quorums. Mapping is quorumNumber => BIPS which the quorum earns, out of the total earnings. - -_The sum of all entries, i.e. sum(quorumBips[0] through quorumBips[NUMBER_OF_QUORUMS - 1]) should *always* be 10,000!_ - diff --git a/docs/docgen/interfaces/IWhitelister.md b/docs/docgen/interfaces/IWhitelister.md deleted file mode 100644 index a8b97e4a1..000000000 --- a/docs/docgen/interfaces/IWhitelister.md +++ /dev/null @@ -1,46 +0,0 @@ -# Solidity API - -## IWhitelister - -### whitelist - -```solidity -function whitelist(address operator) external -``` - -### getStaker - -```solidity -function getStaker(address operator) external returns (address) -``` - -### depositIntoStrategy - -```solidity -function depositIntoStrategy(address staker, contract IStrategy strategy, contract IERC20 token, uint256 amount) external returns (bytes) -``` - -### queueWithdrawal - -```solidity -function queueWithdrawal(address staker, uint256[] strategyIndexes, contract IStrategy[] strategies, uint256[] shares, address withdrawer, bool undelegateIfPossible) external returns (bytes) -``` - -### completeQueuedWithdrawal - -```solidity -function completeQueuedWithdrawal(address staker, struct IStrategyManager.QueuedWithdrawal queuedWithdrawal, contract IERC20[] tokens, uint256 middlewareTimesIndex, bool receiveAsTokens) external returns (bytes) -``` - -### transfer - -```solidity -function transfer(address staker, address token, address to, uint256 amount) external returns (bytes) -``` - -### callAddress - -```solidity -function callAddress(address to, bytes data) external payable returns (bytes) -``` - diff --git a/docs/docgen/libraries/BN254.md b/docs/docgen/libraries/BN254.md deleted file mode 100644 index 56e3f320a..000000000 --- a/docs/docgen/libraries/BN254.md +++ /dev/null @@ -1,215 +0,0 @@ -# Solidity API - -## BN254 - -Contains BN254 parameters, common operations (addition, scalar mul, pairing), and BLS signature functionality. - -### FP_MODULUS - -```solidity -uint256 FP_MODULUS -``` - -### FR_MODULUS - -```solidity -uint256 FR_MODULUS -``` - -### G1Point - -```solidity -struct G1Point { - uint256 X; - uint256 Y; -} -``` - -### G2Point - -```solidity -struct G2Point { - uint256[2] X; - uint256[2] Y; -} -``` - -### G2x1 - -```solidity -uint256 G2x1 -``` - -_Generator point in F_q2 is of the form: (x0 + ix1, y0 + iy1)._ - -### G2x0 - -```solidity -uint256 G2x0 -``` - -### G2y1 - -```solidity -uint256 G2y1 -``` - -### G2y0 - -```solidity -uint256 G2y0 -``` - -### generatorG2 - -```solidity -function generatorG2() internal pure returns (struct BN254.G2Point) -``` - -returns the G2 generator - -_mind the ordering of the 1s and 0s! - this is because of the (unknown to us) convention used in the bn254 pairing precompile contract - "Elements a * i + b of F_p^2 are encoded as two elements of F_p, (a, b)." - https://github.com/ethereum/EIPs/blob/master/EIPS/eip-197.md#encoding_ - -### nG2x1 - -```solidity -uint256 nG2x1 -``` - -_Generator point in F_q2 is of the form: (x0 + ix1, y0 + iy1)._ - -### nG2x0 - -```solidity -uint256 nG2x0 -``` - -### nG2y1 - -```solidity -uint256 nG2y1 -``` - -### nG2y0 - -```solidity -uint256 nG2y0 -``` - -### negGeneratorG2 - -```solidity -function negGeneratorG2() internal pure returns (struct BN254.G2Point) -``` - -### powersOfTauMerkleRoot - -```solidity -bytes32 powersOfTauMerkleRoot -``` - -### negate - -```solidity -function negate(struct BN254.G1Point p) internal pure returns (struct BN254.G1Point) -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| p | struct BN254.G1Point | Some point in G1. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct BN254.G1Point | The negation of `p`, i.e. p.plus(p.negate()) should be zero. | - -### plus - -```solidity -function plus(struct BN254.G1Point p1, struct BN254.G1Point p2) internal view returns (struct BN254.G1Point r) -``` - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| r | struct BN254.G1Point | the sum of two points of G1 | - -### scalar_mul - -```solidity -function scalar_mul(struct BN254.G1Point p, uint256 s) internal view returns (struct BN254.G1Point r) -``` - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| r | struct BN254.G1Point | the product of a point on G1 and a scalar, i.e. p == p.scalar_mul(1) and p.plus(p) == p.scalar_mul(2) for all points p. | - -### pairing - -```solidity -function pairing(struct BN254.G1Point a1, struct BN254.G2Point a2, struct BN254.G1Point b1, struct BN254.G2Point b2) internal view returns (bool) -``` - -@return The result of computing the pairing check - e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1 - For example, - pairing([P1(), P1().negate()], [P2(), P2()]) should return true. - -### safePairing - -```solidity -function safePairing(struct BN254.G1Point a1, struct BN254.G2Point a2, struct BN254.G1Point b1, struct BN254.G2Point b2, uint256 pairingGas) internal view returns (bool, bool) -``` - -This function is functionally the same as pairing(), however it specifies a gas limit - the user can set, as a precompile may use the entire gas budget if it reverts. - -### hashG1Point - -```solidity -function hashG1Point(struct BN254.G1Point pk) internal pure returns (bytes32) -``` - -_used for BLS signatures_ - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | the keccak256 hash of the G1 Point | - -### hashToG1 - -```solidity -function hashToG1(bytes32 _x) internal view returns (uint256, uint256) -``` - -adapted from https://github.com/HarryR/solcrypto/blob/master/contracts/altbn128.sol - -### findYFromX - -```solidity -function findYFromX(uint256 x) internal view returns (uint256, uint256) -``` - -Given X, find Y - - where y = sqrt(x^3 + b) - -Returns: (x^3 + b), y - -### expMod - -```solidity -function expMod(uint256 _base, uint256 _exponent, uint256 _modulus) internal view returns (uint256 retval) -``` - diff --git a/docs/docgen/libraries/BeaconChainProofs.md b/docs/docgen/libraries/BeaconChainProofs.md deleted file mode 100644 index f76d081cb..000000000 --- a/docs/docgen/libraries/BeaconChainProofs.md +++ /dev/null @@ -1,427 +0,0 @@ -# Solidity API - -## BeaconChainProofs - -### NUM_BEACON_BLOCK_HEADER_FIELDS - -```solidity -uint256 NUM_BEACON_BLOCK_HEADER_FIELDS -``` - -### BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT - -```solidity -uint256 BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT -``` - -### NUM_BEACON_BLOCK_BODY_FIELDS - -```solidity -uint256 NUM_BEACON_BLOCK_BODY_FIELDS -``` - -### BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT - -```solidity -uint256 BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT -``` - -### NUM_BEACON_STATE_FIELDS - -```solidity -uint256 NUM_BEACON_STATE_FIELDS -``` - -### BEACON_STATE_FIELD_TREE_HEIGHT - -```solidity -uint256 BEACON_STATE_FIELD_TREE_HEIGHT -``` - -### NUM_ETH1_DATA_FIELDS - -```solidity -uint256 NUM_ETH1_DATA_FIELDS -``` - -### ETH1_DATA_FIELD_TREE_HEIGHT - -```solidity -uint256 ETH1_DATA_FIELD_TREE_HEIGHT -``` - -### NUM_VALIDATOR_FIELDS - -```solidity -uint256 NUM_VALIDATOR_FIELDS -``` - -### VALIDATOR_FIELD_TREE_HEIGHT - -```solidity -uint256 VALIDATOR_FIELD_TREE_HEIGHT -``` - -### NUM_EXECUTION_PAYLOAD_HEADER_FIELDS - -```solidity -uint256 NUM_EXECUTION_PAYLOAD_HEADER_FIELDS -``` - -### EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT - -```solidity -uint256 EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT -``` - -### NUM_EXECUTION_PAYLOAD_FIELDS - -```solidity -uint256 NUM_EXECUTION_PAYLOAD_FIELDS -``` - -### EXECUTION_PAYLOAD_FIELD_TREE_HEIGHT - -```solidity -uint256 EXECUTION_PAYLOAD_FIELD_TREE_HEIGHT -``` - -### HISTORICAL_ROOTS_TREE_HEIGHT - -```solidity -uint256 HISTORICAL_ROOTS_TREE_HEIGHT -``` - -### HISTORICAL_BATCH_TREE_HEIGHT - -```solidity -uint256 HISTORICAL_BATCH_TREE_HEIGHT -``` - -### STATE_ROOTS_TREE_HEIGHT - -```solidity -uint256 STATE_ROOTS_TREE_HEIGHT -``` - -### BLOCK_ROOTS_TREE_HEIGHT - -```solidity -uint256 BLOCK_ROOTS_TREE_HEIGHT -``` - -### NUM_WITHDRAWAL_FIELDS - -```solidity -uint256 NUM_WITHDRAWAL_FIELDS -``` - -### WITHDRAWAL_FIELD_TREE_HEIGHT - -```solidity -uint256 WITHDRAWAL_FIELD_TREE_HEIGHT -``` - -### VALIDATOR_TREE_HEIGHT - -```solidity -uint256 VALIDATOR_TREE_HEIGHT -``` - -### BALANCE_TREE_HEIGHT - -```solidity -uint256 BALANCE_TREE_HEIGHT -``` - -### WITHDRAWALS_TREE_HEIGHT - -```solidity -uint256 WITHDRAWALS_TREE_HEIGHT -``` - -### EXECUTION_PAYLOAD_INDEX - -```solidity -uint256 EXECUTION_PAYLOAD_INDEX -``` - -### STATE_ROOT_INDEX - -```solidity -uint256 STATE_ROOT_INDEX -``` - -### PROPOSER_INDEX_INDEX - -```solidity -uint256 PROPOSER_INDEX_INDEX -``` - -### SLOT_INDEX - -```solidity -uint256 SLOT_INDEX -``` - -### BODY_ROOT_INDEX - -```solidity -uint256 BODY_ROOT_INDEX -``` - -### STATE_ROOTS_INDEX - -```solidity -uint256 STATE_ROOTS_INDEX -``` - -### BLOCK_ROOTS_INDEX - -```solidity -uint256 BLOCK_ROOTS_INDEX -``` - -### HISTORICAL_ROOTS_INDEX - -```solidity -uint256 HISTORICAL_ROOTS_INDEX -``` - -### ETH_1_ROOT_INDEX - -```solidity -uint256 ETH_1_ROOT_INDEX -``` - -### VALIDATOR_TREE_ROOT_INDEX - -```solidity -uint256 VALIDATOR_TREE_ROOT_INDEX -``` - -### BALANCE_INDEX - -```solidity -uint256 BALANCE_INDEX -``` - -### EXECUTION_PAYLOAD_HEADER_INDEX - -```solidity -uint256 EXECUTION_PAYLOAD_HEADER_INDEX -``` - -### HISTORICAL_BATCH_STATE_ROOT_INDEX - -```solidity -uint256 HISTORICAL_BATCH_STATE_ROOT_INDEX -``` - -### VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX - -```solidity -uint256 VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX -``` - -### VALIDATOR_BALANCE_INDEX - -```solidity -uint256 VALIDATOR_BALANCE_INDEX -``` - -### VALIDATOR_SLASHED_INDEX - -```solidity -uint256 VALIDATOR_SLASHED_INDEX -``` - -### VALIDATOR_WITHDRAWABLE_EPOCH_INDEX - -```solidity -uint256 VALIDATOR_WITHDRAWABLE_EPOCH_INDEX -``` - -### BLOCK_NUMBER_INDEX - -```solidity -uint256 BLOCK_NUMBER_INDEX -``` - -### WITHDRAWALS_ROOT_INDEX - -```solidity -uint256 WITHDRAWALS_ROOT_INDEX -``` - -### WITHDRAWALS_INDEX - -```solidity -uint256 WITHDRAWALS_INDEX -``` - -### WITHDRAWAL_VALIDATOR_INDEX_INDEX - -```solidity -uint256 WITHDRAWAL_VALIDATOR_INDEX_INDEX -``` - -### WITHDRAWAL_VALIDATOR_AMOUNT_INDEX - -```solidity -uint256 WITHDRAWAL_VALIDATOR_AMOUNT_INDEX -``` - -### HISTORICALBATCH_STATEROOTS_INDEX - -```solidity -uint256 HISTORICALBATCH_STATEROOTS_INDEX -``` - -### SLOTS_PER_EPOCH - -```solidity -uint256 SLOTS_PER_EPOCH -``` - -### UINT64_MASK - -```solidity -bytes8 UINT64_MASK -``` - -### WithdrawalProofs - -```solidity -struct WithdrawalProofs { - bytes blockHeaderProof; - bytes withdrawalProof; - bytes slotProof; - bytes executionPayloadProof; - bytes blockNumberProof; - uint64 blockHeaderRootIndex; - uint64 withdrawalIndex; - bytes32 blockHeaderRoot; - bytes32 blockBodyRoot; - bytes32 slotRoot; - bytes32 blockNumberRoot; - bytes32 executionPayloadRoot; -} -``` - -### ValidatorFieldsAndBalanceProofs - -```solidity -struct ValidatorFieldsAndBalanceProofs { - bytes validatorFieldsProof; - bytes validatorBalanceProof; - bytes32 balanceRoot; -} -``` - -### ValidatorFieldsProof - -```solidity -struct ValidatorFieldsProof { - bytes validatorProof; - uint40 validatorIndex; -} -``` - -### computePhase0BeaconBlockHeaderRoot - -```solidity -function computePhase0BeaconBlockHeaderRoot(bytes32[5] blockHeaderFields) internal pure returns (bytes32) -``` - -### computePhase0BeaconStateRoot - -```solidity -function computePhase0BeaconStateRoot(bytes32[21] beaconStateFields) internal pure returns (bytes32) -``` - -### computePhase0ValidatorRoot - -```solidity -function computePhase0ValidatorRoot(bytes32[8] validatorFields) internal pure returns (bytes32) -``` - -### computePhase0Eth1DataRoot - -```solidity -function computePhase0Eth1DataRoot(bytes32[3] eth1DataFields) internal pure returns (bytes32) -``` - -### getBalanceFromBalanceRoot - -```solidity -function getBalanceFromBalanceRoot(uint40 validatorIndex, bytes32 balanceRoot) internal pure returns (uint64) -``` - -This function is parses the balanceRoot to get the uint64 balance of a validator. During merkleization of the -beacon state balance tree, four uint64 values (making 32 bytes) are grouped together and treated as a single leaf in the merkle tree. Thus the -validatorIndex mod 4 is used to determine which of the four uint64 values to extract from the balanceRoot. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| validatorIndex | uint40 | is the index of the validator being proven for. | -| balanceRoot | bytes32 | is the combination of 4 validator balances being proven for. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint64 | The validator's balance, in Gwei | - -### verifyValidatorFields - -```solidity -function verifyValidatorFields(uint40 validatorIndex, bytes32 beaconStateRoot, bytes proof, bytes32[] validatorFields) internal view -``` - -This function verifies merkle proofs of the fields of a certain validator against a beacon chain state root - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| validatorIndex | uint40 | the index of the proven validator | -| beaconStateRoot | bytes32 | is the beacon chain state root to be proven against. | -| proof | bytes | is the data used in proving the validator's fields | -| validatorFields | bytes32[] | the claimed fields of the validator | - -### verifyValidatorBalance - -```solidity -function verifyValidatorBalance(uint40 validatorIndex, bytes32 beaconStateRoot, bytes proof, bytes32 balanceRoot) internal view -``` - -This function verifies merkle proofs of the balance of a certain validator against a beacon chain state root - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| validatorIndex | uint40 | the index of the proven validator | -| beaconStateRoot | bytes32 | is the beacon chain state root to be proven against. | -| proof | bytes | is the proof of the balance against the beacon chain state root | -| balanceRoot | bytes32 | is the serialized balance used to prove the balance of the validator (refer to `getBalanceFromBalanceRoot` above for detailed explanation) | - -### verifyWithdrawalProofs - -```solidity -function verifyWithdrawalProofs(bytes32 beaconStateRoot, struct BeaconChainProofs.WithdrawalProofs proofs, bytes32[] withdrawalFields) internal view -``` - -This function verifies the slot and the withdrawal fields for a given withdrawal - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| beaconStateRoot | bytes32 | is the beacon chain state root to be proven against. | -| proofs | struct BeaconChainProofs.WithdrawalProofs | is the provided set of merkle proofs | -| withdrawalFields | bytes32[] | is the serialized withdrawal container to be proven | - diff --git a/docs/docgen/libraries/BytesLib.md b/docs/docgen/libraries/BytesLib.md deleted file mode 100644 index 6d3aa5055..000000000 --- a/docs/docgen/libraries/BytesLib.md +++ /dev/null @@ -1,88 +0,0 @@ -# Solidity API - -## BytesLib - -### concat - -```solidity -function concat(bytes _preBytes, bytes _postBytes) internal pure returns (bytes) -``` - -### concatStorage - -```solidity -function concatStorage(bytes _preBytes, bytes _postBytes) internal -``` - -### slice - -```solidity -function slice(bytes _bytes, uint256 _start, uint256 _length) internal pure returns (bytes) -``` - -### toAddress - -```solidity -function toAddress(bytes _bytes, uint256 _start) internal pure returns (address) -``` - -### toUint8 - -```solidity -function toUint8(bytes _bytes, uint256 _start) internal pure returns (uint8) -``` - -### toUint16 - -```solidity -function toUint16(bytes _bytes, uint256 _start) internal pure returns (uint16) -``` - -### toUint32 - -```solidity -function toUint32(bytes _bytes, uint256 _start) internal pure returns (uint32) -``` - -### toUint64 - -```solidity -function toUint64(bytes _bytes, uint256 _start) internal pure returns (uint64) -``` - -### toUint96 - -```solidity -function toUint96(bytes _bytes, uint256 _start) internal pure returns (uint96) -``` - -### toUint128 - -```solidity -function toUint128(bytes _bytes, uint256 _start) internal pure returns (uint128) -``` - -### toUint256 - -```solidity -function toUint256(bytes _bytes, uint256 _start) internal pure returns (uint256) -``` - -### toBytes32 - -```solidity -function toBytes32(bytes _bytes, uint256 _start) internal pure returns (bytes32) -``` - -### equal - -```solidity -function equal(bytes _preBytes, bytes _postBytes) internal pure returns (bool) -``` - -### equalStorage - -```solidity -function equalStorage(bytes _preBytes, bytes _postBytes) internal view returns (bool) -``` - diff --git a/docs/docgen/libraries/Endian.md b/docs/docgen/libraries/Endian.md deleted file mode 100644 index b0f8941c0..000000000 --- a/docs/docgen/libraries/Endian.md +++ /dev/null @@ -1,27 +0,0 @@ -# Solidity API - -## Endian - -### fromLittleEndianUint64 - -```solidity -function fromLittleEndianUint64(bytes32 lenum) internal pure returns (uint64 n) -``` - -Converts a little endian-formatted uint64 to a big endian-formatted uint64 - -_Note that the input is formatted as a 'bytes32' type (i.e. 256 bits), but it is immediately truncated to a uint64 (i.e. 64 bits) -through a right-shift/shr operation._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| lenum | bytes32 | little endian-formatted uint64 input, provided as 'bytes32' type | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| n | uint64 | The big endian-formatted uint64 | - diff --git a/docs/docgen/libraries/Merkle.md b/docs/docgen/libraries/Merkle.md deleted file mode 100644 index 52b4f8ad0..000000000 --- a/docs/docgen/libraries/Merkle.md +++ /dev/null @@ -1,85 +0,0 @@ -# Solidity API - -## Merkle - -_These functions deal with verification of Merkle Tree proofs. - -The tree and the proofs can be generated using our -https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. -You will find a quickstart guide in the readme. - -WARNING: You should avoid using leaf values that are 64 bytes long prior to -hashing, or use a hash function other than keccak256 for hashing leaves. -This is because the concatenation of a sorted pair of internal nodes in -the merkle tree could be reinterpreted as a leaf value. -OpenZeppelin's JavaScript library generates merkle trees that are safe -against this attack out of the box._ - -### verifyInclusionKeccak - -```solidity -function verifyInclusionKeccak(bytes proof, bytes32 root, bytes32 leaf, uint256 index) internal pure returns (bool) -``` - -_Returns the rebuilt hash obtained by traversing a Merkle tree up -from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt -hash matches the root of the tree. The tree is built assuming `leaf` is -the 0 indexed `index`'th leaf from the bottom left of the tree. - -Note this is for a Merkle tree using the keccak/sha3 hash function_ - -### processInclusionProofKeccak - -```solidity -function processInclusionProofKeccak(bytes proof, bytes32 leaf, uint256 index) internal pure returns (bytes32) -``` - -_Returns the rebuilt hash obtained by traversing a Merkle tree up -from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt -hash matches the root of the tree. The tree is built assuming `leaf` is -the 0 indexed `index`'th leaf from the bottom left of the tree. - -_Available since v4.4._ - -Note this is for a Merkle tree using the keccak/sha3 hash function_ - -### verifyInclusionSha256 - -```solidity -function verifyInclusionSha256(bytes proof, bytes32 root, bytes32 leaf, uint256 index) internal view returns (bool) -``` - -_Returns the rebuilt hash obtained by traversing a Merkle tree up -from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt -hash matches the root of the tree. The tree is built assuming `leaf` is -the 0 indexed `index`'th leaf from the bottom left of the tree. - -Note this is for a Merkle tree using the sha256 hash function_ - -### processInclusionProofSha256 - -```solidity -function processInclusionProofSha256(bytes proof, bytes32 leaf, uint256 index) internal view returns (bytes32) -``` - -_Returns the rebuilt hash obtained by traversing a Merkle tree up -from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt -hash matches the root of the tree. The tree is built assuming `leaf` is -the 0 indexed `index`'th leaf from the bottom left of the tree. - -_Available since v4.4._ - -Note this is for a Merkle tree using the sha256 hash function_ - -### merkleizeSha256 - -```solidity -function merkleizeSha256(bytes32[] leaves) internal pure returns (bytes32) -``` - -this function returns the merkle root of a tree created from a set of leaves using sha256 as its hash function - @param leaves the leaves of the merkle tree - - @notice requires the leaves.length is a power of 2 - @return The computed Merkle root of the tree. - diff --git a/docs/docgen/libraries/MiddlewareUtils.md b/docs/docgen/libraries/MiddlewareUtils.md deleted file mode 100644 index 5bc3e6d83..000000000 --- a/docs/docgen/libraries/MiddlewareUtils.md +++ /dev/null @@ -1,12 +0,0 @@ -# Solidity API - -## MiddlewareUtils - -### computeSignatoryRecordHash - -```solidity -function computeSignatoryRecordHash(uint32 globalDataStoreId, bytes32[] nonSignerPubkeyHashes, uint256 signedStakeFirstQuorum, uint256 signedStakeSecondQuorum) internal pure returns (bytes32) -``` - -Finds the `signatoryRecordHash`, used for fraudproofs. - diff --git a/docs/docgen/libraries/StructuredLinkedList.md b/docs/docgen/libraries/StructuredLinkedList.md deleted file mode 100644 index 8d034c870..000000000 --- a/docs/docgen/libraries/StructuredLinkedList.md +++ /dev/null @@ -1,442 +0,0 @@ -# Solidity API - -## StructuredLinkedList - -Adapted from https://github.com/vittominacori/solidity-linked-list/blob/master/contracts/StructuredLinkedList.sol - -_An utility library for using sorted linked list data structures in your Solidity project._ - -### _NULL - -```solidity -uint256 _NULL -``` - -### _HEAD - -```solidity -uint256 _HEAD -``` - -### _PREV - -```solidity -bool _PREV -``` - -### _NEXT - -```solidity -bool _NEXT -``` - -### List - -```solidity -struct List { - uint256 size; - mapping(uint256 => mapping(bool => uint256)) list; -} -``` - -### listExists - -```solidity -function listExists(struct StructuredLinkedList.List self) internal view returns (bool) -``` - -_Checks if the list exists_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if list exists, false otherwise | - -### nodeExists - -```solidity -function nodeExists(struct StructuredLinkedList.List self, uint256 _node) internal view returns (bool) -``` - -_Checks if the node exists_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | a node to search for | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if node exists, false otherwise | - -### sizeOf - -```solidity -function sizeOf(struct StructuredLinkedList.List self) internal view returns (uint256) -``` - -_Returns the number of elements in the list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | uint256 | - -### getHead - -```solidity -function getHead(struct StructuredLinkedList.List self) internal view returns (uint256) -``` - -_Gets the head of the list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | uint256 the head of the list | - -### getNode - -```solidity -function getNode(struct StructuredLinkedList.List self, uint256 _node) internal view returns (bool, uint256, uint256) -``` - -_Returns the links of a node as a tuple_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | id of the node to get | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool, uint256, uint256 true if node exists or false otherwise, previous node, next node | -| [1] | uint256 | | -| [2] | uint256 | | - -### getAdjacent - -```solidity -function getAdjacent(struct StructuredLinkedList.List self, uint256 _node, bool _direction) internal view returns (bool, uint256) -``` - -_Returns the link of a node `_node` in direction `_direction`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | id of the node to step from | -| _direction | bool | direction to step in | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool, uint256 true if node exists or false otherwise, node in _direction | -| [1] | uint256 | | - -### getNextNode - -```solidity -function getNextNode(struct StructuredLinkedList.List self, uint256 _node) internal view returns (bool, uint256) -``` - -_Returns the link of a node `_node` in direction `_NEXT`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | id of the node to step from | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool, uint256 true if node exists or false otherwise, next node | -| [1] | uint256 | | - -### getPreviousNode - -```solidity -function getPreviousNode(struct StructuredLinkedList.List self, uint256 _node) internal view returns (bool, uint256) -``` - -_Returns the link of a node `_node` in direction `_PREV`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | id of the node to step from | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool, uint256 true if node exists or false otherwise, previous node | -| [1] | uint256 | | - -### insertAfter - -```solidity -function insertAfter(struct StructuredLinkedList.List self, uint256 _node, uint256 _new) internal returns (bool) -``` - -_Insert node `_new` beside existing node `_node` in direction `_NEXT`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | existing node | -| _new | uint256 | new node to insert | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if success, false otherwise | - -### insertBefore - -```solidity -function insertBefore(struct StructuredLinkedList.List self, uint256 _node, uint256 _new) internal returns (bool) -``` - -_Insert node `_new` beside existing node `_node` in direction `_PREV`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | existing node | -| _new | uint256 | new node to insert | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if success, false otherwise | - -### remove - -```solidity -function remove(struct StructuredLinkedList.List self, uint256 _node) internal returns (uint256) -``` - -_Removes an entry from the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | node to remove from the list | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | uint256 the removed node | - -### pushFront - -```solidity -function pushFront(struct StructuredLinkedList.List self, uint256 _node) internal returns (bool) -``` - -_Pushes an entry to the head of the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | new entry to push to the head | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if success, false otherwise | - -### pushBack - -```solidity -function pushBack(struct StructuredLinkedList.List self, uint256 _node) internal returns (bool) -``` - -_Pushes an entry to the tail of the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | new entry to push to the tail | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if success, false otherwise | - -### popFront - -```solidity -function popFront(struct StructuredLinkedList.List self) internal returns (uint256) -``` - -_Pops the first entry from the head of the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | uint256 the removed node | - -### popBack - -```solidity -function popBack(struct StructuredLinkedList.List self) internal returns (uint256) -``` - -_Pops the first entry from the tail of the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | uint256 the removed node | - -### _push - -```solidity -function _push(struct StructuredLinkedList.List self, uint256 _node, bool _direction) private returns (bool) -``` - -_Pushes an entry to the head of the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | new entry to push to the head | -| _direction | bool | push to the head (_NEXT) or tail (_PREV) | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if success, false otherwise | - -### _pop - -```solidity -function _pop(struct StructuredLinkedList.List self, bool _direction) private returns (uint256) -``` - -_Pops the first entry from the linked list_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _direction | bool | pop from the head (_NEXT) or the tail (_PREV) | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | uint256 the removed node | - -### _insert - -```solidity -function _insert(struct StructuredLinkedList.List self, uint256 _node, uint256 _new, bool _direction) private returns (bool) -``` - -_Insert node `_new` beside existing node `_node` in direction `_direction`._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | existing node | -| _new | uint256 | new node to insert | -| _direction | bool | direction to insert node in | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | bool true if success, false otherwise | - -### _createLink - -```solidity -function _createLink(struct StructuredLinkedList.List self, uint256 _node, uint256 _link, bool _direction) private -``` - -_Creates a bidirectional link between two nodes on direction `_direction`_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct StructuredLinkedList.List | stored linked list from contract | -| _node | uint256 | existing node | -| _link | uint256 | node to link to in the _direction | -| _direction | bool | direction to insert node in | - diff --git a/docs/docgen/middleware/BLSPublicKeyCompendium.md b/docs/docgen/middleware/BLSPublicKeyCompendium.md deleted file mode 100644 index 3d26ecbb5..000000000 --- a/docs/docgen/middleware/BLSPublicKeyCompendium.md +++ /dev/null @@ -1,51 +0,0 @@ -# Solidity API - -## BLSPublicKeyCompendium - -### ZERO_PK_HASH - -```solidity -bytes32 ZERO_PK_HASH -``` - -### operatorToPubkeyHash - -```solidity -mapping(address => bytes32) operatorToPubkeyHash -``` - -mapping from operator address to pubkey hash - -### pubkeyHashToOperator - -```solidity -mapping(bytes32 => address) pubkeyHashToOperator -``` - -mapping from pubkey hash to operator address - -### NewPubkeyRegistration - -```solidity -event NewPubkeyRegistration(address operator, struct BN254.G1Point pubkeyG1, struct BN254.G2Point pubkeyG2) -``` - -Emitted when `operator` registers with the public key `pk`. - -### registerBLSPublicKey - -```solidity -function registerBLSPublicKey(uint256 s, struct BN254.G1Point rPoint, struct BN254.G1Point pubkeyG1, struct BN254.G2Point pubkeyG2) external -``` - -Called by an operator to register themselves as the owner of a BLS public key and reveal their G1 and G2 public key. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| s | uint256 | is the field element of the operator's Schnorr signature | -| rPoint | struct BN254.G1Point | is the group element of the operator's Schnorr signature | -| pubkeyG1 | struct BN254.G1Point | is the the G1 pubkey of the operator | -| pubkeyG2 | struct BN254.G2Point | is the G2 with the same private key as the pubkeyG1 | - diff --git a/docs/docgen/middleware/BLSRegistry.md b/docs/docgen/middleware/BLSRegistry.md deleted file mode 100644 index 977e8030b..000000000 --- a/docs/docgen/middleware/BLSRegistry.md +++ /dev/null @@ -1,303 +0,0 @@ -# Solidity API - -## BLSRegistry - -This contract is used for -- registering new operators -- committing to and finalizing de-registration as an operator -- updating the stakes of the operator - -### ZERO_PK_HASH - -```solidity -bytes32 ZERO_PK_HASH -``` - -### pubkeyCompendium - -```solidity -contract IBLSPublicKeyCompendium pubkeyCompendium -``` - -contract used for looking up operators' BLS public keys - -### _apkUpdates - -```solidity -struct IBLSRegistry.ApkUpdate[] _apkUpdates -``` - -list of keccak256(apk_x, apk_y) of operators, and the block numbers at which the aggregate -pubkeys were updated. This occurs whenever a new operator registers or deregisters. - -### apk - -```solidity -struct BN254.G1Point apk -``` - -used for storing current aggregate public key - -_Initialized value of APK is the point at infinity: (0, 0)_ - -### operatorWhitelister - -```solidity -address operatorWhitelister -``` - -the address that can whitelist people - -### operatorWhitelistEnabled - -```solidity -bool operatorWhitelistEnabled -``` - -toggle of whether the operator whitelist is on or off - -### whitelisted - -```solidity -mapping(address => bool) whitelisted -``` - -operator => are they whitelisted (can they register with the middleware) - -### Registration - -```solidity -event Registration(address operator, bytes32 pkHash, struct BN254.G1Point pk, uint32 apkHashIndex, bytes32 apkHash, string socket) -``` - -Emitted upon the registration of a new operator for the middleware - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | Address of the new operator | -| pkHash | bytes32 | The keccak256 hash of the operator's public key | -| pk | struct BN254.G1Point | The operator's public key itself | -| apkHashIndex | uint32 | The index of the latest (i.e. the new) APK update | -| apkHash | bytes32 | The keccak256 hash of the new Aggregate Public Key | -| socket | string | | - -### OperatorWhitelisterTransferred - -```solidity -event OperatorWhitelisterTransferred(address previousAddress, address newAddress) -``` - -Emitted when the `operatorWhitelister` role is transferred. - -### onlyOperatorWhitelister - -```solidity -modifier onlyOperatorWhitelister() -``` - -Modifier that restricts a function to only be callable by the `whitelister` role. - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IServiceManager _serviceManager, uint8 _NUMBER_OF_QUORUMS, contract IBLSPublicKeyCompendium _pubkeyCompendium) public -``` - -### initialize - -```solidity -function initialize(address _operatorWhitelister, bool _operatorWhitelistEnabled, uint256[] _quorumBips, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _firstQuorumStrategiesConsideredAndMultipliers, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _secondQuorumStrategiesConsideredAndMultipliers) public virtual -``` - -Initialize the APK, the payment split between quorums, and the quorum strategies + multipliers. - -### setOperatorWhitelister - -```solidity -function setOperatorWhitelister(address _operatorWhitelister) external -``` - -Called by the service manager owner to transfer the whitelister role to another address - -### setOperatorWhitelistStatus - -```solidity -function setOperatorWhitelistStatus(bool _operatorWhitelistEnabled) external -``` - -Callable only by the service manager owner, this function toggles the whitelist on or off - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _operatorWhitelistEnabled | bool | true if turning whitelist on, false otherwise | - -### addToOperatorWhitelist - -```solidity -function addToOperatorWhitelist(address[] operators) external -``` - -Called by the whitelister, adds a list of operators to the whitelist - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operators | address[] | the operators to add to the whitelist | - -### removeFromWhitelist - -```solidity -function removeFromWhitelist(address[] operators) external -``` - -Called by the whitelister, removes a list of operators to the whitelist - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operators | address[] | the operators to remove from the whitelist | - -### registerOperator - -```solidity -function registerOperator(uint8 operatorType, struct BN254.G1Point pk, string socket) external virtual -``` - -called for registering as an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorType | uint8 | specifies whether the operator want to register as staker for one or both quorums | -| pk | struct BN254.G1Point | is the operator's G1 public key | -| socket | string | is the socket address of the operator | - -### _registerOperator - -```solidity -function _registerOperator(address operator, uint8 operatorType, struct BN254.G1Point pk, string socket) internal -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the node who is registering to be a operator | -| operatorType | uint8 | specifies whether the operator want to register as staker for one or both quorums | -| pk | struct BN254.G1Point | is the operator's G1 public key | -| socket | string | is the socket address of the operator | - -### deregisterOperator - -```solidity -function deregisterOperator(struct BN254.G1Point pkToRemove, uint32 index) external virtual returns (bool) -``` - -Used by an operator to de-register itself from providing service to the middleware. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pkToRemove | struct BN254.G1Point | is the sender's pubkey in affine coordinates | -| index | uint32 | is the sender's location in the dynamic array `operatorList` | - -### _deregisterOperator - -```solidity -function _deregisterOperator(address operator, struct BN254.G1Point pkToRemove, uint32 index) internal -``` - -Used to process de-registering an operator from providing service to the middleware. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | The operator to be deregistered | -| pkToRemove | struct BN254.G1Point | is the sender's pubkey | -| index | uint32 | is the sender's location in the dynamic array `operatorList` | - -### updateStakes - -```solidity -function updateStakes(address[] operators, uint256[] prevElements) external -``` - -Used for updating information on deposits of nodes. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operators | address[] | are the nodes whose deposit information is getting updated | -| prevElements | uint256[] | are the elements before this middleware in the operator's linked list within the slasher | - -### _processApkUpdate - -```solidity -function _processApkUpdate(struct BN254.G1Point newApk) internal returns (bytes32) -``` - -Updates the stored APK to `newApk`, calculates its hash, and pushes new entries to the `_apkUpdates` array - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newApk | struct BN254.G1Point | The updated APK. This will be the `apk` after this function runs! | - -### _setOperatorWhitelister - -```solidity -function _setOperatorWhitelister(address _operatorWhitelister) internal -``` - -### getCorrectApkHash - -```solidity -function getCorrectApkHash(uint256 index, uint32 blockNumber) external view returns (bytes32) -``` - -get hash of a historical aggregated public key corresponding to a given index; -called by checkSignatures in BLSSignatureChecker.sol. - -### getApkUpdatesLength - -```solidity -function getApkUpdatesLength() external view returns (uint256) -``` - -returns the total number of APK updates that have ever occurred (including one for initializing the pubkey as the generator) - -### apkUpdates - -```solidity -function apkUpdates(uint256 index) external view returns (struct IBLSRegistry.ApkUpdate) -``` - -returns the `ApkUpdate` struct at `index` in the list of APK updates - -### apkHashes - -```solidity -function apkHashes(uint256 index) external view returns (bytes32) -``` - -returns the APK hash that resulted from the `index`th APK update - -### apkUpdateBlockNumbers - -```solidity -function apkUpdateBlockNumbers(uint256 index) external view returns (uint32) -``` - -returns the block number at which the `index`th APK update occurred - diff --git a/docs/docgen/middleware/BLSSignatureChecker.md b/docs/docgen/middleware/BLSSignatureChecker.md deleted file mode 100644 index 79c818bc0..000000000 --- a/docs/docgen/middleware/BLSSignatureChecker.md +++ /dev/null @@ -1,193 +0,0 @@ -# Solidity API - -## BLSSignatureChecker - -This is the contract for checking the validity of aggregate operator signatures. - -### SignatoryTotals - -```solidity -struct SignatoryTotals { - uint256 signedStakeFirstQuorum; - uint256 signedStakeSecondQuorum; - uint256 totalStakeFirstQuorum; - uint256 totalStakeSecondQuorum; -} -``` - -### SignatoryRecord - -```solidity -event SignatoryRecord(bytes32 msgHash, uint32 taskNumber, uint256 signedStakeFirstQuorum, uint256 signedStakeSecondQuorum, bytes32[] pubkeyHashes) -``` - -used for recording the event that signature has been checked in checkSignatures function. - -### registry - -```solidity -contract IQuorumRegistry registry -``` - -### constructor - -```solidity -constructor(contract IQuorumRegistry _registry) internal -``` - -### BYTE_LENGTH_totalStakeIndex - -```solidity -uint256 BYTE_LENGTH_totalStakeIndex -``` - -### BYTE_LENGTH_referenceBlockNumber - -```solidity -uint256 BYTE_LENGTH_referenceBlockNumber -``` - -### BYTE_LENGTH_taskNumberToConfirm - -```solidity -uint256 BYTE_LENGTH_taskNumberToConfirm -``` - -### BYTE_LENGTH_numberNonSigners - -```solidity -uint256 BYTE_LENGTH_numberNonSigners -``` - -### BYTE_LENGTH_G1_POINT - -```solidity -uint256 BYTE_LENGTH_G1_POINT -``` - -### BYTE_LENGTH_G2_POINT - -```solidity -uint256 BYTE_LENGTH_G2_POINT -``` - -### BYTE_LENGTH_stakeIndex - -```solidity -uint256 BYTE_LENGTH_stakeIndex -``` - -### BYTE_LENGTH_NON_SIGNER_INFO - -```solidity -uint256 BYTE_LENGTH_NON_SIGNER_INFO -``` - -### BYTE_LENGTH_apkIndex - -```solidity -uint256 BYTE_LENGTH_apkIndex -``` - -### BIT_SHIFT_totalStakeIndex - -```solidity -uint256 BIT_SHIFT_totalStakeIndex -``` - -### BIT_SHIFT_referenceBlockNumber - -```solidity -uint256 BIT_SHIFT_referenceBlockNumber -``` - -### BIT_SHIFT_taskNumberToConfirm - -```solidity -uint256 BIT_SHIFT_taskNumberToConfirm -``` - -### BIT_SHIFT_numberNonSigners - -```solidity -uint256 BIT_SHIFT_numberNonSigners -``` - -### BIT_SHIFT_stakeIndex - -```solidity -uint256 BIT_SHIFT_stakeIndex -``` - -### BIT_SHIFT_apkIndex - -```solidity -uint256 BIT_SHIFT_apkIndex -``` - -### CALLDATA_OFFSET_totalStakeIndex - -```solidity -uint256 CALLDATA_OFFSET_totalStakeIndex -``` - -### CALLDATA_OFFSET_referenceBlockNumber - -```solidity -uint256 CALLDATA_OFFSET_referenceBlockNumber -``` - -### CALLDATA_OFFSET_taskNumberToConfirm - -```solidity -uint256 CALLDATA_OFFSET_taskNumberToConfirm -``` - -### CALLDATA_OFFSET_numberNonSigners - -```solidity -uint256 CALLDATA_OFFSET_numberNonSigners -``` - -### CALLDATA_OFFSET_NonsignerPubkeys - -```solidity -uint256 CALLDATA_OFFSET_NonsignerPubkeys -``` - -### checkSignatures - -```solidity -function checkSignatures(bytes data) public returns (uint32 taskNumberToConfirm, uint32 referenceBlockNumber, bytes32 msgHash, struct BLSSignatureChecker.SignatoryTotals signedTotals, bytes32 compressedSignatoryRecord) -``` - -_This calldata is of the format: -< -bytes32 msgHash, the taskHash for which disperser is calling checkSignatures -uint48 index of the totalStake corresponding to the dataStoreId in the 'totalStakeHistory' array of the BLSRegistry -uint32 blockNumber, the blockNumber at which the task was initated -uint32 taskNumberToConfirm -uint32 numberOfNonSigners, -{uint256[2] pubkeyG1, uint32 stakeIndex}[numberOfNonSigners] the G1 public key and the index to query of `pubkeyHashToStakeHistory` for each nonsigner, -uint32 apkIndex, the index in the `apkUpdates` array at which we want to load the aggregate public key -uint256[2] apkG1 (G1 aggregate public key, including nonSigners), -uint256[4] apkG2 (G2 aggregate public key, not including nonSigners), -uint256[2] sigma, the aggregate signature itself -> - -Before signature verification, the function verifies operator stake information. This includes ensuring that the provided `referenceBlockNumber` -is correct, i.e., ensure that the stake returned from the specified block number is recent enough and that the stake is either the most recent update -for the total stake (or the operator) or latest before the referenceBlockNumber. -The next step involves computing the aggregated pub key of all the operators that are not part of the quorum for this specific taskNumber. -We use a loop to iterate through the `nonSignerPK` array, loading each individual public key from calldata. Before the loop, we isolate the first public key -calldataload - this implementation saves us one ecAdd operation, which would be performed in the i=0 iteration otherwise. -Within the loop, each non-signer public key is loaded from the calldata into memory. The most recent staking-related information is retrieved and is subtracted -from the total stake of validators in the quorum. Then the aggregate public key and the aggregate non-signer public key is subtracted from it. -Finally the siganture is verified by computing the elliptic curve pairing._ - -### _validateOperatorStake - -```solidity -function _validateOperatorStake(struct IQuorumRegistry.OperatorStake opStake, uint32 referenceBlockNumber) internal pure -``` - diff --git a/docs/docgen/middleware/PaymentManager.md b/docs/docgen/middleware/PaymentManager.md deleted file mode 100644 index b61ce3c51..000000000 --- a/docs/docgen/middleware/PaymentManager.md +++ /dev/null @@ -1,456 +0,0 @@ -# Solidity API - -## PaymentManager - -This contract is used for doing interactive payment challenges. -The contract is marked as abstract since it does not implement the `respondToPaymentChallengeFinal` -function -- see DataLayerPaymentManager for an example - -### PAUSED_NEW_PAYMENT_COMMIT - -```solidity -uint8 PAUSED_NEW_PAYMENT_COMMIT -``` - -### PAUSED_REDEEM_PAYMENT - -```solidity -uint8 PAUSED_REDEEM_PAYMENT -``` - -### paymentFraudproofInterval - -```solidity -uint256 paymentFraudproofInterval -``` - -Challenge window for submitting fraudproof in the case of an incorrect payment claim by a registered operator. - -### MAX_BIPS - -```solidity -uint256 MAX_BIPS -``` - -Constant used as a divisor in dealing with BIPS amounts - -### LOW_LEVEL_GAS_BUDGET - -```solidity -uint256 LOW_LEVEL_GAS_BUDGET -``` - -Gas budget provided in calls to DelegationTerms contracts - -### delegationManager - -```solidity -contract IDelegationManager delegationManager -``` - -The global EigenLayer Delegation contract, which is primarily used by -stakers to delegate their stake to operators who serve as middleware nodes. - -_For more details, see DelegationManager.sol._ - -### serviceManager - -```solidity -contract IServiceManager serviceManager -``` - -The ServiceManager contract for this middleware, where tasks are created / initiated. - -### registry - -```solidity -contract IQuorumRegistry registry -``` - -The Registry contract for this middleware, where operators register and deregister. - -### paymentToken - -```solidity -contract IERC20 paymentToken -``` - -the ERC20 token that will be used by the disperser to pay the service fees to middleware nodes. - -### paymentChallengeToken - -```solidity -contract IERC20 paymentChallengeToken -``` - -Token used for placing a guarantee on challenges & payment commits - -### paymentChallengeAmount - -```solidity -uint256 paymentChallengeAmount -``` - -Specifies the payment that has to be made as a guarantee for fraudproof during payment challenges. - -### operatorToPayment - -```solidity -mapping(address => struct IPaymentManager.Payment) operatorToPayment -``` - -mapping between the operator and its current committed payment or last redeemed payment - -### operatorToPaymentChallenge - -```solidity -mapping(address => struct IPaymentManager.PaymentChallenge) operatorToPaymentChallenge -``` - -mapping from operator => PaymentChallenge - -### depositsOf - -```solidity -mapping(address => uint256) depositsOf -``` - -Deposits of future fees to be drawn against when paying for service from the middleware - -### allowances - -```solidity -mapping(address => mapping(address => uint256)) allowances -``` - -depositors => addresses approved to spend deposits => allowance - -### PaymentChallengeAmountSet - -```solidity -event PaymentChallengeAmountSet(uint256 previousValue, uint256 newValue) -``` - -Emitted when the `paymentChallengeAmount` variable is modified - -### PaymentCommit - -```solidity -event PaymentCommit(address operator, uint32 fromTaskNumber, uint32 toTaskNumber, uint256 fee) -``` - -Emitted when an operator commits to a payment by calling the `commitPayment` function - -### PaymentChallengeInit - -```solidity -event PaymentChallengeInit(address operator, address challenger) -``` - -Emitted when a new challenge is created through a call to the `initPaymentChallenge` function - -### PaymentRedemption - -```solidity -event PaymentRedemption(address operator, uint256 fee) -``` - -Emitted when an operator redeems a payment by calling the `redeemPayment` function - -### PaymentBreakdown - -```solidity -event PaymentBreakdown(address operator, uint32 fromTaskNumber, uint32 toTaskNumber, uint96 amount1, uint96 amount2) -``` - -Emitted when a bisection step is performed in a challenge, through a call to the `performChallengeBisectionStep` function - -### PaymentChallengeResolution - -```solidity -event PaymentChallengeResolution(address operator, bool operatorWon) -``` - -Emitted upon successful resolution of a payment challenge, within a call to `resolveChallenge` - -### OnPayForServiceCallFailure - -```solidity -event OnPayForServiceCallFailure(contract IDelegationTerms delegationTerms, bytes32 returnData) -``` - -_Emitted when a low-level call to `delegationTerms.payForService` fails, returning `returnData`_ - -### onlyServiceManager - -```solidity -modifier onlyServiceManager() -``` - -when applied to a function, ensures that the function is only callable by the `serviceManager` - -### onlyRegistry - -```solidity -modifier onlyRegistry() -``` - -when applied to a function, ensures that the function is only callable by the `registry` - -### onlyServiceManagerOwner - -```solidity -modifier onlyServiceManagerOwner() -``` - -when applied to a function, ensures that the function is only callable by the owner of the `serviceManager` - -### constructor - -```solidity -constructor(contract IDelegationManager _delegationManager, contract IServiceManager _serviceManager, contract IQuorumRegistry _registry, contract IERC20 _paymentToken, contract IERC20 _paymentChallengeToken) internal -``` - -### initialize - -```solidity -function initialize(contract IPauserRegistry _pauserReg, uint256 _paymentChallengeAmount) public -``` - -### depositFutureFees - -```solidity -function depositFutureFees(address depositFor, uint256 amount) external -``` - -deposit one-time fees by the `msg.sender` with this contract to pay for future tasks of this middleware - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositFor | address | could be the `msg.sender` themselves, or a different address for whom `msg.sender` is depositing these future fees | -| amount | uint256 | is amount of futures fees being deposited | - -### setAllowance - -```solidity -function setAllowance(address allowed, uint256 amount) external -``` - -Allows the `allowed` address to spend up to `amount` of the `msg.sender`'s funds that have been deposited in this contract - -### setPaymentChallengeAmount - -```solidity -function setPaymentChallengeAmount(uint256 _paymentChallengeAmount) external virtual -``` - -Modifies the `paymentChallengeAmount` amount. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _paymentChallengeAmount | uint256 | The new value for `paymentChallengeAmount` to take. | - -### takeFee - -```solidity -function takeFee(address initiator, address payer, uint256 feeAmount) external virtual -``` - -Used for deducting the fees from the payer to the middleware - -### commitPayment - -```solidity -function commitPayment(uint32 toTaskNumber, uint96 amount) external -``` - -This is used by an operator to make a claim on the amount that they deserve for their service from their last payment until `toTaskNumber` - -_Once this payment is recorded, a fraud proof period commences during which a challenger can dispute the proposed payment._ - -### redeemPayment - -```solidity -function redeemPayment() external -``` - -Called by an operator to redeem a payment that they previously 'committed' to by calling `commitPayment`. - -_This function can only be called after the challenge window for the payment claim has completed._ - -### _payForServiceHook - -```solidity -function _payForServiceHook(contract IDelegationTerms dt, uint256 amount) internal -``` - -### initPaymentChallenge - -```solidity -function initPaymentChallenge(address operator, uint96 amount1, uint96 amount2) external -``` - -This function is called by a fraud prover to challenge a payment, initiating an interactive-type fraudproof. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator against whose payment claim the fraudproof is being made | -| amount1 | uint96 | is the reward amount the challenger in that round claims is for the first half of tasks | -| amount2 | uint96 | is the reward amount the challenger in that round claims is for the second half of tasks | - -### performChallengeBisectionStep - -```solidity -function performChallengeBisectionStep(address operator, bool secondHalf, uint96 amount1, uint96 amount2) external -``` - -Perform a single bisection step in an existing interactive payment challenge. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | The middleware operator who was challenged (used to look up challenge details) | -| secondHalf | bool | If true, then the caller wishes to challenge the amount claimed as payment in the *second half* of the previous bisection step. If false then the *first half* is indicated instead. | -| amount1 | uint96 | The amount that the caller asserts the operator is entitled to, for the first half *of the challenged half* of the previous bisection. | -| amount2 | uint96 | The amount that the caller asserts the operator is entitled to, for the second half *of the challenged half* of the previous bisection. | - -### _updateStatus - -```solidity -function _updateStatus(address operator, uint32 diff) internal returns (bool) -``` - -This function is used for updating the status of the challenge in terms of who has to respon -to the interactive challenge mechanism next - is it going to be challenger or the operator. - -_If the challenge is over only one task, then the challenge is marked specially as a one step challenge – -the smallest unit over which a challenge can be proposed – and 'true' is returned. -Otherwise status is updated normally and 'false' is returned._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator whose payment claim is being challenged | -| diff | uint32 | is the number of tasks across which payment is being challenged in this iteration | - -### _updateChallengeAmounts - -```solidity -function _updateChallengeAmounts(address operator, enum IPaymentManager.DissectionType dissectionType, uint96 amount1, uint96 amount2) internal -``` - -Used to update challenge amounts when the operator (or challenger) breaks down the challenged amount (single bisection step) - -### resolveChallenge - -```solidity -function resolveChallenge(address operator) external -``` - -resolve an existing PaymentChallenge for an operator - -### _resolve - -```solidity -function _resolve(struct IPaymentManager.PaymentChallenge challenge, address winner) internal -``` - -Resolves a single payment challenge, paying the winner. - -_If challenger is proven correct, then they are refunded their own challengeAmount plus the challengeAmount put up by the operator. -If operator is proven correct, then the challenger's challengeAmount is transferred to them, since the operator still hasn't been -proven right, and thus their challengeAmount is still required in case they are challenged again._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| challenge | struct IPaymentManager.PaymentChallenge | The challenge that is being resolved. | -| winner | address | Address of the winner of the challenge. | - -### getChallengeStatus - -```solidity -function getChallengeStatus(address operator) external view returns (enum IPaymentManager.ChallengeStatus) -``` - -Returns the ChallengeStatus for the `operator`'s payment claim. - -### getAmount1 - -```solidity -function getAmount1(address operator) external view returns (uint96) -``` - -Returns the 'amount1' for the `operator`'s payment claim. - -### getAmount2 - -```solidity -function getAmount2(address operator) external view returns (uint96) -``` - -Returns the 'amount2' for the `operator`'s payment claim. - -### getToTaskNumber - -```solidity -function getToTaskNumber(address operator) external view returns (uint48) -``` - -Returns the 'toTaskNumber' for the `operator`'s payment claim. - -### getFromTaskNumber - -```solidity -function getFromTaskNumber(address operator) external view returns (uint48) -``` - -Returns the 'fromTaskNumber' for the `operator`'s payment claim. - -### getDiff - -```solidity -function getDiff(address operator) external view returns (uint48) -``` - -Returns the task number difference for the `operator`'s payment claim. - -### getPaymentChallengeAmount - -```solidity -function getPaymentChallengeAmount(address operator) external view returns (uint256) -``` - -Returns the active challengeAmount of the `operator` placed on their payment claim. - -### _taskNumber - -```solidity -function _taskNumber() internal view returns (uint32) -``` - -Convenience function for fetching the current taskNumber from the `serviceManager` - -### _setPaymentChallengeAmount - -```solidity -function _setPaymentChallengeAmount(uint256 _paymentChallengeAmount) internal -``` - -Modifies the `paymentChallengeAmount` amount. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _paymentChallengeAmount | uint256 | The new value for `paymentChallengeAmount` to take. | - diff --git a/docs/docgen/middleware/RegistryBase.md b/docs/docgen/middleware/RegistryBase.md deleted file mode 100644 index bb7241808..000000000 --- a/docs/docgen/middleware/RegistryBase.md +++ /dev/null @@ -1,461 +0,0 @@ -# Solidity API - -## RegistryBase - -This contract is used for -- registering new operators -- committing to and finalizing de-registration as an operator -- updating the stakes of the operator - -_This contract is missing key functions. See `BLSRegistry` or `ECDSARegistry` for examples that inherit from this contract._ - -### minimumStakeFirstQuorum - -```solidity -uint128 minimumStakeFirstQuorum -``` - -In order to register, an operator must have at least `minimumStakeFirstQuorum` or `minimumStakeSecondQuorum`, as -evaluated by this contract's 'VoteWeigher' logic. - -### minimumStakeSecondQuorum - -```solidity -uint128 minimumStakeSecondQuorum -``` - -### registry - -```solidity -mapping(address => struct IQuorumRegistry.Operator) registry -``` - -used for storing Operator info on each operator while registration - -### operatorList - -```solidity -address[] operatorList -``` - -used for storing the list of current and past registered operators - -### totalStakeHistory - -```solidity -struct IQuorumRegistry.OperatorStake[] totalStakeHistory -``` - -array of the history of the total stakes -- marked as internal since getTotalStakeFromIndex is a getter for this - -### totalOperatorsHistory - -```solidity -struct IQuorumRegistry.OperatorIndex[] totalOperatorsHistory -``` - -array of the history of the number of operators, and the taskNumbers at which the number of operators changed - -### pubkeyHashToStakeHistory - -```solidity -mapping(bytes32 => struct IQuorumRegistry.OperatorStake[]) pubkeyHashToStakeHistory -``` - -mapping from operator's pubkeyhash to the history of their stake updates - -### pubkeyHashToIndexHistory - -```solidity -mapping(bytes32 => struct IQuorumRegistry.OperatorIndex[]) pubkeyHashToIndexHistory -``` - -mapping from operator's pubkeyhash to the history of their index in the array of all operators - -### SocketUpdate - -```solidity -event SocketUpdate(address operator, string socket) -``` - -emitted when `operator` updates their socket address to `socket` - -### StakeUpdate - -```solidity -event StakeUpdate(address operator, uint96 firstQuorumStake, uint96 secondQuorumStake, uint32 updateBlockNumber, uint32 prevUpdateBlockNumber) -``` - -emitted whenever the stake of `operator` is updated - -### Deregistration - -```solidity -event Deregistration(address operator, address swapped) -``` - -Emitted whenever an operator deregisters. -The `swapped` address is the address returned by an internal call to the `_popRegistrant` function. - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IServiceManager _serviceManager, uint8 _NUMBER_OF_QUORUMS) internal -``` - -Irrevocably sets the (immutable) `delegation` & `strategyManager` addresses, and `NUMBER_OF_QUORUMS` variable. - -### _initialize - -```solidity -function _initialize(uint256[] _quorumBips, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _firstQuorumStrategiesConsideredAndMultipliers, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _secondQuorumStrategiesConsideredAndMultipliers) internal virtual -``` - -Adds empty first entries to the dynamic arrays `totalStakeHistory` and `totalOperatorsHistory`, -to record an initial condition of zero operators with zero total stake. -Adds `_firstQuorumStrategiesConsideredAndMultipliers` and `_secondQuorumStrategiesConsideredAndMultipliers` to the dynamic arrays -`strategiesConsideredAndMultipliers[0]` and `strategiesConsideredAndMultipliers[1]` (i.e. to the weighing functions of the quorums) - -### getOperatorIndex - -```solidity -function getOperatorIndex(address operator, uint32 blockNumber, uint32 index) external view returns (uint32) -``` - -Looks up the `operator`'s index in the dynamic array `operatorList` at the specified `blockNumber`. - -_Function will revert in the event that the specified `index` input does not identify the appropriate entry in the -array `pubkeyHashToIndexHistory[pubkeyHash]` to pull the info from._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | | -| blockNumber | uint32 | Is the desired block number at which we wish to query the operator's position in the `operatorList` array | -| index | uint32 | Used to specify the entry within the dynamic array `pubkeyHashToIndexHistory[pubkeyHash]` to read data from, where `pubkeyHash` is looked up from `operator`'s registration info | - -### getTotalOperators - -```solidity -function getTotalOperators(uint32 blockNumber, uint32 index) external view returns (uint32) -``` - -Looks up the number of total operators at the specified `blockNumber`. - -_This function will revert if the provided `index` is out of bounds._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| blockNumber | uint32 | | -| index | uint32 | Input used to specify the entry within the dynamic array `totalOperatorsHistory` to read data from. | - -### isActiveOperator - -```solidity -function isActiveOperator(address operator) external view virtual returns (bool) -``` - -Returns whether or not the `operator` is currently an active operator, i.e. is "registered". - -### getOperatorPubkeyHash - -```solidity -function getOperatorPubkeyHash(address operator) public view returns (bytes32) -``` - -Returns the stored pubkeyHash for the specified `operator`. - -### getStakeFromPubkeyHashAndIndex - -```solidity -function getStakeFromPubkeyHashAndIndex(bytes32 pubkeyHash, uint256 index) external view returns (struct IQuorumRegistry.OperatorStake) -``` - -Returns the stake weight corresponding to `pubkeyHash`, at the -`index`-th entry in the `pubkeyHashToStakeHistory[pubkeyHash]` array. - -_Function will revert if `index` is out-of-bounds._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkeyHash | bytes32 | Hash of the public key of the operator of interest. | -| index | uint256 | Array index for lookup, within the dynamic array `pubkeyHashToStakeHistory[pubkeyHash]`. | - -### checkOperatorActiveAtBlockNumber - -```solidity -function checkOperatorActiveAtBlockNumber(address operator, uint256 blockNumber, uint256 stakeHistoryIndex) external view returns (bool) -``` - -Checks that the `operator` was active at the `blockNumber`, using the specified `stakeHistoryIndex` as proof. - -_In order for this function to return 'true', the inputs must satisfy all of the following list: -1) `pubkeyHashToStakeHistory[pubkeyHash][index].updateBlockNumber <= blockNumber` -2) `pubkeyHashToStakeHistory[pubkeyHash][index].nextUpdateBlockNumber` must be either `0` (signifying no next update) or -is must be strictly greater than `blockNumber` -3) `pubkeyHashToStakeHistory[pubkeyHash][index].firstQuorumStake > 0` -or `pubkeyHashToStakeHistory[pubkeyHash][index].secondQuorumStake > 0`, i.e. the operator had nonzero stake -Note that a return value of 'false' does not guarantee that the `operator` was inactive at `blockNumber`, since a -bad `stakeHistoryIndex` can be supplied in order to obtain a response of 'false'._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator of interest | -| blockNumber | uint256 | is the block number of interest | -| stakeHistoryIndex | uint256 | specifies an index in `pubkeyHashToStakeHistory[pubkeyHash]`, where `pubkeyHash` is looked up in `registry[operator].pubkeyHash` | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | 'true' if it is successfully proven that the `operator` was active at the `blockNumber`, and 'false' otherwise | - -### checkOperatorInactiveAtBlockNumber - -```solidity -function checkOperatorInactiveAtBlockNumber(address operator, uint256 blockNumber, uint256 stakeHistoryIndex) external view returns (bool) -``` - -Checks that the `operator` was inactive at the `blockNumber`, using the specified `stakeHistoryIndex` as proof. - -_In order for this function to return 'true', the inputs must satisfy all of the following list: -1) `pubkeyHashToStakeHistory[pubkeyHash][index].updateBlockNumber <= blockNumber` -2) `pubkeyHashToStakeHistory[pubkeyHash][index].nextUpdateBlockNumber` must be either `0` (signifying no next update) or -is must be strictly greater than `blockNumber` -3) `pubkeyHashToStakeHistory[pubkeyHash][index].firstQuorumStake > 0` -or `pubkeyHashToStakeHistory[pubkeyHash][index].secondQuorumStake > 0`, i.e. the operator had nonzero stake -Note that a return value of 'false' does not guarantee that the `operator` was active at `blockNumber`, since a -bad `stakeHistoryIndex` can be supplied in order to obtain a response of 'false'._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the operator of interest | -| blockNumber | uint256 | is the block number of interest | -| stakeHistoryIndex | uint256 | specifies an index in `pubkeyHashToStakeHistory[pubkeyHash]`, where `pubkeyHash` is looked up in `registry[operator].pubkeyHash` | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | 'true' if it is successfully proven that the `operator` was inactive at the `blockNumber`, and 'false' otherwise | - -### getMostRecentStakeByOperator - -```solidity -function getMostRecentStakeByOperator(address operator) public view returns (struct IQuorumRegistry.OperatorStake) -``` - -Returns the most recent stake weight for the `operator` - -_Function returns an OperatorStake struct with **every entry equal to 0** in the event that the operator has no stake history_ - -### getStakeHistoryLength - -```solidity -function getStakeHistoryLength(bytes32 pubkeyHash) external view returns (uint256) -``` - -### firstQuorumStakedByOperator - -```solidity -function firstQuorumStakedByOperator(address operator) external view returns (uint96) -``` - -### secondQuorumStakedByOperator - -```solidity -function secondQuorumStakedByOperator(address operator) external view returns (uint96) -``` - -### operatorStakes - -```solidity -function operatorStakes(address operator) public view returns (uint96, uint96) -``` - -Returns the most recent stake weights for the `operator` - -_Function returns weights of **0** in the event that the operator has no stake history_ - -### totalStake - -```solidity -function totalStake() external view returns (uint96, uint96) -``` - -Returns the stake amounts from the latest entry in `totalStakeHistory`. - -### getLengthOfPubkeyHashStakeHistory - -```solidity -function getLengthOfPubkeyHashStakeHistory(bytes32 pubkeyHash) external view returns (uint256) -``` - -### getLengthOfPubkeyHashIndexHistory - -```solidity -function getLengthOfPubkeyHashIndexHistory(bytes32 pubkeyHash) external view returns (uint256) -``` - -### getLengthOfTotalStakeHistory - -```solidity -function getLengthOfTotalStakeHistory() external view returns (uint256) -``` - -### getLengthOfTotalOperatorsHistory - -```solidity -function getLengthOfTotalOperatorsHistory() external view returns (uint256) -``` - -### getTotalStakeFromIndex - -```solidity -function getTotalStakeFromIndex(uint256 index) external view returns (struct IQuorumRegistry.OperatorStake) -``` - -Returns the `index`-th entry in the dynamic array of total stake, `totalStakeHistory`. - -_Function will revert in the event that `index` is out-of-bounds._ - -### getFromTaskNumberForOperator - -```solidity -function getFromTaskNumberForOperator(address operator) external view returns (uint32) -``` - -Returns task number from when `operator` has been registered. - -### numOperators - -```solidity -function numOperators() public view returns (uint32) -``` - -Returns the current number of operators of this service. - -### setMinimumStakeFirstQuorum - -```solidity -function setMinimumStakeFirstQuorum(uint128 _minimumStakeFirstQuorum) external -``` - -Adjusts the `minimumStakeFirstQuorum` -- i.e. the node stake (weight) requirement for inclusion in the 1st quorum. - -### setMinimumStakeSecondQuorum - -```solidity -function setMinimumStakeSecondQuorum(uint128 _minimumStakeSecondQuorum) external -``` - -Adjusts the `minimumStakeSecondQuorum` -- i.e. the node stake (weight) requirement for inclusion in the 2nd quorum. - -### updateSocket - -```solidity -function updateSocket(string newSocket) external -``` - -### _updateTotalOperatorsHistory - -```solidity -function _updateTotalOperatorsHistory() internal -``` - -Called when the total number of operators has changed. -Sets the `toBlockNumber` field on the last entry *so far* in thedynamic array `totalOperatorsHistory` to the current `block.number`, -recording that the previous entry is *no longer the latest* and the block number at which the next was added. -Pushes a new entry to `totalOperatorsHistory`, with `index` field set equal to the new amount of operators, recording the new number -of total operators (and leaving the `toBlockNumber` field at zero, signaling that this is the latest entry in the array) - -### _removeOperator - -```solidity -function _removeOperator(address operator, bytes32 pubkeyHash, uint32 index) internal virtual -``` - -Remove the operator from active status. Removes the operator with the given `pubkeyHash` from the `index` in `operatorList`, -updates operatorList and index histories, and performs other necessary updates for removing operator - -### _removeOperatorStake - -```solidity -function _removeOperatorStake(bytes32 pubkeyHash) internal returns (uint32) -``` - -Removes the stakes of the operator with pubkeyHash `pubkeyHash` - -### _popRegistrant - -```solidity -function _popRegistrant(uint32 index) internal returns (address swappedOperator) -``` - -Removes the registrant at the given `index` from the `operatorList` - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| swappedOperator | address | is the operator who was swapped with the removed operator in the operatorList, or the *zero address* in the case that the removed operator was already the list operator in the operatorList. | - -### _addRegistrant - -```solidity -function _addRegistrant(address operator, bytes32 pubkeyHash, struct IQuorumRegistry.OperatorStake _operatorStake) internal virtual -``` - -Adds the Operator `operator` with the given `pubkeyHash` to the `operatorList` and performs necessary related updates. - -### _registrationStakeEvaluation - -```solidity -function _registrationStakeEvaluation(address operator, uint8 operatorType) internal returns (struct IQuorumRegistry.OperatorStake) -``` - -Used inside of inheriting contracts to validate the registration of `operator` and find their `OperatorStake`. - -_This function does **not** update the stored state of the operator's stakes -- storage updates are performed elsewhere._ - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct IQuorumRegistry.OperatorStake | The newly calculated `OperatorStake` for `operator`, stored in memory but not yet committed to storage. | - -### _updateOperatorStake - -```solidity -function _updateOperatorStake(address operator, bytes32 pubkeyHash, struct IQuorumRegistry.OperatorStake currentOperatorStake, uint256 insertAfter) internal returns (struct IQuorumRegistry.OperatorStake updatedOperatorStake) -``` - -Finds the updated stake for `operator`, stores it and records the update. - -_**DOES NOT UPDATE `totalStake` IN ANY WAY** -- `totalStake` updates must be done elsewhere._ - -### _recordTotalStakeUpdate - -```solidity -function _recordTotalStakeUpdate(struct IQuorumRegistry.OperatorStake _totalStake) internal -``` - -Records that the `totalStake` is now equal to the input param @_totalStake - -### _deregistrationCheck - -```solidity -function _deregistrationCheck(address operator, uint32 index) internal view -``` - -Verify that the `operator` is an active operator and that they've provided the correct `index` - diff --git a/docs/docgen/middleware/VoteWeigherBase.md b/docs/docgen/middleware/VoteWeigherBase.md deleted file mode 100644 index 378e3ffbd..000000000 --- a/docs/docgen/middleware/VoteWeigherBase.md +++ /dev/null @@ -1,120 +0,0 @@ -# Solidity API - -## VoteWeigherBase - -This contract is used for -- computing the total weight of an operator for any of the quorums that are considered -by the middleware -- addition and removal of strategies and the associated weighting criteria that are assigned -by the middleware for each of the quorum(s) -@dev - -### StrategyAddedToQuorum - -```solidity -event StrategyAddedToQuorum(uint256 quorumNumber, contract IStrategy strategy) -``` - -emitted when `strategy` has been added to the array at `strategiesConsideredAndMultipliers[quorumNumber]` - -### StrategyRemovedFromQuorum - -```solidity -event StrategyRemovedFromQuorum(uint256 quorumNumber, contract IStrategy strategy) -``` - -emitted when `strategy` has removed from the array at `strategiesConsideredAndMultipliers[quorumNumber]` - -### onlyServiceManagerOwner - -```solidity -modifier onlyServiceManagerOwner() -``` - -when applied to a function, ensures that the function is only callable by the current `owner` of the `serviceManager` - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IServiceManager _serviceManager, uint8 _NUMBER_OF_QUORUMS) internal -``` - -Sets the (immutable) `strategyManager` and `serviceManager` addresses, as well as the (immutable) `NUMBER_OF_QUORUMS` variable - -### _initialize - -```solidity -function _initialize(uint256[] _quorumBips) internal virtual -``` - -Set the split in earnings between the different quorums. - -### weightOfOperator - -```solidity -function weightOfOperator(address operator, uint256 quorumNumber) public virtual returns (uint96) -``` - -This function computes the total weight of the @param operator in the quorum @param quorumNumber. - -_returns zero in the case that `quorumNumber` is greater than or equal to `NUMBER_OF_QUORUMS`_ - -### addStrategiesConsideredAndMultipliers - -```solidity -function addStrategiesConsideredAndMultipliers(uint256 quorumNumber, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _newStrategiesConsideredAndMultipliers) external virtual -``` - -Adds new strategies and the associated multipliers to the @param quorumNumber. - -### removeStrategiesConsideredAndMultipliers - -```solidity -function removeStrategiesConsideredAndMultipliers(uint256 quorumNumber, contract IStrategy[] _strategiesToRemove, uint256[] indicesToRemove) external virtual -``` - -This function is used for removing strategies and their associated weights from the -mapping strategiesConsideredAndMultipliers for a specific @param quorumNumber. - -_higher indices should be *first* in the list of @param indicesToRemove, since otherwise -the removal of lower index entries will cause a shift in the indices of the other strategiesToRemove_ - -### modifyStrategyWeights - -```solidity -function modifyStrategyWeights(uint256 quorumNumber, uint256[] strategyIndices, uint96[] newMultipliers) external virtual -``` - -This function is used for modifying the weights of strategies that are already in the -mapping strategiesConsideredAndMultipliers for a specific @param quorumNumber. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| quorumNumber | uint256 | | -| strategyIndices | uint256[] | is a correctness-check input -- the supplied values must match the indices of the strategiesToModifyWeightsOf in strategiesConsideredAndMultipliers[quorumNumber] | -| newMultipliers | uint96[] | | - -### strategiesConsideredAndMultipliersLength - -```solidity -function strategiesConsideredAndMultipliersLength(uint256 quorumNumber) public view returns (uint256) -``` - -Returns the length of the dynamic array stored in `strategiesConsideredAndMultipliers[quorumNumber]`. - -_Reverts if `quorumNumber` < `NUMBER_OF_QUORUMS`, i.e. the input is out of bounds._ - -### _addStrategiesConsideredAndMultipliers - -```solidity -function _addStrategiesConsideredAndMultipliers(uint256 quorumNumber, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _newStrategiesConsideredAndMultipliers) internal -``` - -Adds `_newStrategiesConsideredAndMultipliers` to the `quorumNumber`-th quorum. - -_Checks to make sure that the *same* strategy cannot be added multiple times (checks against both against existing and new strategies). -This function has no check to make sure that the strategies for a single quorum have the same underlying asset. This is a concious choice, -since a middleware may want, e.g., a stablecoin quorum that accepts USDC, USDT, DAI, etc. as underlying assets and trades them as "equivalent"._ - diff --git a/docs/docgen/middleware/VoteWeigherBaseStorage.md b/docs/docgen/middleware/VoteWeigherBaseStorage.md deleted file mode 100644 index cca96e8ef..000000000 --- a/docs/docgen/middleware/VoteWeigherBaseStorage.md +++ /dev/null @@ -1,104 +0,0 @@ -# Solidity API - -## VoteWeigherBaseStorage - -This storage contract is separate from the logic to simplify the upgrade process. - -### StrategyAndWeightingMultiplier - -```solidity -struct StrategyAndWeightingMultiplier { - contract IStrategy strategy; - uint96 multiplier; -} -``` - -### WEIGHTING_DIVISOR - -```solidity -uint256 WEIGHTING_DIVISOR -``` - -Constant used as a divisor in calculating weights. - -### MAX_WEIGHING_FUNCTION_LENGTH - -```solidity -uint8 MAX_WEIGHING_FUNCTION_LENGTH -``` - -Maximum length of dynamic arrays in the `strategiesConsideredAndMultipliers` mapping. - -### MAX_BIPS - -```solidity -uint256 MAX_BIPS -``` - -Constant used as a divisor in dealing with BIPS amounts. - -### delegation - -```solidity -contract IDelegationManager delegation -``` - -The address of the Delegation contract for EigenLayer. - -### strategyManager - -```solidity -contract IStrategyManager strategyManager -``` - -The address of the StrategyManager contract for EigenLayer. - -### slasher - -```solidity -contract ISlasher slasher -``` - -The address of the Slasher contract for EigenLayer. - -### serviceManager - -```solidity -contract IServiceManager serviceManager -``` - -The ServiceManager contract for this middleware, where tasks are created / initiated. - -### NUMBER_OF_QUORUMS - -```solidity -uint256 NUMBER_OF_QUORUMS -``` - -Number of quorums that are being used by the middleware. - -### strategiesConsideredAndMultipliers - -```solidity -mapping(uint256 => struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[]) strategiesConsideredAndMultipliers -``` - -mapping from quorum number to the list of strategies considered and their -corresponding multipliers for that specific quorum - -### quorumBips - -```solidity -mapping(uint256 => uint256) quorumBips -``` - -This defines the earnings split between different quorums. Mapping is quorumNumber => BIPS which the quorum earns, out of the total earnings. - -_The sum of all entries, i.e. sum(quorumBips[0] through quorumBips[NUMBER_OF_QUORUMS - 1]) should *always* be 10,000!_ - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IServiceManager _serviceManager, uint8 _NUMBER_OF_QUORUMS) internal -``` - diff --git a/docs/docgen/middleware/example/ECDSARegistry.md b/docs/docgen/middleware/example/ECDSARegistry.md deleted file mode 100644 index 15486642f..000000000 --- a/docs/docgen/middleware/example/ECDSARegistry.md +++ /dev/null @@ -1,205 +0,0 @@ -# Solidity API - -## ECDSARegistry - -This contract is used for -- registering new operators -- committing to and finalizing de-registration as an operator -- updating the stakes of the operator - -### operatorWhitelister - -```solidity -address operatorWhitelister -``` - -the address that can whitelist people - -### operatorWhitelistEnabled - -```solidity -bool operatorWhitelistEnabled -``` - -toggle of whether the operator whitelist is on or off - -### whitelisted - -```solidity -mapping(address => bool) whitelisted -``` - -operator => are they whitelisted (can they register with the middleware) - -### Registration - -```solidity -event Registration(address operator, string socket) -``` - -Emitted upon the registration of a new operator for the middleware - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | Address of the new operator | -| socket | string | The ip:port of the operator | - -### OperatorWhitelisterTransferred - -```solidity -event OperatorWhitelisterTransferred(address previousAddress, address newAddress) -``` - -Emitted when the `operatorWhitelister` role is transferred. - -### onlyOperatorWhitelister - -```solidity -modifier onlyOperatorWhitelister() -``` - -Modifier that restricts a function to only be callable by the `whitelister` role. - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IServiceManager _serviceManager) public -``` - -### initialize - -```solidity -function initialize(address _operatorWhitelister, bool _operatorWhitelistEnabled, uint256[] _quorumBips, struct VoteWeigherBaseStorage.StrategyAndWeightingMultiplier[] _quorumStrategiesConsideredAndMultipliers) public virtual -``` - -Initialize whitelister and the quorum strategies + multipliers. - -### setOperatorWhitelister - -```solidity -function setOperatorWhitelister(address _operatorWhitelister) external -``` - -Called by the service manager owner to transfer the whitelister role to another address - -### setOperatorWhitelistStatus - -```solidity -function setOperatorWhitelistStatus(bool _operatorWhitelistEnabled) external -``` - -Callable only by the service manager owner, this function toggles the whitelist on or off - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _operatorWhitelistEnabled | bool | true if turning whitelist on, false otherwise | - -### addToOperatorWhitelist - -```solidity -function addToOperatorWhitelist(address[] operators) external -``` - -Called by the operatorWhitelister, adds a list of operators to the whitelist - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operators | address[] | the operators to add to the whitelist | - -### removeFromWhitelist - -```solidity -function removeFromWhitelist(address[] operators) external -``` - -Called by the operatorWhitelister, removes a list of operators to the whitelist - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operators | address[] | the operators to remove from the whitelist | - -### registerOperator - -```solidity -function registerOperator(string socket) external virtual -``` - -called for registering as an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| socket | string | is the socket address of the operator | - -### _registerOperator - -```solidity -function _registerOperator(address operator, string socket) internal -``` - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | is the node who is registering to be a operator | -| socket | string | is the socket address of the operator | - -### deregisterOperator - -```solidity -function deregisterOperator(uint32 index) external virtual returns (bool) -``` - -Used by an operator to de-register itself from providing service to the middleware. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| index | uint32 | is the sender's location in the dynamic array `operatorList` | - -### _deregisterOperator - -```solidity -function _deregisterOperator(address operator, uint32 index) internal -``` - -Used to process de-registering an operator from providing service to the middleware. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | address | The operator to be deregistered | -| index | uint32 | is the sender's location in the dynamic array `operatorList` | - -### updateStakes - -```solidity -function updateStakes(address[] operators, uint256[] prevElements) external -``` - -Used for updating information on deposits of nodes. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operators | address[] | are the nodes whose deposit information is getting updated | -| prevElements | uint256[] | are the elements before this middleware in the operator's linked list within the slasher | - -### _setOperatorWhitelister - -```solidity -function _setOperatorWhitelister(address _operatorWhitelister) internal -``` - diff --git a/docs/docgen/middleware/example/HashThreshold.md b/docs/docgen/middleware/example/HashThreshold.md deleted file mode 100644 index 99cc3011d..000000000 --- a/docs/docgen/middleware/example/HashThreshold.md +++ /dev/null @@ -1,151 +0,0 @@ -# Solidity API - -## HashThreshold - -### disputePeriodBlocks - -```solidity -uint32 disputePeriodBlocks -``` - -### numZeroes - -```solidity -uint8 numZeroes -``` - -### slasher - -```solidity -contract ISlasher slasher -``` - -### registry - -```solidity -contract ECDSARegistry registry -``` - -### CertifiedMessageMetadata - -```solidity -struct CertifiedMessageMetadata { - bytes32 signaturesHash; - uint32 validAfterBlock; -} -``` - -### taskNumber - -```solidity -uint32 taskNumber -``` - -Returns the current 'taskNumber' for the middleware - -### latestServeUntilBlock - -```solidity -uint32 latestServeUntilBlock -``` - -Returns the latest block until which operators must serve. - -### certifiedMessageMetadatas - -```solidity -mapping(bytes32 => struct HashThreshold.CertifiedMessageMetadata) certifiedMessageMetadatas -``` - -### MessageCertified - -```solidity -event MessageCertified(bytes32) -``` - -### onlyRegistry - -```solidity -modifier onlyRegistry() -``` - -### constructor - -```solidity -constructor(contract ISlasher _slasher, contract ECDSARegistry _registry) public -``` - -### owner - -```solidity -function owner() public view returns (address) -``` - -### decaHash - -```solidity -function decaHash(bytes32 message) public pure returns (bytes32) -``` - -### submitSignatures - -```solidity -function submitSignatures(bytes32 message, bytes signatures) external -``` - -This function is called by anyone to certify a message. Signers are certifying that the decahashed message starts with at least `numZeros` 0s. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| message | bytes32 | The message to certify | -| signatures | bytes | The signatures of the message, certifying it | - -### slashSigners - -```solidity -function slashSigners(bytes32 message, bytes signatures) external -``` - -This function is called by anyone to slash the signers of an invalid message that has been certified. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| message | bytes32 | The message to slash the signers of | -| signatures | bytes | The signatures that certified the message | - -### freezeOperator - -```solidity -function freezeOperator(address operator) external -``` - -Permissioned function that causes the ServiceManager to freeze the operator on EigenLayer, through a call to the Slasher contract - -### recordFirstStakeUpdate - -```solidity -function recordFirstStakeUpdate(address operator, uint32 serveUntilBlock) external -``` - -Permissioned function to have the ServiceManager forward a call to the slasher, recording an initial stake update (on operator registration) - -### recordLastStakeUpdateAndRevokeSlashingAbility - -```solidity -function recordLastStakeUpdateAndRevokeSlashingAbility(address operator, uint32 serveUntilBlock) external -``` - -Permissioned function to have the ServiceManager forward a call to the slasher, recording a final stake update (on operator deregistration) - -### recordStakeUpdate - -```solidity -function recordStakeUpdate(address operator, uint32 updateBlock, uint32 serveUntilBlock, uint256 prevElement) external -``` - -Permissioned function to have the ServiceManager forward a call to the slasher, recording a stake update - diff --git a/docs/docgen/operators/MerkleDelegationTerms.md b/docs/docgen/operators/MerkleDelegationTerms.md deleted file mode 100644 index 166437dd8..000000000 --- a/docs/docgen/operators/MerkleDelegationTerms.md +++ /dev/null @@ -1,129 +0,0 @@ -# Solidity API - -## MerkleDelegationTerms - -This contract specifies the delegation terms of a given operator. When a staker delegates its stake to an operator, -it has to agrees to the terms set in the operator's 'Delegation Terms' contract. Payments to an operator are routed through -their specified 'Delegation Terms' contract for subsequent distribution of earnings to individual stakers. -There are also hooks that call into an operator's DelegationTerms contract when a staker delegates to or undelegates from -the operator. - -_This contract uses a system in which the operator posts roots of a *sparse Merkle tree*. Each leaf of the tree is expected -to contain the **cumulative** earnings of a staker. This will reduce the total number of actions that stakers who claim only rarely -have to take, while allowing stakers to claim their earnings as often as new Merkle roots are posted._ - -### TokenAndAmount - -```solidity -struct TokenAndAmount { - contract IERC20 token; - uint256 amount; -} -``` - -### MerkleRootAndTreeHeight - -```solidity -struct MerkleRootAndTreeHeight { - bytes32 root; - uint256 height; -} -``` - -### MAX_HEIGHT - -```solidity -uint256 MAX_HEIGHT -``` - -### cumulativeClaimedByStakerOfToken - -```solidity -mapping(address => mapping(contract IERC20 => uint256)) cumulativeClaimedByStakerOfToken -``` - -staker => token => cumulative amount *claimed* - -### merkleRoots - -```solidity -struct MerkleDelegationTerms.MerkleRootAndTreeHeight[] merkleRoots -``` - -Array of Merkle roots with heights, each posted by the operator (contract owner) - -### NewMerkleRootPosted - -```solidity -event NewMerkleRootPosted(bytes32 newRoot, uint256 height) -``` - -### operatorWithdrawal - -```solidity -function operatorWithdrawal(struct MerkleDelegationTerms.TokenAndAmount[] tokensAndAmounts) external -``` - -Used by the operator to withdraw tokens directly from this contract. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| tokensAndAmounts | struct MerkleDelegationTerms.TokenAndAmount[] | ERC20 tokens to withdraw and the amount of each respective ERC20 token to withdraw. | - -### postMerkleRoot - -```solidity -function postMerkleRoot(bytes32 newRoot, uint256 height) external -``` - -Used by the operator to post an updated root of the stakers' all-time earnings - -### proveEarningsAndWithdraw - -```solidity -function proveEarningsAndWithdraw(struct MerkleDelegationTerms.TokenAndAmount[] tokensAndAmounts, bytes proof, uint256 nodeIndex, uint256 rootIndex) external -``` - -Called by a staker to prove the inclusion of their earnings in a Merkle root (posted by the operator) and claim them. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| tokensAndAmounts | struct MerkleDelegationTerms.TokenAndAmount[] | ERC20 tokens to withdraw and the amount of each respective ERC20 token to withdraw. | -| proof | bytes | Merkle proof showing that a leaf containing `(msg.sender, tokensAndAmounts)` was included in the `rootIndex`-th Merkle root posted by the operator. | -| nodeIndex | uint256 | Specifies the node inside the Merkle tree corresponding to the specified root, `merkleRoots[rootIndex].root`. | -| rootIndex | uint256 | Specifies the Merkle root to look up, using `merkleRoots[rootIndex]` | - -### calculateLeafHash - -```solidity -function calculateLeafHash(address staker, struct MerkleDelegationTerms.TokenAndAmount[] tokensAndAmounts) public pure returns (bytes32) -``` - -Helper function for calculating a leaf in a Merkle tree formatted as `(address staker, TokenAndAmount[] calldata tokensAndAmounts)` - -### payForService - -```solidity -function payForService(contract IERC20, uint256) external payable -``` - -### onDelegationReceived - -```solidity -function onDelegationReceived(address, contract IStrategy[], uint256[]) external pure returns (bytes) -``` - -Hook for receiving new delegation - -### onDelegationWithdrawn - -```solidity -function onDelegationWithdrawn(address, contract IStrategy[], uint256[]) external pure returns (bytes) -``` - -Hook for withdrawing delegation - diff --git a/docs/docgen/permissions/Pausable.md b/docs/docgen/permissions/Pausable.md deleted file mode 100644 index 37277bc16..000000000 --- a/docs/docgen/permissions/Pausable.md +++ /dev/null @@ -1,167 +0,0 @@ -# Solidity API - -## Pausable - -Contracts that inherit from this contract may define their own `pause` and `unpause` (and/or related) functions. -These functions should be permissioned as "onlyPauser" which defers to a `PauserRegistry` for determining access control. - -_Pausability is implemented using a uint256, which allows up to 256 different single bit-flags; each bit can potentially pause different functionality. -Inspiration for this was taken from the NearBridge design here https://etherscan.io/address/0x3FEFc5A4B1c02f21cBc8D3613643ba0635b9a873#code. -For the `pause` and `unpause` functions we've implemented, if you pause, you can only flip (any number of) switches to on/1 (aka "paused"), and if you unpause, -you can only flip (any number of) switches to off/0 (aka "paused"). -If you want a pauseXYZ function that just flips a single bit / "pausing flag", it will: -1) 'bit-wise and' (aka `&`) a flag with the current paused state (as a uint256) -2) update the paused state to this new value -We note as well that we have chosen to identify flags by their *bit index* as opposed to their numerical value, so, e.g. defining `DEPOSITS_PAUSED = 3` -indicates specifically that if the *third bit* of `_paused` is flipped -- i.e. it is a '1' -- then deposits should be paused_ - -### pauserRegistry - -```solidity -contract IPauserRegistry pauserRegistry -``` - -Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing). - -### _paused - -```solidity -uint256 _paused -``` - -_whether or not the contract is currently paused_ - -### UNPAUSE_ALL - -```solidity -uint256 UNPAUSE_ALL -``` - -### PAUSE_ALL - -```solidity -uint256 PAUSE_ALL -``` - -### Paused - -```solidity -event Paused(address account, uint256 newPausedStatus) -``` - -Emitted when the pause is triggered by `account`, and changed to `newPausedStatus`. - -### Unpaused - -```solidity -event Unpaused(address account, uint256 newPausedStatus) -``` - -Emitted when the pause is lifted by `account`, and changed to `newPausedStatus`. - -### onlyPauser - -```solidity -modifier onlyPauser() -``` - -@notice - -### onlyUnpauser - -```solidity -modifier onlyUnpauser() -``` - -### whenNotPaused - -```solidity -modifier whenNotPaused() -``` - -Throws if the contract is paused, i.e. if any of the bits in `_paused` is flipped to 1. - -### onlyWhenNotPaused - -```solidity -modifier onlyWhenNotPaused(uint8 index) -``` - -Throws if the `indexed`th bit of `_paused` is 1, i.e. if the `index`th pause switch is flipped. - -### _initializePauser - -```solidity -function _initializePauser(contract IPauserRegistry _pauserRegistry, uint256 initPausedStatus) internal -``` - -One-time function for setting the `pauserRegistry` and initializing the value of `_paused`. - -### pause - -```solidity -function pause(uint256 newPausedStatus) external -``` - -This function is used to pause an EigenLayer contract's functionality. -It is permissioned to the `pauser` address, which is expected to be a low threshold multisig. - -_This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newPausedStatus | uint256 | represents the new value for `_paused` to take, which means it may flip several bits at once. | - -### pauseAll - -```solidity -function pauseAll() external -``` - -Alias for `pause(type(uint256).max)`. - -### unpause - -```solidity -function unpause(uint256 newPausedStatus) external -``` - -This function is used to unpause an EigenLayer contract's functionality. -It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract. - -_This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newPausedStatus | uint256 | represents the new value for `_paused` to take, which means it may flip several bits at once. | - -### paused - -```solidity -function paused() public view virtual returns (uint256) -``` - -Returns the current paused status as a uint256. - -### paused - -```solidity -function paused(uint8 index) public view virtual returns (bool) -``` - -Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise - -### __gap - -```solidity -uint256[48] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/permissions/PauserRegistry.md b/docs/docgen/permissions/PauserRegistry.md deleted file mode 100644 index 28c4a6f46..000000000 --- a/docs/docgen/permissions/PauserRegistry.md +++ /dev/null @@ -1,72 +0,0 @@ -# Solidity API - -## PauserRegistry - -### pauser - -```solidity -address pauser -``` - -Unique address that holds the pauser role. - -### unpauser - -```solidity -address unpauser -``` - -Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses. - -### PauserChanged - -```solidity -event PauserChanged(address previousPauser, address newPauser) -``` - -### UnpauserChanged - -```solidity -event UnpauserChanged(address previousUnpauser, address newUnpauser) -``` - -### onlyUnpauser - -```solidity -modifier onlyUnpauser() -``` - -### constructor - -```solidity -constructor(address _pauser, address _unpauser) public -``` - -### setPauser - -```solidity -function setPauser(address newPauser) external -``` - -Sets new pauser - only callable by unpauser, as the unpauser is expected to be kept more secure, e.g. being a multisig with a higher threshold - -### setUnpauser - -```solidity -function setUnpauser(address newUnpauser) external -``` - -Sets new unpauser - only callable by unpauser, as the unpauser is expected to be kept more secure, e.g. being a multisig with a higher threshold - -### _setPauser - -```solidity -function _setPauser(address newPauser) internal -``` - -### _setUnpauser - -```solidity -function _setUnpauser(address newUnpauser) internal -``` - diff --git a/docs/docgen/pods/BeaconChainOracle.md b/docs/docgen/pods/BeaconChainOracle.md deleted file mode 100644 index 4b809cca6..000000000 --- a/docs/docgen/pods/BeaconChainOracle.md +++ /dev/null @@ -1,202 +0,0 @@ -# Solidity API - -## BeaconChainOracle - -The owner of this contract can edit a set of 'oracle signers', as well as changing the threshold number of oracle signers that must vote for a - particular state root at a specified blockNumber before the state root is considered 'confirmed'. - -### MINIMUM_THRESHOLD - -```solidity -uint256 MINIMUM_THRESHOLD -``` - -The minimum value which the `threshold` variable is allowed to take. - -### totalOracleSigners - -```solidity -uint256 totalOracleSigners -``` - -Total number of members of the set of oracle signers. - -### threshold - -```solidity -uint256 threshold -``` - -Number of oracle signers that must vote for a state root in order for the state root to be confirmed. -Adjustable by this contract's owner through use of the `setThreshold` function. - -_We note that there is an edge case -- when the threshold is adjusted downward, if a state root already has enough votes to meet the *new* threshold, -the state root must still receive one additional vote from an oracle signer to be confirmed. This behavior is intended, to minimize unexpected root confirmations._ - -### latestConfirmedOracleBlockNumber - -```solidity -uint64 latestConfirmedOracleBlockNumber -``` - -Largest blockNumber that has been confirmed by the oracle. - -### beaconStateRootAtBlockNumber - -```solidity -mapping(uint64 => bytes32) beaconStateRootAtBlockNumber -``` - -Mapping: Beacon Chain blockNumber => the Beacon Chain state root at the specified blockNumber. - -_This will return `bytes32(0)` if the state root at the specified blockNumber is not yet confirmed._ - -### isOracleSigner - -```solidity -mapping(address => bool) isOracleSigner -``` - -Mapping: address => whether or not the address is in the set of oracle signers. - -### hasVoted - -```solidity -mapping(uint64 => mapping(address => bool)) hasVoted -``` - -Mapping: Beacon Chain blockNumber => oracle signer address => whether or not the oracle signer has voted on the state root at the blockNumber. - -### stateRootVotes - -```solidity -mapping(uint64 => mapping(bytes32 => uint256)) stateRootVotes -``` - -Mapping: Beacon Chain blockNumber => state root => total number of oracle signer votes for the state root at the blockNumber. - -### ThresholdModified - -```solidity -event ThresholdModified(uint256 previousValue, uint256 newValue) -``` - -Emitted when the value of the `threshold` variable is changed from `previousValue` to `newValue`. - -### StateRootConfirmed - -```solidity -event StateRootConfirmed(uint64 blockNumber, bytes32 stateRoot) -``` - -Emitted when the beacon chain state root at `blockNumber` is confirmed to be `stateRoot`. - -### OracleSignerAdded - -```solidity -event OracleSignerAdded(address addedOracleSigner) -``` - -Emitted when `addedOracleSigner` is added to the set of oracle signers. - -### OracleSignerRemoved - -```solidity -event OracleSignerRemoved(address removedOracleSigner) -``` - -Emitted when `removedOracleSigner` is removed from the set of oracle signers. - -### onlyOracleSigner - -```solidity -modifier onlyOracleSigner() -``` - -Modifier that restricts functions to only be callable by members of the oracle signer set - -### constructor - -```solidity -constructor(address initialOwner, uint256 initialThreshold, address[] initialOracleSigners) public -``` - -### setThreshold - -```solidity -function setThreshold(uint256 _threshold) external -``` - -Owner-only function used to modify the value of the `threshold` variable. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _threshold | uint256 | Desired new value for the `threshold` variable. Function will revert if this is set to zero. | - -### addOracleSigners - -```solidity -function addOracleSigners(address[] _oracleSigners) external -``` - -Owner-only function used to add a signer to the set of oracle signers. - -_Function will have no effect on the i-th input address if `_oracleSigners[i]`is already in the set of oracle signers._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleSigners | address[] | Array of address to be added to the set. | - -### removeOracleSigners - -```solidity -function removeOracleSigners(address[] _oracleSigners) external -``` - -Owner-only function used to remove a signer from the set of oracle signers. - -_Function will have no effect on the i-th input address if `_oracleSigners[i]`is already not in the set of oracle signers._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleSigners | address[] | Array of address to be removed from the set. | - -### voteForBeaconChainStateRoot - -```solidity -function voteForBeaconChainStateRoot(uint64 blockNumber, bytes32 stateRoot) external -``` - -Called by a member of the set of oracle signers to assert that the Beacon Chain state root is `stateRoot` at `blockNumber`. - -_The state root will be confirmed once the total number of votes *for this exact state root at this exact blockNumber* meets the `threshold` value._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| blockNumber | uint64 | The Beacon Chain blockNumber of interest. | -| stateRoot | bytes32 | The Beacon Chain state root that the caller asserts was the correct root, at the specified `blockNumber`. | - -### _setThreshold - -```solidity -function _setThreshold(uint256 _threshold) internal -``` - -Internal function used for modifying the value of the `threshold` variable, used in the constructor and the `setThreshold` function - -### _addOracleSigners - -```solidity -function _addOracleSigners(address[] _oracleSigners) internal -``` - -Internal counterpart of the `addOracleSigners` function. Also used in the constructor. - diff --git a/docs/docgen/pods/DelayedWithdrawalRouter.md b/docs/docgen/pods/DelayedWithdrawalRouter.md deleted file mode 100644 index 095dd3f80..000000000 --- a/docs/docgen/pods/DelayedWithdrawalRouter.md +++ /dev/null @@ -1,201 +0,0 @@ -# Solidity API - -## DelayedWithdrawalRouter - -### WithdrawalDelayBlocksSet - -```solidity -event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -``` - -Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - -### PAUSED_DELAYED_WITHDRAWAL_CLAIMS - -```solidity -uint8 PAUSED_DELAYED_WITHDRAWAL_CLAIMS -``` - -### withdrawalDelayBlocks - -```solidity -uint256 withdrawalDelayBlocks -``` - -Delay enforced by this contract for completing any delayedWithdrawal. Measured in blocks, and adjustable by this contract's owner, -up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced). - -### MAX_WITHDRAWAL_DELAY_BLOCKS - -```solidity -uint256 MAX_WITHDRAWAL_DELAY_BLOCKS -``` - -### eigenPodManager - -```solidity -contract IEigenPodManager eigenPodManager -``` - -The EigenPodManager contract of EigenLayer. - -### _userWithdrawals - -```solidity -mapping(address => struct IDelayedWithdrawalRouter.UserDelayedWithdrawals) _userWithdrawals -``` - -Mapping: user => struct storing all delayedWithdrawal info. Marked as internal with an external getter function named `userWithdrawals` - -### DelayedWithdrawalCreated - -```solidity -event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -``` - -event for delayedWithdrawal creation - -### DelayedWithdrawalsClaimed - -```solidity -event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -``` - -event for the claiming of delayedWithdrawals - -### onlyEigenPod - -```solidity -modifier onlyEigenPod(address podOwner) -``` - -Modifier used to permission a function to only be called by the EigenPod of the specified `podOwner` - -### constructor - -```solidity -constructor(contract IEigenPodManager _eigenPodManager) public -``` - -### initialize - -```solidity -function initialize(address initOwner, contract IPauserRegistry _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) external -``` - -### createDelayedWithdrawal - -```solidity -function createDelayedWithdrawal(address podOwner, address recipient) external payable -``` - -Creates a delayed withdrawal for `msg.value` to the `recipient`. - -_Only callable by the `podOwner`'s EigenPod contract._ - -### claimDelayedWithdrawals - -```solidity -function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) external -``` - -Called in order to withdraw delayed withdrawals made to the `recipient` that have passed the `withdrawalDelayBlocks` period. - -_WARNING: Note that the caller of this function cannot control where the funds are sent, but they can control when the - funds are sent once the withdrawal becomes claimable._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| recipient | address | The address to claim delayedWithdrawals for. | -| maxNumberOfDelayedWithdrawalsToClaim | uint256 | Used to limit the maximum number of delayedWithdrawals to loop through claiming. | - -### claimDelayedWithdrawals - -```solidity -function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) external -``` - -Called in order to withdraw delayed withdrawals made to the caller that have passed the `withdrawalDelayBlocks` period. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| maxNumberOfDelayedWithdrawalsToClaim | uint256 | Used to limit the maximum number of delayedWithdrawals to loop through claiming. | - -### setWithdrawalDelayBlocks - -```solidity -function setWithdrawalDelayBlocks(uint256 newValue) external -``` - -Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable. - -### userWithdrawals - -```solidity -function userWithdrawals(address user) external view returns (struct IDelayedWithdrawalRouter.UserDelayedWithdrawals) -``` - -Getter function for the mapping `_userWithdrawals` - -### claimableUserDelayedWithdrawals - -```solidity -function claimableUserDelayedWithdrawals(address user) external view returns (struct IDelayedWithdrawalRouter.DelayedWithdrawal[]) -``` - -Getter function to get all delayedWithdrawals that are currently claimable by the `user` - -### userDelayedWithdrawalByIndex - -```solidity -function userDelayedWithdrawalByIndex(address user, uint256 index) external view returns (struct IDelayedWithdrawalRouter.DelayedWithdrawal) -``` - -Getter function for fetching the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array - -### userWithdrawalsLength - -```solidity -function userWithdrawalsLength(address user) external view returns (uint256) -``` - -Getter function for fetching the length of the delayedWithdrawals array of a specific user - -### canClaimDelayedWithdrawal - -```solidity -function canClaimDelayedWithdrawal(address user, uint256 index) external view returns (bool) -``` - -Convenience function for checking whether or not the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array is currently claimable - -### _claimDelayedWithdrawals - -```solidity -function _claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) internal -``` - -internal function used in both of the overloaded `claimDelayedWithdrawals` functions - -### _setWithdrawalDelayBlocks - -```solidity -function _setWithdrawalDelayBlocks(uint256 newValue) internal -``` - -internal function for changing the value of `withdrawalDelayBlocks`. Also performs sanity check and emits an event. - -### __gap - -```solidity -uint256[48] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/pods/EigenPod.md b/docs/docgen/pods/EigenPod.md deleted file mode 100644 index 766f56474..000000000 --- a/docs/docgen/pods/EigenPod.md +++ /dev/null @@ -1,345 +0,0 @@ -# Solidity API - -## EigenPod - -The main functionalities are: -- creating new ETH validators with their withdrawal credentials pointed to this contract -- proving from beacon chain state roots that withdrawal credentials are pointed to this contract -- proving from beacon chain state roots the balances of ETH validators with their withdrawal credentials - pointed to this contract -- updating aggregate balances in the EigenPodManager -- withdrawing eth when withdrawals are initiated - -_Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose - to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts_ - -### GWEI_TO_WEI - -```solidity -uint256 GWEI_TO_WEI -``` - -### VERIFY_OVERCOMMITTED_WINDOW_BLOCKS - -```solidity -uint256 VERIFY_OVERCOMMITTED_WINDOW_BLOCKS -``` - -Maximum "staleness" of a Beacon Chain state root against which `verifyOvercommittedStake` may be proven. 7 days in blocks. - -### ethPOS - -```solidity -contract IETHPOSDeposit ethPOS -``` - -This is the beacon chain deposit contract - -### delayedWithdrawalRouter - -```solidity -contract IDelayedWithdrawalRouter delayedWithdrawalRouter -``` - -Contract used for withdrawal routing, to provide an extra "safety net" mechanism - -### eigenPodManager - -```solidity -contract IEigenPodManager eigenPodManager -``` - -The single EigenPodManager for EigenLayer - -### REQUIRED_BALANCE_GWEI - -```solidity -uint64 REQUIRED_BALANCE_GWEI -``` - -The amount of eth, in gwei, that is restaked per validator - -### REQUIRED_BALANCE_WEI - -```solidity -uint256 REQUIRED_BALANCE_WEI -``` - -The amount of eth, in wei, that is restaked per ETH validator into EigenLayer - -### podOwner - -```solidity -address podOwner -``` - -The owner of this EigenPod - -### mostRecentWithdrawalBlockNumber - -```solidity -uint64 mostRecentWithdrawalBlockNumber -``` - -The latest block number at which the pod owner withdrew the balance of the pod. - -_This variable is only updated when the `withdraw` function is called, which can only occur before `hasRestaked` is set to true for this pod. -Proofs for this pod are only valid against Beacon Chain state roots corresponding to blocks after the stored `mostRecentWithdrawalBlockNumber`._ - -### restakedExecutionLayerGwei - -```solidity -uint64 restakedExecutionLayerGwei -``` - -the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer), - -### hasRestaked - -```solidity -bool hasRestaked -``` - -an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. - -### validatorStatus - -```solidity -mapping(uint40 => enum IEigenPod.VALIDATOR_STATUS) validatorStatus -``` - -this is a mapping of validator indices to a Validator struct containing pertinent info about the validator - -### provenPartialWithdrawal - -```solidity -mapping(uint40 => mapping(uint64 => bool)) provenPartialWithdrawal -``` - -This is a mapping of validatorIndex to withdrawalIndex to whether or not they have proven a withdrawal for that index - -### EigenPodStaked - -```solidity -event EigenPodStaked(bytes pubkey) -``` - -Emitted when an ETH validator stakes via this eigenPod - -### ValidatorRestaked - -```solidity -event ValidatorRestaked(uint40 validatorIndex) -``` - -Emitted when an ETH validator's withdrawal credentials are successfully verified to be pointed to this eigenPod - -### ValidatorOvercommitted - -```solidity -event ValidatorOvercommitted(uint40 validatorIndex) -``` - -Emitted when an ETH validator is proven to have a balance less than `REQUIRED_BALANCE_GWEI` in the beacon chain - -### FullWithdrawalRedeemed - -```solidity -event FullWithdrawalRedeemed(uint40 validatorIndex, address recipient, uint64 withdrawalAmountGwei) -``` - -Emitted when an ETH validator is prove to have withdrawn from the beacon chain - -### PartialWithdrawalRedeemed - -```solidity -event PartialWithdrawalRedeemed(uint40 validatorIndex, address recipient, uint64 partialWithdrawalAmountGwei) -``` - -Emitted when a partial withdrawal claim is successfully redeemed - -### RestakedBeaconChainETHWithdrawn - -```solidity -event RestakedBeaconChainETHWithdrawn(address recipient, uint256 amount) -``` - -Emitted when restaked beacon chain ETH is withdrawn from the eigenPod. - -### onlyEigenPodManager - -```solidity -modifier onlyEigenPodManager() -``` - -### onlyEigenPodOwner - -```solidity -modifier onlyEigenPodOwner() -``` - -### onlyNotFrozen - -```solidity -modifier onlyNotFrozen() -``` - -### hasNeverRestaked - -```solidity -modifier hasNeverRestaked() -``` - -### proofIsForValidBlockNumber - -```solidity -modifier proofIsForValidBlockNumber(uint64 blockNumber) -``` - -Checks that `blockNumber` is strictly greater than the value stored in `mostRecentWithdrawalBlockNumber` - -### onlyWhenNotPaused - -```solidity -modifier onlyWhenNotPaused(uint8 index) -``` - -Based on 'Pausable' code, but uses the storage of the EigenPodManager instead of this contract. This construction -is necessary for enabling pausing all EigenPods at the same time (due to EigenPods being Beacon Proxies). -Modifier throws if the `indexed`th bit of `_paused` in the EigenPodManager is 1, i.e. if the `index`th pause switch is flipped. - -### constructor - -```solidity -constructor(contract IETHPOSDeposit _ethPOS, contract IDelayedWithdrawalRouter _delayedWithdrawalRouter, contract IEigenPodManager _eigenPodManager, uint256 _REQUIRED_BALANCE_WEI) public -``` - -### initialize - -```solidity -function initialize(address _podOwner) external -``` - -Used to initialize the pointers to addresses crucial to the pod's functionality. Called on construction by the EigenPodManager. - -### stake - -```solidity -function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) external payable -``` - -Called by EigenPodManager when the owner wants to create another ETH validator. - -### verifyWithdrawalCredentialsAndBalance - -```solidity -function verifyWithdrawalCredentialsAndBalance(uint64 oracleBlockNumber, uint40 validatorIndex, struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs proofs, bytes32[] validatorFields) external -``` - -This function verifies that the withdrawal credentials of the podOwner are pointed to -this contract. It also verifies the current (not effective) balance of the validator. It verifies the provided proof of the ETH validator against the beacon chain state -root, marks the validator as 'active' in EigenLayer, and credits the restaked ETH in Eigenlayer. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| oracleBlockNumber | uint64 | is the Beacon Chain blockNumber whose state root the `proof` will be proven against. | -| validatorIndex | uint40 | is the index of the validator being proven, refer to consensus specs | -| proofs | struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs | is the bytes that prove the ETH validator's balance and withdrawal credentials against a beacon chain state root | -| validatorFields | bytes32[] | are the fields of the "Validator Container", refer to consensus specs for details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator | - -### verifyOvercommittedStake - -```solidity -function verifyOvercommittedStake(uint40 validatorIndex, struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs proofs, bytes32[] validatorFields, uint256 beaconChainETHStrategyIndex, uint64 oracleBlockNumber) external -``` - -This function records an overcommitment of stake to EigenLayer on behalf of a certain ETH validator. - If successful, the overcommitted balance is penalized (available for withdrawal whenever the pod's balance allows). - The ETH validator's shares in the enshrined beaconChainETH strategy are also removed from the StrategyManager and undelegated. - -_For more details on the Beacon Chain spec, see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| validatorIndex | uint40 | is the index of the validator being proven, refer to consensus specs | -| proofs | struct BeaconChainProofs.ValidatorFieldsAndBalanceProofs | is the proof of the validator's balance and validatorFields in the balance tree and the balanceRoot to prove for | -| validatorFields | bytes32[] | are the fields of the "Validator Container", refer to consensus specs | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy for the pod owner for the callback to the StrategyManager in case it must be removed from the list of the podOwner's strategies | -| oracleBlockNumber | uint64 | The oracleBlockNumber whose state root the `proof` will be proven against. Must be within `VERIFY_OVERCOMMITTED_WINDOW_BLOCKS` of the current block. | - -### verifyAndProcessWithdrawal - -```solidity -function verifyAndProcessWithdrawal(struct BeaconChainProofs.WithdrawalProofs withdrawalProofs, bytes validatorFieldsProof, bytes32[] validatorFields, bytes32[] withdrawalFields, uint256 beaconChainETHStrategyIndex, uint64 oracleBlockNumber) external -``` - -This function records a full withdrawal on behalf of one of the Ethereum validators for this EigenPod - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| withdrawalProofs | struct BeaconChainProofs.WithdrawalProofs | is the information needed to check the veracity of the block number and withdrawal being proven | -| validatorFieldsProof | bytes | is the information needed to check the veracity of the validator fields being proven | -| validatorFields | bytes32[] | are the fields of the validator being proven | -| withdrawalFields | bytes32[] | are the fields of the withdrawal being proven | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy for the pod owner for the callback to the EigenPodManager to the StrategyManager in case it must be removed from the podOwner's list of strategies | -| oracleBlockNumber | uint64 | is the Beacon Chain blockNumber whose state root the `proof` will be proven against. | - -### _processFullWithdrawal - -```solidity -function _processFullWithdrawal(uint64 withdrawalAmountGwei, uint40 validatorIndex, uint256 beaconChainETHStrategyIndex, address recipient, enum IEigenPod.VALIDATOR_STATUS status) internal -``` - -### _processPartialWithdrawal - -```solidity -function _processPartialWithdrawal(uint64 withdrawalHappenedSlot, uint64 partialWithdrawalAmountGwei, uint40 validatorIndex, address recipient) internal -``` - -### withdrawRestakedBeaconChainETH - -```solidity -function withdrawRestakedBeaconChainETH(address recipient, uint256 amountWei) external -``` - -Transfers `amountWei` in ether from this contract to the specified `recipient` address -Called by EigenPodManager to withdrawBeaconChainETH that has been added to the EigenPod's balance due to a withdrawal from the beacon chain. - -_Called during withdrawal or slashing._ - -### withdrawBeforeRestaking - -```solidity -function withdrawBeforeRestaking() external -``` - -Called by the pod owner to withdraw the balance of the pod when `hasRestaked` is set to false - -### _podWithdrawalCredentials - -```solidity -function _podWithdrawalCredentials() internal view returns (bytes) -``` - -### _sendETH - -```solidity -function _sendETH(address recipient, uint256 amountWei) internal -``` - -### __gap - -```solidity -uint256[46] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/pods/EigenPodManager.md b/docs/docgen/pods/EigenPodManager.md deleted file mode 100644 index c2482ee6b..000000000 --- a/docs/docgen/pods/EigenPodManager.md +++ /dev/null @@ -1,260 +0,0 @@ -# Solidity API - -## EigenPodManager - -The main functionalities are: -- creating EigenPods -- staking for new validators on EigenPods -- keeping track of the balances of all validators of EigenPods, and their stake in EigenLayer -- withdrawing eth when withdrawals are initiated - -### beaconProxyBytecode - -```solidity -bytes beaconProxyBytecode -``` - -Stored code of type(BeaconProxy).creationCode - -_Maintained as a constant to solve an edge case - changes to OpenZeppelin's BeaconProxy code should not cause -addresses of EigenPods that are pre-computed with Create2 to change, even upon upgrading this contract, changing compiler version, etc._ - -### ethPOS - -```solidity -contract IETHPOSDeposit ethPOS -``` - -The ETH2 Deposit Contract - -### eigenPodBeacon - -```solidity -contract IBeacon eigenPodBeacon -``` - -Beacon proxy to which the EigenPods point - -### strategyManager - -```solidity -contract IStrategyManager strategyManager -``` - -EigenLayer's StrategyManager contract - -### slasher - -```solidity -contract ISlasher slasher -``` - -EigenLayer's Slasher contract - -### beaconChainOracle - -```solidity -contract IBeaconChainOracle beaconChainOracle -``` - -Oracle contract that provides updates to the beacon chain's state - -### ownerToPod - -```solidity -mapping(address => contract IEigenPod) ownerToPod -``` - -Pod owner to deployed EigenPod address - -### BeaconOracleUpdated - -```solidity -event BeaconOracleUpdated(address newOracleAddress) -``` - -Emitted to notify the update of the beaconChainOracle address - -### PodDeployed - -```solidity -event PodDeployed(address eigenPod, address podOwner) -``` - -Emitted to notify the deployment of an EigenPod - -### BeaconChainETHDeposited - -```solidity -event BeaconChainETHDeposited(address podOwner, uint256 amount) -``` - -Emitted to notify a deposit of beacon chain ETH recorded in the strategy manager - -### onlyEigenPod - -```solidity -modifier onlyEigenPod(address podOwner) -``` - -### onlyStrategyManager - -```solidity -modifier onlyStrategyManager() -``` - -### constructor - -```solidity -constructor(contract IETHPOSDeposit _ethPOS, contract IBeacon _eigenPodBeacon, contract IStrategyManager _strategyManager, contract ISlasher _slasher) public -``` - -### initialize - -```solidity -function initialize(contract IBeaconChainOracle _beaconChainOracle, address initialOwner, contract IPauserRegistry _pauserRegistry, uint256 _initPausedStatus) external -``` - -### createPod - -```solidity -function createPod() external -``` - -Creates an EigenPod for the sender. - -_Function will revert if the `msg.sender` already has an EigenPod._ - -### stake - -```solidity -function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) external payable -``` - -Stakes for a new beacon chain validator on the sender's EigenPod. -Also creates an EigenPod for the sender if they don't have one already. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | The 48 bytes public key of the beacon chain validator. | -| signature | bytes | The validator's signature of the deposit data. | -| depositDataRoot | bytes32 | The root/hash of the deposit data for the validator's deposit. | - -### restakeBeaconChainETH - -```solidity -function restakeBeaconChainETH(address podOwner, uint256 amount) external -``` - -Deposits/Restakes beacon chain ETH in EigenLayer on behalf of the owner of an EigenPod. - -_Callable only by the podOwner's EigenPod contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| podOwner | address | The owner of the pod whose balance must be deposited. | -| amount | uint256 | The amount of ETH to 'deposit' (i.e. be credited to the podOwner). | - -### recordOvercommittedBeaconChainETH - -```solidity -function recordOvercommittedBeaconChainETH(address podOwner, uint256 beaconChainETHStrategyIndex, uint256 amount) external -``` - -Removes beacon chain ETH from EigenLayer on behalf of the owner of an EigenPod, when the - balance of a validator is lower than how much stake they have committed to EigenLayer - -_Callable only by the podOwner's EigenPod contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| podOwner | address | The owner of the pod whose balance must be removed. | -| beaconChainETHStrategyIndex | uint256 | is the index of the beaconChainETHStrategy for the pod owner for the callback to the StrategyManager in case it must be removed from the list of the podOwner's strategies | -| amount | uint256 | The amount of beacon chain ETH to decrement from the podOwner's shares in the strategyManager. | - -### withdrawRestakedBeaconChainETH - -```solidity -function withdrawRestakedBeaconChainETH(address podOwner, address recipient, uint256 amount) external -``` - -Withdraws ETH from an EigenPod. The ETH must have first been withdrawn from the beacon chain. - -_Callable only by the StrategyManager contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| podOwner | address | The owner of the pod whose balance must be withdrawn. | -| recipient | address | The recipient of the withdrawn ETH. | -| amount | uint256 | The amount of ETH to withdraw. | - -### updateBeaconChainOracle - -```solidity -function updateBeaconChainOracle(contract IBeaconChainOracle newBeaconChainOracle) external -``` - -Updates the oracle contract that provides the beacon chain state root - -_Callable only by the owner of this contract (i.e. governance)_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newBeaconChainOracle | contract IBeaconChainOracle | is the new oracle contract being pointed to | - -### _deployPod - -```solidity -function _deployPod() internal returns (contract IEigenPod) -``` - -### _updateBeaconChainOracle - -```solidity -function _updateBeaconChainOracle(contract IBeaconChainOracle newBeaconChainOracle) internal -``` - -### getPod - -```solidity -function getPod(address podOwner) public view returns (contract IEigenPod) -``` - -Returns the address of the `podOwner`'s EigenPod (whether it is deployed yet or not). - -### hasPod - -```solidity -function hasPod(address podOwner) public view returns (bool) -``` - -Returns 'true' if the `podOwner` has created an EigenPod, and 'false' otherwise. - -### getBeaconChainStateRoot - -```solidity -function getBeaconChainStateRoot(uint64 blockNumber) external view returns (bytes32) -``` - -Returns the Beacon Chain state root at `blockNumber`. Reverts if the Beacon Chain state root at `blockNumber` has not yet been finalized. - -### __gap - -```solidity -uint256[48] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/pods/EigenPodPausingConstants.md b/docs/docgen/pods/EigenPodPausingConstants.md deleted file mode 100644 index 5483e7081..000000000 --- a/docs/docgen/pods/EigenPodPausingConstants.md +++ /dev/null @@ -1,44 +0,0 @@ -# Solidity API - -## EigenPodPausingConstants - -### PAUSED_NEW_EIGENPODS - -```solidity -uint8 PAUSED_NEW_EIGENPODS -``` - -Index for flag that pauses creation of new EigenPods when set. See EigenPodManager code for details. - -### PAUSED_WITHDRAW_RESTAKED_ETH - -```solidity -uint8 PAUSED_WITHDRAW_RESTAKED_ETH -``` - -Index for flag that pauses the `withdrawRestakedBeaconChainETH` function *of the EigenPodManager* when set. See EigenPodManager code for details. - -### PAUSED_EIGENPODS_VERIFY_CREDENTIALS - -```solidity -uint8 PAUSED_EIGENPODS_VERIFY_CREDENTIALS -``` - -Index for flag that pauses the `verifyCorrectWithdrawalCredentials` function *of the EigenPods* when set. see EigenPod code for details. - -### PAUSED_EIGENPODS_VERIFY_OVERCOMMITTED - -```solidity -uint8 PAUSED_EIGENPODS_VERIFY_OVERCOMMITTED -``` - -Index for flag that pauses the `verifyOvercommittedStake` function *of the EigenPods* when set. see EigenPod code for details. - -### PAUSED_EIGENPODS_VERIFY_WITHDRAWAL - -```solidity -uint8 PAUSED_EIGENPODS_VERIFY_WITHDRAWAL -``` - -Index for flag that pauses the `verifyBeaconChainFullWithdrawal` function *of the EigenPods* when set. see EigenPod code for details. - diff --git a/docs/docgen/strategies/StrategyBase.md b/docs/docgen/strategies/StrategyBase.md deleted file mode 100644 index 9280a7d47..000000000 --- a/docs/docgen/strategies/StrategyBase.md +++ /dev/null @@ -1,300 +0,0 @@ -# Solidity API - -## StrategyBase - -Simple, basic, "do-nothing" Strategy that holds a single underlying token and returns it on withdrawals. -Implements minimal versions of the IStrategy functions, this contract is designed to be inherited by -more complex strategies, which can then override its functions as necessary. -This contract functions similarly to an ERC4626 vault, only without issuing a token. -To mitigate against the common "inflation attack" vector, we have chosen to use the 'virtual shares' mitigation route, -similar to [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol). -We acknowledge that this mitigation has the known downside of the virtual shares causing some losses to users, which are pronounced -particularly in the case of the share exchange rate changing signficantly, either positively or negatively. -For a fairly thorough discussion of this issue and our chosen mitigation strategy, we recommend reading through -[this thread](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3706) on the OpenZeppelin repo. -We specifically use a share offset of `SHARES_OFFSET` and a balance offset of `BALANCE_OFFSET`. - -_Note that some functions have their mutability restricted; developers inheriting from this contract cannot broaden -the mutability without modifying this contract itself. -This contract is expressly *not* intended for use with 'fee-on-transfer'-type tokens. -Setting the `underlyingToken` to be a fee-on-transfer token may result in improper accounting._ - -### PAUSED_DEPOSITS - -```solidity -uint8 PAUSED_DEPOSITS -``` - -### PAUSED_WITHDRAWALS - -```solidity -uint8 PAUSED_WITHDRAWALS -``` - -### SHARES_OFFSET - -```solidity -uint256 SHARES_OFFSET -``` - -virtual shares used as part of the mitigation of the common 'share inflation' attack vector. -Constant value chosen to reasonably reduce attempted share inflation by the first depositor, while still -incurring reasonably small losses to depositors - -### BALANCE_OFFSET - -```solidity -uint256 BALANCE_OFFSET -``` - -virtual balance used as part of the mitigation of the common 'share inflation' attack vector -Constant value chosen to reasonably reduce attempted share inflation by the first depositor, while still -incurring reasonably small losses to depositors - -### strategyManager - -```solidity -contract IStrategyManager strategyManager -``` - -EigenLayer's StrategyManager contract - -### underlyingToken - -```solidity -contract IERC20 underlyingToken -``` - -The underlying token for shares in this Strategy - -### totalShares - -```solidity -uint256 totalShares -``` - -The total number of extant shares in this Strategy - -### onlyStrategyManager - -```solidity -modifier onlyStrategyManager() -``` - -Simply checks that the `msg.sender` is the `strategyManager`, which is an address stored immutably at construction. - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager) public -``` - -Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable. - -### initialize - -```solidity -function initialize(contract IERC20 _underlyingToken, contract IPauserRegistry _pauserRegistry) public virtual -``` - -### _initializeStrategyBase - -```solidity -function _initializeStrategyBase(contract IERC20 _underlyingToken, contract IPauserRegistry _pauserRegistry) internal -``` - -Sets the `underlyingToken` and `pauserRegistry` for the strategy. - -### deposit - -```solidity -function deposit(contract IERC20 token, uint256 amount) external virtual returns (uint256 newShares) -``` - -Used to deposit tokens into this Strategy - -_This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's -`depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well. -Note that the assumption is made that `amount` of `token` has already been transferred directly to this contract -(as performed in the StrategyManager's deposit functions). In particular, setting the `underlyingToken` of this contract -to be a fee-on-transfer token will break the assumption that the amount this contract *received* of the token is equal to -the amount that was input when the transfer was performed (i.e. the amount transferred 'out' of the depositor's balance)._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| token | contract IERC20 | is the ERC20 token being deposited | -| amount | uint256 | is the amount of token being deposited | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newShares | uint256 | is the number of new shares issued at the current exchange ratio. | - -### withdraw - -```solidity -function withdraw(address depositor, contract IERC20 token, uint256 amountShares) external virtual -``` - -Used to withdraw tokens from this Strategy, to the `depositor`'s address - -_This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's -other functions, and individual share balances are recorded in the strategyManager as well._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | is the address to receive the withdrawn funds | -| token | contract IERC20 | is the ERC20 token being transferred out | -| amountShares | uint256 | is the amount of shares being withdrawn | - -### explanation - -```solidity -function explanation() external pure virtual returns (string) -``` - -Currently returns a brief string explaining the strategy's goal & purpose, but for more complex -strategies, may be a link to metadata that explains in more detail. - -### sharesToUnderlyingView - -```solidity -function sharesToUnderlyingView(uint256 amountShares) public view virtual returns (uint256) -``` - -Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. -In contrast to `sharesToUnderlying`, this function guarantees no state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountShares | uint256 | is the amount of shares to calculate its conversion into the underlying token | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of underlying tokens corresponding to the input `amountShares` | - -### sharesToUnderlying - -```solidity -function sharesToUnderlying(uint256 amountShares) public view virtual returns (uint256) -``` - -Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. -In contrast to `sharesToUnderlyingView`, this function **may** make state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountShares | uint256 | is the amount of shares to calculate its conversion into the underlying token | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of underlying tokens corresponding to the input `amountShares` | - -### underlyingToSharesView - -```solidity -function underlyingToSharesView(uint256 amountUnderlying) public view virtual returns (uint256) -``` - -Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. -In contrast to `underlyingToShares`, this function guarantees no state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountUnderlying | uint256 | is the amount of `underlyingToken` to calculate its conversion into strategy shares | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of shares corresponding to the input `amountUnderlying` | - -### underlyingToShares - -```solidity -function underlyingToShares(uint256 amountUnderlying) external view virtual returns (uint256) -``` - -Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. -In contrast to `underlyingToSharesView`, this function **may** make state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountUnderlying | uint256 | is the amount of `underlyingToken` to calculate its conversion into strategy shares | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of shares corresponding to the input `amountUnderlying` | - -### userUnderlyingView - -```solidity -function userUnderlyingView(address user) external view virtual returns (uint256) -``` - -convenience function for fetching the current underlying value of all of the `user`'s shares in -this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications - -### userUnderlying - -```solidity -function userUnderlying(address user) external virtual returns (uint256) -``` - -convenience function for fetching the current underlying value of all of the `user`'s shares in -this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications - -### shares - -```solidity -function shares(address user) public view virtual returns (uint256) -``` - -convenience function for fetching the current total shares of `user` in this strategy, by -querying the `strategyManager` contract - -### _tokenBalance - -```solidity -function _tokenBalance() internal view virtual returns (uint256) -``` - -Internal function used to fetch this contract's current balance of `underlyingToken`. - -### __gap - -```solidity -uint256[48] __gap -``` - -_This empty reserved space is put in place to allow future versions to add new -variables without shifting down storage in the inheritance chain. -See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps_ - diff --git a/docs/docgen/strategies/StrategyWrapper.md b/docs/docgen/strategies/StrategyWrapper.md deleted file mode 100644 index e39108b02..000000000 --- a/docs/docgen/strategies/StrategyWrapper.md +++ /dev/null @@ -1,222 +0,0 @@ -# Solidity API - -## StrategyWrapper - -Simple, basic, "do-nothing" Strategy that holds a single underlying token and returns it on withdrawals. -Assumes shares are always 1-to-1 with the underlyingToken. - -_Unlike `StrategyBase`, this contract is *not* designed to be inherited from. -This contract is expressly *not* intended for use with 'fee-on-transfer'-type tokens. -Setting the `underlyingToken` to be a fee-on-transfer token may result in improper accounting._ - -### strategyManager - -```solidity -contract IStrategyManager strategyManager -``` - -EigenLayer's StrategyManager contract - -### underlyingToken - -```solidity -contract IERC20 underlyingToken -``` - -The underlying token for shares in this Strategy - -### totalShares - -```solidity -uint256 totalShares -``` - -The total number of extant shares in this Strategy - -### onlyStrategyManager - -```solidity -modifier onlyStrategyManager() -``` - -### constructor - -```solidity -constructor(contract IStrategyManager _strategyManager, contract IERC20 _underlyingToken) public -``` - -### deposit - -```solidity -function deposit(contract IERC20 token, uint256 amount) external returns (uint256) -``` - -Used to deposit tokens into this Strategy - -_This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's -`depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well. -Note that the assumption is made that `amount` of `token` has already been transferred directly to this contract -(as performed in the StrategyManager's deposit functions). In particular, setting the `underlyingToken` of this contract -to be a fee-on-transfer token will break the assumption that the amount this contract *received* of the token is equal to -the amount that was input when the transfer was performed (i.e. the amount transferred 'out' of the depositor's balance)._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| token | contract IERC20 | is the ERC20 token being deposited | -| amount | uint256 | is the amount of token being deposited | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | newShares is the number of new shares issued at the current exchange ratio. | - -### withdraw - -```solidity -function withdraw(address depositor, contract IERC20 token, uint256 amountShares) external -``` - -Used to withdraw tokens from this Strategy, to the `depositor`'s address - -_This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's -other functions, and individual share balances are recorded in the strategyManager as well._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositor | address | is the address to receive the withdrawn funds | -| token | contract IERC20 | is the ERC20 token being transferred out | -| amountShares | uint256 | is the amount of shares being withdrawn | - -### explanation - -```solidity -function explanation() external pure returns (string) -``` - -Currently returns a brief string explaining the strategy's goal & purpose, but for more complex -strategies, may be a link to metadata that explains in more detail. - -### sharesToUnderlyingView - -```solidity -function sharesToUnderlyingView(uint256 amountShares) public pure returns (uint256) -``` - -Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. -In contrast to `sharesToUnderlying`, this function guarantees no state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountShares | uint256 | is the amount of shares to calculate its conversion into the underlying token | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of underlying tokens corresponding to the input `amountShares` | - -### sharesToUnderlying - -```solidity -function sharesToUnderlying(uint256 amountShares) public pure returns (uint256) -``` - -Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy. -In contrast to `sharesToUnderlyingView`, this function **may** make state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountShares | uint256 | is the amount of shares to calculate its conversion into the underlying token | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of underlying tokens corresponding to the input `amountShares` | - -### underlyingToSharesView - -```solidity -function underlyingToSharesView(uint256 amountUnderlying) external pure returns (uint256) -``` - -Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. -In contrast to `underlyingToShares`, this function guarantees no state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountUnderlying | uint256 | is the amount of `underlyingToken` to calculate its conversion into strategy shares | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of shares corresponding to the input `amountUnderlying` | - -### underlyingToShares - -```solidity -function underlyingToShares(uint256 amountUnderlying) external pure returns (uint256) -``` - -Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy. -In contrast to `underlyingToSharesView`, this function **may** make state modifications - -_Implementation for these functions in particular may vary significantly for different strategies_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amountUnderlying | uint256 | is the amount of `underlyingToken` to calculate its conversion into strategy shares | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The amount of shares corresponding to the input `amountUnderlying` | - -### userUnderlyingView - -```solidity -function userUnderlyingView(address user) external view returns (uint256) -``` - -convenience function for fetching the current underlying value of all of the `user`'s shares in -this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications - -### userUnderlying - -```solidity -function userUnderlying(address user) external view returns (uint256) -``` - -convenience function for fetching the current underlying value of all of the `user`'s shares in -this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications - -### shares - -```solidity -function shares(address user) public view returns (uint256) -``` - -convenience function for fetching the current total shares of `user` in this strategy, by -querying the `strategyManager` contract - diff --git a/docs/AVS-Guide.md b/docs/experimental/AVS-Guide.md similarity index 77% rename from docs/AVS-Guide.md rename to docs/experimental/AVS-Guide.md index 69eb1dd4c..373f20425 100644 --- a/docs/AVS-Guide.md +++ b/docs/experimental/AVS-Guide.md @@ -1,52 +1,70 @@ [middleware-folder-link]: https://github.com/Layr-Labs/eigenlayer-contracts/tree/master/src/contracts/middleware [middleware-guide-link]: https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/docs/AVS-Guide.md#quick-start-guide-to-build-avs-contracts # Purpose -This document aims to describe and summarize how actively validated services (AVSs) building on EigenLayer interact with the core EigenLayer protocol. Currently, this doc explains how AVS developers can use the APIs for: +This document aims to describe and summarize how actively validated services (AVSs) building on EigenLayer interact with the core EigenLayer protocol. Currently, this doc explains how AVS developers can use the current** APIs for: - enabling operators to opt-in to the AVS, -- enabling operators to withdraw stake from AVS, and +- enabling operators to opt-out (withdraw stake) from the AVS, +- enabling operators to continuously update their commitments to middlewares, and - enabling AVS to freeze operators for the purpose of slashing (the corresponding unfreeze actions are determined by the veto committee). +

+🚧 ** The Slasher contract is under active development and its interface is expected to change. We recommend writing slashing logic without integrating with the Slasher at this point in time. 🚧 +

+ We are currently in the process of implementing the API for payment flow from AVSs to operators in EigenLayer. Details of this API will be added to this document in the near future. -The following figure summarizes scope of this document: -![Doc Outline](./images/middleware_outline_doc.png) +The following figure summarizes the scope of this document: +![Doc Outline](../images/middleware_outline_doc.png) + # Introduction -In designing EigenLayer, the EigenLabs team aspired to make minimal assumptions about the structure of AVSs built on top of it. If you are getting started looking at EigenLayer's codebase, the `Slasher.sol` contains most of the logic that actually mediates the interactions between EigenLayer and AVSs. Additionally, there is a general-purpose [/middleware/ folder][middleware-folder-link], which contains code that can be extended, used directly, or consulted as a reference in building an AVS on top of EigenLayer. +In designing EigenLayer, the EigenLabs team aspired to make minimal assumptions about the structure of AVSs built on top of it. If you are getting started looking at EigenLayer's codebase, the `Slasher.sol` contains most of the logic that actually mediates the interactions between EigenLayer and AVSs. Additionally, there is a general-purpose [/middleware/ folder][middleware-folder-link], which contains code that can be extended, used directly, or consulted as a reference in building an AVS on top of EigenLayer. Note that there will be a single, EigenLayer-owned, `Slasher.sol` contract, but all the `middleware` contracts are AVS-specific and need to be deployed separately by AVS teams. ## Important Terminology - **Tasks** - A task in EigenLayer is the smallest unit of work that operators commit to perform when serving an AVS. These tasks may be associated with one or more slashing conditions applicable to the AVS. -- **Strategies** - A strategy in EigenLayer is a contract that holds staker deposits, i.e. it controls one or more restaked asset(s). At launch EigenLayer will feature only simple strategies which may hold a single token. However, EigenLayer's strategy design is flexible and open, and in the future strategies could be deployed which implement more complex logic, including DeFi integrations. -- **Quorums** - A quorum in EigenLayer is a grouping of specific kinds of stake who opt into an AVS while satisfying a particular trait. Examples of such trait could be stETH stakers or native stakers. The purpose of having a quorum is that an AVS can customize the makeup of their security offering by choosing which kinds of stake/security they would like to utilize. +- **Strategies** - A strategy in EigenLayer is a contract that holds staker deposits, i.e. it controls one or more asset(s) that can be restaked. At launch EigenLayer will feature only simple strategies which may hold a single token. However, EigenLayer's strategy design is flexible and open, and in the future strategies could be deployed which implement more complex logic, including DeFi integrations. +- **Quorums** - A quorum in EigenLayer is a grouping of specific kinds of stake who opt into an AVS while satisfying a particular trait. Examples of such traits could be stETH stakers or native stakers. The purpose of having a quorum is that an AVS can customize the makeup of their security offering by choosing which kinds of stake/security they would like to utilize. # Key Design Considerations 1. *Decomposition into "Tasks"*:
EigenLayer assumes that an AVS manages tasks that are executed over time by a registered operator. Each task is associated with the time period during which the AVS's operators' stakes are placed "at stake", i.e. potentially subject to slashing. Examples of tasks could be: - - A “DataStore” in the context of EigenDA + - Hosting and serving a “DataStore” in the context of EigenDA - Posting a state root of another blockchain for a bridge service -2. *Stake is “At Stake” on Tasks for a Finite Duration*:
- It is assumed that every task (eventually) resolves. Each operator places their stake in EigenLayer “at stake” on the tasks that they perform. In order to “release” the stake (e.g. so the operator can withdraw their funds), these tasks need to eventually resolve. It is RECOMMENDED, but not required that a predefined duration is specified in the AVS contract for each task. As a guideline, the EigenLabs team believes that the duration of a task should be aligned with the longest reasonable duration that would be acceptable for an operator to keep funds “at stake”. An AVS builder should recognize that extending the duration of a task may impose significant negative externalities on the stakers of EigenLayer, and may disincentivize stakers opting-in to serving their application. +2. *Stake is "At Stake" on Tasks for a Finite Duration*:
+ It is assumed that every task (eventually) resolves. Each operator places their stake in EigenLayer “at stake” on the tasks that they perform. In order to “release” the stake (e.g. so the operator can withdraw their funds), these tasks need to eventually resolve. It is RECOMMENDED, but not required that a predefined duration is specified in the AVS contract for each task. As a guideline, the EigenLabs team believes that the duration of a task should be aligned with the longest reasonable duration that would be acceptable for an operator to keep funds “at stake”. An AVS builder should recognize that extending the duration of a task may impose significant negative externalities on the stakers of EigenLayer, and may disincentivize operators from opting-in to serving their application (so that they can attract more delegated stake). 3. *Services Slash Only Objectively Attributable Behavior*:
- EigenLayer is built to support slashing as a result of an on-chain-checkable, objectively attributable action. An AVS SHOULD slash in EigenLayer only for such provable and attributable behavior. It is expected that operators will be very hesitant to opt-in to services that slash for other types of behavior, and other services may even choose to exclude operators who have opted-into serving one or more AVSs with such “subjective slashing conditions”, as these slashing conditions present a significant challenge for risk modeling, and may be perceived as more dangerous in general. Some examples of on-chain-checkable, objectively attributable behavior: + EigenLayer is built to support slashing as a result of an on-chain-checkable, objectively attributable action. An AVS SHOULD slash in EigenLayer only for such provable and attributable behavior. It is expected that operators will be very hesitant to opt-in to services that slash for other types of behavior, and other services may even choose to exclude operators who have opted-in to serving one or more AVSs with such “subjective slashing conditions”, as these slashing conditions present a significant challenge for risk modeling, and may be perceived as more dangerous in general. Some examples of on-chain-checkable, objectively attributable behavior: - double-signing a block in Ethereum, but NOT inactivity leak; - proofs-of-custody in EigenDA, but NOT a node ceasing to serve data; - a node in a light-node-bridge AVS signing an invalid block from another chain. 4. *Single Point-of-Interaction for Services and EigenLayer*:
- It is assumed that services have a single contract that coordinates the service’s communications sent to EigenLayer. This contract – referred to as the ServiceManager – informs EigenLayer of operator registration, updates, and deregistration, as well as signaling to EigenLayer when an operator should be slashed (frozen). An AVS has full control over how it splits the actual logic involved, but is expected to route all calls to EigenLayer through a single contract. While technically possible, an AVS SHOULD NOT use multiple contracts to interact with EigenLayer . An AVS architecture using multiple contracts to interact with EigenLayer will impose additional burden on stakers in EigenLayer when withdrawing stake. + It is assumed that services have a single contract that coordinates the service’s communications sent to EigenLayer. This contract – referred to as the ServiceManager – informs EigenLayer of operator registration, updates, and deregistration, as well as signaling to EigenLayer when an operator should be slashed (frozen). An AVS has full control over how it splits the actual logic involved, but is expected to route all calls to EigenLayer through a single contract. While technically possible, an AVS SHOULD NOT use multiple contracts to interact with EigenLayer. An AVS architecture using multiple contracts to interact with EigenLayer will impose additional burden on stakers in EigenLayer when withdrawing stake. ## Integration with EigenLayer Contracts: In this section, we will explain various API interfaces that EigenLayer provides which are essential for AVSs to integrate with EigenLayer. -### *Opting into AVS* +### *Operators Opting into AVS* In order for any EigenLayer operator to be able to opt-in to an AVS, EigenLayer provides two interfaces: `optIntoSlashing(..)` and `recordFirstStakeUpdate(..)`. The sequential flow for opting into an AVS using these functions is as follows: 1. The operator first opts into slashing by calling `Slasher.optIntoSlashing(..)`, where it has to specify the address of the AVS's ServiceManager contract in the argument. This step results in the operator giving permission to the AVS's ServiceManager contract to slash the operator via EigenLayer, if the operator is ever proven to have engaged in adversarial behavior while responding to the AVS's task. A successful call to `Slasher.optIntoSlashing(..)` emits the `OptedIntoSlashing(..)` event. 2. Next, the operator needs to register with the AVS on chain via an AVS-specific registry contract (see [this][middleware-guide-link] section for examples). To integrate with EigenLayer, the AVS's Registry contract provides a registration endpoint that calls on the AVS's `ServiceManager.recordFirstStakeUpdate(..)` which in turn calls `Slasher.recordFirstStakeUpdate(..)`. On successful execution of this function call, the event `MiddlewareTimesAdded(..)` is emitted and the operator has to start serving the tasks from the AVS. The following figure illustrates the above flow: -![Operator opting-in](./images/operator_opting.png) +![Operator opting-in](../images/operator_opting.png) + +### *Staker Delegation to an Operator: Which Opts-In to AVSs* + +A staker does not restake into AVSs. A staker delegates to an operator and it is the operator that registers for new AVSs (with the staker having option to opt-out). + +By delegating to a specific operator, stakers are implicitly agreeing to the AVSs they support. If desired, operators can pursue off-chain consensus with stakers prior to modifying their AVSs. Moreover, stakers will have a grace period to withdraw their delegation should an operator introduce an AVS that doesn't align with their objectives. This grace period is configurable on an operator level. + +### *AVS Visibility and Control* + +An AVS registration function can blacklist another AVS contract and during registration check that the operator is not registered in that AVS. Or it can check that the operator has not given permission to that AVS's service manager to slash it. + +An AVS registry contract should define quorums (eth LST quorum, erc20 quorum, etc.) and allow (or prefer) operators having a minimum amount of restaked assets in each of those quorums to register with the AVS. ### *Recording Stake Updates* EigenLayer is a dynamic system where stakers and operators are constantly adjusting amounts of stake delegated via the system. It is therefore imperative for an AVS to be aware of any changes to stake delegated to its operators. In order to facilitate this, EigenLayer offers the `Slasher.recordStakeUpdate(..)`. @@ -57,19 +75,19 @@ Let us illustrate the usage of this facility with an example: A staker has deleg - The AVS provider now is aware of the change in stake, and the staker can eventually complete their withdrawal. Refer [here](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/docs/EigenLayer-withdrawal-flow.md) for more details The following figure illustrates the above flow: -![Stake update](./images/staker_withdrawing.png) +![Stake update](../images/staker_withdrawing.png) ### *Deregistering from AVS* In order for any EigenLayer operator to be able to de-register from an AVS, EigenLayer provides the interface `Slasher.recordLastStakeUpdateAndRevokeSlashingAbility(..)`. Essentially, in order for an operator to deregister from an AVS, the operator has to call `Slasher.recordLastStakeUpdateAndRevokeSlashingAbility(..)` via the AVS's ServiceManager contract. It is important to note that the latest block number until which the operator is required to serve tasks for the service must be known by the service and included in the ServiceManager's call to `Slasher.recordLastStakeUpdateAndRevokeSlashingAbility`. The following figure illustrates the above flow in which the operator calls the `deregister(..)` function in a sample Registry contract. -![Operator deregistering](./images/operator_deregister.png) +![Operator deregistering](../images/operator_deregister.png) ### *Slashing* As mentioned above, EigenLayer is built to support slashing as a result of an on-chain-checkable, objectively attributable action. In order for an AVS to be able to slash an operator in an objective manner, the AVS needs to deploy a DisputeResolution contract which anyone can call to raise a challenge against an EigenLayer operator for its adversarial action. On successful challenge, the DisputeResolution contract calls `ServiceManager.freezeOperator(..)`; the ServiceManager in turn calls `Slasher.freezeOperator(..)` to freeze the operator in EigenLayer. EigenLayer's Slasher contract emits a `OperatorFrozen(..)` event whenever an operator is (successfully) frozen The following figure illustrates the above flow: -![Slashing](./images/slashing.png) +![Slashing](../images/slashing.png) ## Quick Start Guide to Build AVS Contracts: @@ -77,7 +95,7 @@ The EigenLayer team has built a set of reusable and extensible contracts for use - The *VoteWeigherBase contract* tracks an operator’s “weight” in a given quorum, across all strategies that are associated with that quorum. This contract also manages which strategies are in each quorum - this includes functionalities for both adding and removing strategies, as well as changing strategy weights. - The *RegistryBase contract* is a basic registry contract that can be used to track operators opted-into running an AVS. Importantly, this base registry contract assumes a maximum of two quorums, where each quorum represents an aggregation of a certain type of stake. -It’s expected that many AVSs will require a quorum of registered operators to sign on commitments. To this end, the EigenLabs team have developed a set of contracts designed to optimize the cost of checking signatures through the use of a BLS aggregate signature scheme: +Furthermore, it’s expected that many AVSs will require a quorum of registered operators to sign on commitments. To this end, the EigenLabs team has developed a set of contracts designed to optimize the cost of checking signatures through the use of a BLS aggregate signature scheme: ### BLSPublicKeyCompendium This contract allows each Ethereum address to register a unique BLS public key; a single BLSPublicKeyCompendium contract can be shared amongst all AVSs using BLS signatures.
### BLSRegistry diff --git a/docs/images/EL_delegating.png b/docs/images/EL_delegating.png index 5bc7a1eb899552b0a9f95f077c785771f323a6e4..f371009f447fc12fcb5d19bc701688cd8e8adbf1 100644 GIT binary patch literal 46920 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°jn4N60c|l-foF768(y;(ScI_*mvW2 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 literal 50925 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 diff --git a/docs/images/Staker Flow Diagrams/Complete Withdrawal as Shares.png b/docs/images/Staker Flow Diagrams/Complete Withdrawal as Shares.png new file mode 100644 index 0000000000000000000000000000000000000000..04b2633db7085ecf30370db32f535cf0b07ed9c2 GIT binary patch literal 68315 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

AJ0W1e(FbtMj5cYQ4LnlmtdCYoj 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%0DNdQ=}P__yAFMy@Q{5Hx3 zd*OFvFXFBsszFdQ04T!Bt$k79PM~hX2>Fkw?(zZO1GeqM|C5aCj>t9G+8_!iIgIFt zu<>!;f>QQFRR@*9sR|eZjgctG4Ez%XW9v zNRZiS!C4Be?)6&%@OmOOGNKPW$}T*|!kH!&l7xXfrsUjJOQ4;9MU12t2TlU*9)6gl zT@gcqF`3^Qg)DFp^(IbK4q!ld`ef=3;eWs*lGKRm`7y9HB#8wl zB*ukDfqNi`E;1*`{@b^rm!^B4gs|bq@BvTD%B~?-MRPMVaA-iY0z&ap!{92>`=S=4 zm&L`IIHJJOOS|^2-+K_!C^-;oBe;6{jmsYzh5Fsxzv|r7jC{EN)PJmG4drY;@E<6(t&8gQx&|EHSl9un;B-teGfmQ8P z&9pCk;WS}2%hYSbd)@ulU*%2-i{#hYWA;K&hmTR&u~3$pk1<8ZobOYu$;^W;?~Bil zY4Fi^b+<4&q$?zUPWU|h>BpSW>_xxv6rAZPp53S~H0W@n$y~Uw2Pc>O$~^k8 zLkmC0#~W}pQxdfrN^z2>0f>&Xp#<(sRD$xzYa*Np>P>kQyeLTB%&?5IkBlKe2z8eV zidkF=G0PpcI0{LX0t}7__du<9Yo#WV)_cbk^$uy5BiJ{lXb{&${Xwf(36BD{4XbI& zVa%jPSB1?*vL|3$B0(WIpZi8f_xtx@$Q}wAKo8`w!^WAC_0~514N<$*dkv)_X9fU& z-e)t+L7+{|hTU5vD+-n>P<*Dh>L4H`AO)7FRjgL3DY!=>=mzZrtZG*AHX{)W;r~I( zLOnRN{$YUil|)p5EebD7NSC!25U_6ao;_a7MteYx0xzv~McM;t;n6M-Q8s|}Ps7vW z9ZvIOWK0jiK~P$YT74wpS0q>)@YtHE@g(BFMH5E00@^T93Zn7Hl|-fu;4##UHzGlT zs7yOyV;hn$^LDqdJ6`L1OPvO*oHtB4>0H#JBl9GjX)027=s%XxJVBeL*cq>l{-UtFHmYl-(NQA=HvQ$l%75Yqd8(zC=kF)+{W@mhF1x|lY+$P z;?N;Mz)O^UNP1M%o6s? zoX2?tAN1v;-&WFiY{6?C3t1U8yz$7S?iDyEKFyTF~GaNpS;#CFs!0EZHp z_XN=zDhvo;2@sDX9VT$ugvP2$$aU#}AR&3`npGgy>kABT@swi%P>kLKRfIef!4P|} zPD%HVCkNqIIc`?MzoIqC_95xv6j&1^#1RK(Hp^&VAJv|==V5lm-ltl(6PtwR99lt$ z@Kw<=-j`d3YHCf@`$PT4%{c4GQUv(GE*TR~N&rfdRkF$Q5rV^_q#Q-?hKXZq8Q`FN z%K}pm+fvp6C2m9MQfB2?>S%%U7N=PrhJy6~V~qwzzjrGK{_{g8%1- zQxxcu$agPa31yN(()5il_K5V@i2HSd>QCYGPJa)^a}I*4tM!A#zFhK6)8K zMly}yK)}9jQk(Gf$TmdXVZAV;`N;iypyu(wv|E(M6C(*(YhPb&H*3vnv2i%+1CER0 z6Lu@JnWt1L_-R9Qpgw_+4A>My~qA)N%Xc-|O z1Hn(Z+S$xxk#t6jbZ_XX?zeK+GAl7yA~BAngNvlTWQYi}N0drJbP6QefE36a0#7^0 z)u3nO^M6H0Xq1VpBU`)ST){d-&egk;mU*pM)Cx#>*m|hzg9dI>5I6 zVDiYv7yl6|HBK({f4LFWZ z7B_Cxqj7?>QZ}pk@ytR*XDkG0!V;^9>!bYKN$ zDg5E*R}2-@f8PgQ(MhB;#)0$n$~)qpqU0W}4<3sN#6PYDq( zmv6ECEJCVB;ibNVxhDLGGL~x~1Do(~5N|LZzaN@1By9rw2LN~N#oKNJ)D&>D%K;^k z1%`R=6`kHWjxD91J-MD?!u18{mXLheo~*$)F*{47+-QWLc%Vl$Y09O+Sg((suOVFh zQTOCQ7_p)AR8mxq8`Asp$^Vb;T^hW;kIeQ~j>|d^)&5YTMMu*|25PW5(&qhpcgwpY zA;%bm)aC;$a79MO2bfsyS`hIeus4iRc?b6r&KI~O#Hj%>9efa*ZVqe#B-%gS=UA`_ z-<2j486oF03>GpF8<~80rY!*cJ_+m-j0fN#ui*Nx#BoTvD0bJG;3t2CZiA?TUJmMj z9^COHz#q`#p4CUTKbxpQ-xPe$Fio0%F&)lSt;~zmXt-b#+~ChA3?9@io8*>B2n`k; z#54VznGnk@EG&>9E(9G^;nTA7=iOyU->u7_6>F+_e&Ra<-==`Uz65^;mXVaKVCOA}TaQIh+uouhWE(AaZ$*xBIJ!!zUzSIrb zm=ooqqQPJL=AhSgJvKR%kNENa_5y3L8TEUVviMNC$bnJ-%NQ)0m*l*JrHTyIyRTor z-q)*=w}0zV<0~nc$+Eck)D>l)Rdgvt*krEAe_Pq>G2x@%%OAT9 zwgIBtgtAOp|e>e(`0DD(3HBCHs z`Pm+{`&bV5aSM|yN;FY`DMeY6wNeRljhvTmXg^38BZ-J zY@)TYDnaoK84(&uZ&U<1sKznA;3Guyn~RU2;q=DuP3Vu6KcxrVJJ*6)mm+mdOzpF#akYL)c zJDt+vKWvlYR(xCbXLne{ONK9Xamyy-Xf(m48 zlJ<}_LNljmqnMb!e7$-I2daD}F>JvGO8S+V8E6U>n0%8uXtmb8H7%Lun+_*#CrHcT zqZH=vK3SX(!|OfSr+W?_+*ZY0+njFj0Tp|vm7ad{dTEp$X$C-z4-qVsh6KT?u}xesHp+H z3cS9OdlrkBYn%qba1KAFkDpfbx-PR}F^CEP9es$;&8x!?yMOk}aIQebPV{J?K|Ua( z1ZHK&0MjIENN716#pSrx> zn@mXu%6|!gO|TDcrt!6d&>BlG{Fh5eM;PkAI}?|o2S%MS(EEuxviK0p)}RX-;Saof%NJ>G_tI|o#?1eK&Ht>| zr|<_4$QFUy!AB)QC}GNG!Q-{PGlg(g{gqN<3~7C-}w*m zGmGFK67hu@S}?TSarav7O}Bxzf&{ICN&p8+W;2KG*aA6FA6Abkiii^{HGi;)i6xFm zH-RIrjYHipcI{gLl-uA3gt9KZMjjnum|Q0L6>+tas9^Aeq7xFxKEcZH#%V_iJXBI1 z%d*eWKgEG@B!(OuCf2x1VPv@z6ckii@c7U*dFY%`g`rL%19JzBXXo9e85mgzo6(4{v>$@fgu+0(WTg+oJSWaC8vwflM}mK;tA+XX1!VDqrl( z)`M3+56^;2pjz6dl>Xozt(WW_tyHmX!Zdk|3`Y|4?)HT%C&@VX^!Z;EwRO3D-K+1w zaz0my=hIl*o=WP@F*LE*$KJBzS_iRRKK@tm11u#Ycxa3L0f#8IB zW+aV~_^QFZgNsGR*iwN~1@e4w05t()diPyff#h%E1_H$gdV%{ud({62S-zz4vL2@^ zdUAvbDq=Adz>|%W4AKNbl!IJVamj=ONCe7zAp20zGNL9S4l2C<2N*kr<^!^mzpoM& zD68`xIEm;`_(4C?So8;Lz;Pg4kAkFKMb+uiLDh#T77AI-wVbXb6RQ#KR46X7n~BdG zN7VnkJ%kMc41?LBexzfY0GS`QxatiNEXKE!5f?=AftwowA(AYHQxZycXbX-_ND=e~ zN(usrL-&p>vG*ujN#+<)@k8R$jll9A_`ZPM&^kLiWAE%Z?zT)dypN$0W66nh2-~+1 z{RN!iPj%DK1w#sk;N^OSvs@03ws~D=7a|zNz34y^5wt(AWZ&?5KsKS`VnMR79+8+4 z*ypg&tyh*EjU0NYiP{zJ*^(J{06k=H{DoVap5HQ9=oxP>IKwo-;XY}C`xfizTxYfp z&PgEJkTqC9;|b?6ydYDT564- zz(0VA3`x-GS#gkwm&6%~f1-f*g^5B)DR}zzDk8e$apK|&?$Ev`^wXu`C<%0-sLlIx z4&>unZWDD?u8qwHv??otvFxXzIPt|@3RZ-V9{JDphBu3VTJ9%%5Dz+(`qo18w_c@Z zFVtT>wXkuE)lK%2eV;p{|66rGp9izFv1YGRX?&>GE^2m_Nk#_C8Kgl(ps|o2y^3_yCE?jXl+hb9^Y>bS(!i|<s}&@xsqe5O)q98kJ$#-5qmY_Itq~=%$6+ACUUx!u=FAJ6<+m#mN(0 zzp*GV6hjv6%TEXxiL)N!rEZkhWSl$hlbW~P3Gwm7=K!1{$uBvPR5y?elH5fU_h_02 zaitI~I95{lLMKTrK)>II(BxaUUOdqzaEJ(Y4(3qFVtwGfnqh|`kzy)%^>{4u+kjlh zLWWa41halWeg{cihGR~uX)%^3(MyN$Z0Lp6kgT!$1OtP>30(J4j3*tpAzUuJXu$sx zh9qY*pHsrUNLoRR^udHXBKa_T8+kV^z3F)Yf)GfsAPze+WiC2;zu{*o8i;S?uZN6B z&nV>JmlJRUAs|?H_bbrXkpVL-?VlJDZw*o`8}3Ux_)i(zlJW=eWZ~~$X>cf#iJo|c z13I%nu28d)Vv{tMXj42cPR2IX&leJ>G12#RINNXRdYc*lVfzN#l&P2hxW72C_XPGZO>&De6f)cSJnWm`$Hv%4j|1Xh#PBD%6Z$2Z@R zPd=5E4u&MjeD-Sp)!gp}y3d}O>0H&#@-zEdqi?AD0p$UVlr1?&aabb10`QDxsb1Cy z3F*XCz&m}ot{3!adt4HI8Kf~P$_w|Uo*Pu=stoL&GK z<{Zk0-w4ocQgtzIQ3=iGWTF+H$QZhw7g+8hk8h$On>w)6d(hU^pQKmHUnj!4R7xot zFv2d~k;qS7KgQ;<{Ak0e^YhT^h1%vpCWiF63QsC($fz|;yKuj#)?=O%H3S)2@zcj^ z8FH7DG^C}9VwcsAG({++%I0;q?BU^&XPQJnOaGcYYQ0vp%2@H`m@)*8uSJRSw z+OZFui$58?Ukwvrj%NwmA7F>5!3oGSD)&qm?fHM}jSuH*3ixpKB1oE`el1&9QKu2i zpKLRXxIu+!))xKVc$czh*R-FF$;-uVcC@P}G$c9auJme~i-Bz-Qs_`F98^ z%Va#q?9|n!$8m*MAK+Ycx}|QMSRSA@&`av~_6ItibyC5Ph|$jZ+k>CiFF zpy&BdaEd+QdPb#{m6dTR*9|nzoxjr*P~beDskFT$rB@i_1c@>O$95ZPVUo)V^D|-! za0HNP_MVgYc?=S(@p4C%Re`Dj4a)=OjfF+4u|-Q;Zf1|L9a%Zul<3?@`AU&mMbMdH z+lv!XH5z%F4DP=7_vGGCyvOG*Eh9Dc3?sv`uw0bDo+_hkg_az%+%T;l%5ATd+}y+N z>9(#(!l(=B=5pKI1}R5Yk$Tq{>t@0h5-b>V@GP5uXg27bH5j|}-Nq&@`_6_*pO7=N zBhr&wIb>`%($Hv0?joUMRVY4HQA?$l?{2b=uF30VA!Q92@dga) zBqTsscso!&V$T~LmAk%W8AFX*Q$&vIFhS&3QejrUFzJQb_xT&vSsU7_3OMo{EFt~&(C&>8 zGtX%`yT23TKRtGZF5pynXDR*}Fbw>S!YrGfNZLOC)LRHmFLZtQ3cQtaZm1jn_MBv% z2gb9V!1zVijkX@(Ap7%UlPX=&w!kIOpnJvr9{`5IS_*mB*@s+`?yDsu>GFP?uYDDt zhwf=vhP*!(V?}Q3)~^?2@g<3K2gJm}2-riG=d>E<$z-8RKZaD0W>53AR5W@)v{LVZTsIlR98~cJVK}WDUj`By2BPsNw!k!?ZO}_ zpo&_E{ULG;$Ep64x%t&KQ@d({pqX_0Gph$Z4lLM^kgR;O1(0WfPBzG<5X3vWFE4-p zTG#7B1VBaaOF6cag^W7$unoCbn@fe60JrjN0erZQOoxl(n2!8ten9TLwj=|`)PP(W ze{ZNL?_j1@lHYqW5sB|P!Gn=8@E^PfZ$AiqvToY?R&IQEX3qIiue3y1`R_tkYpQ<26Z^frTH4q(W@iHBh7^q6dqd>g+(sYU;4-=f1Vjr= z(qeSbbtuu%{vTx7r0lI_Dm7U~zqK8+?0@Ke`InPxih9jD{rz7tH7cyN*?Muut01XM zMZzw`zIYJK8M=?Nj-dV^JqAQ-&u{`G0uxyW73lpJQOaRLV)x$N&>UxY8GsCH8U?(=%49 zm;imB-tMXUf+<&@Yg{{|?2XMD@57IDX0gcBH?yYq%|KoUQru*1am7 zSn`k9Q@~8E?2K z_)vlp|AWCI_;4mg_YeIyL-`293+_PplOMc_7D8PQ@b#vcZnjsJ4@dbfA-tE5q?PXT5odFYxxQ(xp3UefN+39<5>3<`~c_b z4em0^ZoO~nJ&GhCkMU;V|(=-Zg+a0L0Bjdr|}qt?%VZyWVbbOsc=j#w+=&vTG6uWNr}t@86A`J=aww!W^k z6rb+gdM#|rDIbMPsTJdP^J)lpl31!p__n>5T(j;KP2+SA@Z?aecp~g zN;y1gMy&dA65m*zhqAz7e3W;1ZyVnAQR`XN9)%EX@J$&_<|6B-O zWhy=j1FK^e1M)oOHa5ofh*B)SJbDh_tSUA~?-GR)2H+{f1c3=C?=Oqhl;wG0j=DJK z-)C%KWT7fw-Rs|bI!UWqKMY@iB4*QucMop#FMnl8I=P+GcrGS??FnE)_z)X7ELAde z4V`;cj_z*DIV0&2QWJ76l=tNn$vP#6uRdnN;4pgGQh;d9lbET=b|n^h$Wl!{1H7>= zq{#wzz7?31^OtR>HeR}t?8!BGO4vgD@%XV=uWhnnXL0de&b8zEaV8v(-sPzMEDyy% z?Gpbk+(6$S!o~y_8vwW~yhaY>Ji zdFwso1=sCvX#Un;NBdFUF=KoAW91}SEi$eR;0tB`_K3J!T(bSfO&v0P;b&RdH*hG6 zBL@H&9?mMn0`Tuv^W{}?+4(~Cs-Tj~z%gWt6B#p9Z~^jrA^1oF+WADvv59BsG4{1< zEtrb;pmJMq1pyMsu68{2(=_#*ZWPxaem|kw>F@j0O|Xz=iPBlINrm$SgRv5SRD*G@ zd;&hkhKq*K-5!yY#0QtX`n>&=#WfKzOR9%l#jlz)jSzK6K}ZOAU@6ebs+RiP<2y1h zFo~VRS1fjQ@vh*#ZJeP{n^5>RsVOj+;K$?zCcUsLNX zE(y92Zp;zS3KOF;&)JcomS)3;PkshI#cy22xcVfY(5bin{Eh;Kc{AwZr?|5SY>y@u zHv*_(q8THV7W;9xE@`N#(HE0sCKOt@;Rq)H`|v|_Pv1vw{u&&tzyT(Ul>{n~uc) z5z|C+n1E%HIoo8~2B?0Ll8&FZz~$M(vrqHaBVXt1iUB*U?w^`W3h6Jxq5BrpB_)c~ zx9DL6>)DJKy-A$)0M*a+AOTB&+?@}(F1>4`7@^l3oOYj8_|!;%BNKy3Bj zk$4ePc^NYaprt3eJ|F`6^b5F%FrLgCSd@tvD>RAdw$C8Mni1Z7HKO$mF%gebN zDkUzyUwduMDn9l%+lFKFyP!lN;19tQi71vNWkAnhJ=uGTsH0#+89QnY3QWR%MGE~A zNy-gi5x$F}*F^j=X4fVha!mhnh(0Qjx0r9^mxszOSK2W0Cn<&uT)Oge>X>f$bsd?=V7mw(2AsTPPy|Xh^R{Hf zE>jQ;3eErU6u|chyZ|zH7*Q|**ok0NI3}&zOQ1p| zMkavpqHt?iX4s<^#@y-B3kQk53yfp-v1brtPG446iL5>Lb7i|tC}z{EF(rYI-V-^Yid8wD985}}(5-K;;Lj<=&h1c>8-~se7holwHfRMtwE^|EKD&DM*LzA~yZ82UznGG(4ON=ezCov{N)F_q1`nGBBX~iN0h$ z!@2MNVUoEBy#ipL?a*UDV3RQnhTe@6y;Q=qUHx%!0-hJ{kaA+uAQ`2Ar!AKd@8$`-z4+awdZmj-qPK(0iYf1-%-9&GtCIT& zMTQ-o^p0-E@+i+Sqeqz8Z9ww~w>e z+zIpC6?7)PEtb!KZ+&9{aE&xYPA;ys>go+kbMw>FCaCFgKJD$A6ukYh?ASMDmmJpc zfZcwV)MLs}Shm6x((y;BlU{Ce;K!{j=9QwMSNJmfB%`;$zla8={kFCuS1qcAHpRrd zi4$m((SmP<4+LR5a+z(T9dDUEOFdvmL{muJjjsb}mkjCxKa}3~%SMvS$9! z`oPba7#+A-kdv!O`ho)#0cDaVQf33?gE>QKyp8yr6wF&>w=dkcamI1USmN zjnIsu(KdKvbLCFOHSx#9wY&%?DbO!ka@&v&61q{`r4P_{;xVbo%D$%xnuSWAa2=3D z$>FjgF+Nxd$siJmtP{|$7ydRB6JVirk&Lc?bJ~rcykRUu3`i3A5MYoza;?6nzA`8_ zOZ0UANWUe9vTdhXO&GbWP|)J-hHpvM{(C?^r@^Mphdc&F4E5BFB$Jm2F(Nz(+^>Y} zgS-)^cq0N6V;l!}#5nYBBsCO(ZsIS)LPo90;Lr}aj0w_D2v-QyXcB10c6#~`5V$UY z1hN|Ojt#}7NJI-5@Wuj3H0euGAz9h)4vI#}fl8`UIIt1Ww04sC?uhmwJsy z#9*u)PX0LEGYmJ5#THwxOFj_$a^*%izioO%U6To!|ar_#IA4F^2A>)NuR@+Bq_jL|rM z;daKkf)MPY!2);>-k(%ok#t*LIMb zS-x|8)nKbfk#42?QsGJcX!CZp{Ez>6J|1&EXBc!NS?1P;&9Rvc4?h@A+Rd*!k^D8= z{+nIX{T*^$ewV7h85?9T>J7U&mM_P-PCIA(THoB~o={AEp(@}oOY^l&1GQm&5g8>S z)&ozxS9X$_0eP2-YBly707tkoI+kRx>wG(70O>(1!C6374QZ$1xpPmNdctTz%QOP)`?Im9W=40~#I%RjhdPJcsFSuX%JHO+-5gah>2qdN z^dt{!?rzFr#*E?EOqQ}QdOSJi4Y8YIkF86nu3AskRcjaULh_@-y!U+ML?6SO!=tJR z&o^5KG(3n2l-3CvykT|0s$_L4%-D=aD6-<=-nK}|TOy^5&nZ5YoMwO2e4{2YR=R(> ztC;hZeBV;w>)|psqsw2mBvi}IjIs<{B~+KiHLQNvDXK6r9H?Hy*qE=7oNf*dV9yCNiLszeTz^^6%!h zGjQr{`#CcGT??ZPg`iIbs)ndMj8ftVR(9Fx@MI1>=H!d)Eey{^wOMRy+Q zc-QYXpJ2|Sit>CMeE0y>1#t`a`|0%hI}a=9JrjB?6E7W1ADsN7am0xIk2puhcjrNh z>1Ls|-GkBkx~CVZE!OjfoDp>%&gxn{+!Gazb$5nC)7UjEpdICU4W*`kAbamZZmW-`KtO z(r_r-Xt%rTuO?-xV{hYTMQT2o z8ws*S+53!uB3;)yv;^DY51PIOwZCNNb)~hp0ccmK7W>%!_O^^ozWlyizeJaQ?6@yK z##L$9yp->#DfB|zuwh=&5IRy}5CoIpUVPt&EG+nhzzekNq_x9G>1@ zKRo4;&A6lE&;F~r&nZ3X)l^1G<{I`77S8SWxki19U!eEKrj5(v4eaC2=lu9M?Lz@( zYshOBe$eo7DR{j8;Ny>%M_+CIu8(EG8?EMzQU^_pU)28{WV9SKp64IBJ!T2_-<#&M zGx&+mkwwL&GVacbuZ@hn&I&VEqUbp+T>li>3Hk{h&YB!d*KC=4yMuj6qw=`zqS$99 zbzXk%;A^krtE#Fjhv=Q{SFOxy&c2?Vogfz#MZ4OY`^_Eq+{{%ag2G0miie8LLVpJi z>0a7(v!3tjQBAXxp`B70xOV0=zE&A%d|W6$b|;le!>{{`5n z$vr9i*s@tqfq9Rp!SK)CJ0-8#Ux$v}8tJ{QwJ9}VWR6MDE;IgW`30%-Qt6fYCGLB( zq?&`8jd#`5M5igKs8eO@eH!BC-p^fm$Lp01Roe%9;a7k5glL7No-bIZzMy^KbI*Q? z5s8-(2cAYBaTwfIeZ{Hu-Yb_M!`)-OrR6_1^oG(qyt#Cc?EqV%St7mmQyPn`nA-W` zAnT0wCmj~8KUf>8DMt0H|U!A0PoZSk*mEH&{B21Q-_bJ(>?jKb;lk5cwC5!01l1}-16 z3vj){;I4YUetPp+`q(G$797VL^RJ$Ca~g7AtCJ!dFAcQ7hJy3vIrHz$dsDj4$7FRy z*2mksn_jLgrKTJAUY!?az9}a%8eaV>vpGbGR=U3~ypC&Wxx~$U{O2DRaZ}ba#!+>p zIo|BQ^F`erpGrvHnce$`d*()?r|pvXryoDp1&pnHGZ|ev()`@spDo?#c#i#QV)1yk z>HE71Md!pX7CE0LI90rMC|5C`FBk8gdwjmoFWmmCWKuc4ESo5B=2?J?tiS~T1Z1#1 z7Y`3{&L(}pGeHrT@gAOLM2Flh?8_CS?5>cS@F_qo}h zFMnShRcmV6{OWp#JV5hpvV3Jw??M+vbXBKcWG3$x{`@nGGn9Jlu@5#HfXYB=Z$DZX=?;5RepPZj_Uqd zPuw%dKD;51yjXO7*p@U!0mo)#fiL*A%W1rBfNkgJCrurKn7*X+dpDZ)#?nVb7Fiv& zrwgV0@%b6Y?nhs`2l%IHm)qT4C7uX9ym9G6F+H{0$dk2t`zoIZ7Zuz(_OMxcF>28E zZlqKS)#{VNGWVfOfiMU=P4uhwra@;RGc$C0)sM&eX*7Y4IT`+hsRAO;1-^ju&}%G*5k} zjU6kGO9`tzGw<(Lnd;#*#UsaUm41G*tZ3`lu~pCFs@^28Of0bXa;?so9hnuEg_-5%-kP zDKn4Pms&*jb=Y|99m=G5F*>n>qQu=r1xFTsDl2>{nlgAw_RiV3jX^_!P515 zf8SCbb$8CGo%$t*a|B9s{yd*?U)kXzb?(TH?d1_Fhi@Mf&!H3HI^xmOVc2b05gy(a zL`OHX_VJeJi?e|y%fEZlTuRKD-A5#8JkmnmCV8fcdYWF@Wwn#fBv*FwC#bL)B979^a;iLis$Q8?{gM)n;xBs+p1!R}mp#&Y^_H z%YO<|xF+Xg{o?e}wzZ0<{KunW820^W^~~xm%35*u{)*AHzuogaR@e_*n5pZcIKsH& zV_cB?x;TsB-*pDLo{QJ!Kc(qxV9Ts$In5*Q@<*`GJga~He9xxgrU0HpRFn%{kIs`n zYKJ^MsO=YQ&P$Ec6l--S20GjtCYw7$m*?MpjZ{5Y++|I1q_u6jQ*cxQlZe0H)Qf+w zN^PtTq-k9qo3ujPe>xdK2}YmjO<7LwlC&;=Gx9FA_SJQL#+(+_x@fuKslrQnmv!IL zoN-$Yy+YeO`924OV754P7n9ntaw%>&ok0iacH=%gBXBt<1yGKY6U3`js2(Oi3qTMy4B7i95p!>NG-8A9$Yb?DD8YG>(gy4>Y+GvcPj{N%JLi)g-+ zXyCnmZB-soy_*$gZ9*R(sC~&;OQCj3{^fW-x0*udyJ{ovvq_vEB4rl5(kOOG+ef{T zQP)UTrnd8rE4iC9lIKOElz z28|EtQvN-bsk0^`Q3unw?_h44tWU4tHM)|NFWiYcHev0qFR_%CYj`-jFp(P=@Hoeh zDtRy4Zo3cJ0cFPAPqkZzQ#bQ)$wFo9gEc zj2+k#cH5SdpZh+(8HIdk@It@y#^3Z2ncH```isw|W#9V4_KW&>Y4*qUIlFN}yuUZz zd`m(yP<(T2-U0W>Ncxa7>Bo1THXj)g+uA-aBRn+gaHgp#y<`Y`A>`s4dp+OAJ<~LV zp=bGfcyJf1C7%Jf2YpCJbl}D-4|x3cqnB>9beZ@MUtKvpebh$v6rg}pE?Od8SuHYE zpBb;5E5el;`!MECk?!N6;w%3JEIkAr^{CC)sWbYm->aET^7B_+SKWT@_8gN1B2btTSQBt-_y$CT{Y@smcLP{&-sVL_V{JBxO|OqsD_kPTB^ z=Sk_YDIn5JQJ2BQJjb9@6jxzb?O9)AhR*HhqId1+NZb50cTMVCB74K}GoBt+Mi@PL zy<@O9SHC7-qOs)s-e1%@ujU->t?k}7f2O9e*IVy$tRs7OTSvxUUlK}kU2Ja5`MxV|A^Vq`3l$MiD|p!uIbI>5(59a)%F-0&*1XNQe5P;Q{mP( z^~y>>V{g_!;H2h|oBRx3n=l%n%93pOIB5w-Qf>O)R0R58&9nhJS`N#-qhtHab}&TO z?B$qB`HJ&fqr z&_}B734-H=?d$Y-6(kR*mEYY+MZwbcc5_#dvqalVi>!9o{a5xy9`vaH`0K^wJAT=_ zR1QTdXNJW^-8)n-DYMeAf7RD_G5U(8&<2mR!+k7EqcqE|Qi~3kdCh}fWnWO%k7hY=NQJ z3rrmB_C3BkWXu4t(H+M}OO|cT{F{0<1mE-?9N|%lm8+cF4ZalHLl&H-0Y;ip&=(tj zi0NZy2uxY9wzj)8pl~vB=EL|1O^N+6!KFnJd&`^aTxX_T>4yaNzmD_|eU?iVC9*(G z!Q-;Pe{|I-4ONiO`o_y*E$c!l@z%=0Pvv7AkgO&@!E+EI72Ry)d>@Jr_{(?0M_3CE zCS!W4r4{xOd5G4){4AZkZj3Q72#S(}n+>XTk}d#&Ze@iglk}B$7xrS=Lm!S03^MWF zi;bX^ttVL+m^sx6;KHH&+Va>WEx(cmosM(U*8B4JLp=l4PG8#|`{aF(wO(V&AuLFa zAHLZ$?!_F#^D+BGHZHecI*=J)5L5iq{&*HGhhHXeCX%K|#!n1qgQ5`yUsAl#OAA@f z^!Fj6L%)i+0vI_lH&^k`v;uoC zF_vEz%XV3`BKf}l-e)cl4aLL$N1>sgsq!EbSOzm7{5-Mw8Q+R_3R__?PHnohl-V+& zOrEV*gMz#Te``|>Wp(s-6r?pKKSQ}&hKkTv<_ ztaR%XV04mFjnCg_ky%pr-NSKY=LeF|KX%9&}CZDH|gB6E2)*8>_+-vxKE@C_lk`NM_hXJMX zBL=6|uK6B3LK|-AaWoRhFxYF z6%vyLmpT;EzD@!CJp(@z$ZCRl=Va)mW;5%9It~PaN5{T;EA;8{KtlIy-(HIU$Esrx zwj(l#31pElew8H^Cj}Jg&mfAUAQ6l3N?3#2f^3xJAR^m;el!%OmELOJ*hCO(pl7@h zDall2;!Kns!H~Z}sv*0f?WJ~l%TF;H1B!N_s6EG zNs9saSa1XuA~EiPT+7*SZ)=+bvn=rdE=rDJEfaKF<>5XKe*Wq=g+OcJ5*dhk#|}dX zelhBF;+KV(Le62KXyaGV)dvn7_%Zu?$!TE~!ijkNQLwCT!;Iz=K)M}~WI^JUz(II` zY!n7%1F{yBSt4w7pv)MtEAYvNNasaY2P9!_M0eL@7vP)N&N>=-@kiHG5OHHl? z0aw5?k*1w03oD)DT#LnRTU%-o|5p&=Umwkn=OQW_95bUf1XL{OQ%DGnu+m&k{VKvj z=-%kk3-20BDZ@>nMKKraa9)$FbaXd|-#(bYFj$mK!$49200)fA#`n^(dh%oLqARjz zB@Wo%x>fZ}a;yu2BV|}tkHA_%1}9u9_anokkdi^hqv2(fsR{tvDK8L?=ZS=V2)$edTG!A*XBNu?lW1CTg`%f2>DW(SWnuhhrV1;N3-Hu^b%g{U5>W3PVggdLDfl0?9H_3Z;x&dy6xtC<+AQi-M; z0Sx-af+Md?YsKq&p)SB*UjU& zg%1`R+5EH^+?=5h>*IbY1M_Ks=@KX7BSd>?s*_vfJf(Znw}8JLd5As zvSlGhfDU^Kt|^!<))&JfNL&{3^6QWR*$aQlyP}mD*84mSTy8LnAA$A&Q#hTvX9EzR z16g!GeEM-9xyi6yED;iCiB!vn!(Dr_rn9iLVfRK@&3$YcbnN_E`&a(n4Z-_>=Ryf5 z8>S5zI0pi@_c90Z|37@acRbhq`~R(>q0S~PMN6q@>1@$XdnrUqAyPXD+-~3TInUz#e!ZU0V>}*@<8gHIZ1L;V zGpo1v+P8L@Q!9K76O8XNyGr3HNSn^X@Wij8J9HpgbR#&APVo7lwkj8LqEj zRgcmSS7(i_#V7*?(B0f zeEE2w)%@t|9lg%mPtNFIFHig5J*5(8Htx_p|S|28?5NIHzw4k#tw$JhMnho;n$ug8w0qW$I97aDv28MA=9|@YyLGGAwyl51jBBy61=r0m)9c^CON5;YSWGb+Hy8=u5iz~t(_?=oE9}G>)Ml-fX9Xh^V11@8`SZ~%6GP6J zM0Lgavlm}jXju~VMeJk-+hr<1>P`&a_3gDt60EHY8qNq-MSZ}G7EzplE}Q{J^}i`3+O{{6Y4X4S7%-8=`3^K)vS4hJ1#0t?*m%Sx~CXN9uL5sEyQ z`M+Poo$y>HoToYjX)IY$xbEl+A{Vxc(}MK^V9CVVQ6e60$J|E?SY$ZEulNw*dDXI6&vc;risp`m5 zjz2#caWqwW8y=%hWP{g5LSx4?wn}b}h*)`Hz}47T9rj#qsw$l*H3a&dGq@5E8r~z@ zTucS@E4a_`&QJ*xv^IvS4Z729TZ><7BU+hxl7&^A%HPs5`THtMgqCxFfl!~(Cbfhv;9?g$R8Qae%epgP)R7pN#UoSm7 z?@^k41v=qEZh6$lX*)ExtsmOMXBXnI>?>8wb)u(|p;K3N7uo?f(P$*Ch0{iZRFE|# zA7)?v=aIu34l;Jk+tZM zwSD6Af?u(m{d!bI8u*8!_1_m9JY%~OzHaB*ynXwYk?)F|y6x4{ImRy;Wvq8)KBK=t z*&9CO;@E!#dxHGow>qe*K6I~B@8hd0{g|`vNjjt;L<@CD&-r3VV^^5^RHmU75UYwf z*I>5kNCm@)b}11`NnOWpQZ#B*{~Z+oMI$$NxnFR_a9uC7i~HT$w+~3}vRci@M5&9X zKj*^49=i}S`g3^mHp~1BOluLLcQ@=YvbFngUzL~{}wT3)`-sE z2OEIgg$Cwb&wW}Qbt_>MqYB(fv?@w#dMQ@9|{LJC;aupQTRS%C`nW7=c_*iAl+SBDZ zzV>u^?%D-RU26Ap0^z=#f1#%*fr+oDAt;Sh}9yzI&gOls0BKN0K z3|rGEWS`vr?zFd>O)=YQu-GIvqgKjoaXKnD)M{ZJ#=U+24xT76xY2a4C{knL}or(O8wDUo+C;dq+js*Wp@YK# zD6N}Xz7+_Jq_y^5dx7h&gAq&8Kc)^Extn%( zWhcdaLl!K_F%ATV=|JobJwMZQ0Vf89MUplBgzYQ&oJWYBQr4JR@>dE(`5XS!~1z!VG z)^5^|@Gz`jr9bU^hVn2WA%R7hUQ^E{5s8d?5*|<49urPTD<;ZDhW8X&bm%aJ#or`Ts+?Bs+y9yr5yi4` z1&-1x8pgWL9jAzH%QSeF-xFPeS}0Q4OSnx*Uve(exV~b8(%VOtcib~#>Rxn2P#5L!iq;l3k4S|EFgjwW4>F@}1es-r_RNmPgs2#cO*Q z6OT5UVeI&b0I@cBddiQ8Y=#l-l^E=YzPSqISNRW+|P-5!;_NcOOK6=V17UZ@EP z9nLp<{Gld7w$=niBh#9ka;YkrxXNEYcR!62FC&SK7vemP*j6vX-k1(72jw3!_WrE5 z#UEKPI%eS%WL-I|Zs+fP8@bC!9$gE4^{!;g2c=gz%Ix;}@N(Y$fpsD&r7-H$Grk~%$W^|}Gn)EG_VbZ${wQ-w7_dN24g_~eG$1yVf%f?vaS;atv zz;Uy0$Jeb19PEFzO~1v-)!81CcNq=WGkCD4nzPTyxUDeuzCk=D;Xc}>{~ zRuR%j7iA`&+fb{g_GJCi)(fIKHY*F*70<<%si2%C2-UvH(rIPo`nPCyGYQ+HW0ZcJ zFE;uA1u2-m;PHE|9c$#1ENB2z27MIJ+*#sbklyAsMPv@!a^7KLmd8^NGXxO~qsB)o z?POM0{T2hK^LD9|t(X80Aktvf5V=B!1#iq21X>@hF&SsO?{>we0|{Eh&!ZD8%`O z_VNDDf1@4q9!xvbe>3wF3R02tS%WOJP`ierxD_)Q6r!9IfBRbkzyrLb{~jW1TG-Sr z@@~-V9y5+iLRCz6!WMZiz_RZtI%%?ryQuRv?a8gOcWBM5UnuE(nsmqf*2QcmQ)v2G z$9?n029Y*@Y&N}#*)qq$dcZm5X0s2Pq}mLAU#!;cYkAqk6OWE8TVAuPUe&ss`b{04 zzJ;1k*s4E%{4Cr^hW{I$`l-`IUrFD_xhqsg(u1`~Oy)~}EiW%1diLzyTZx$@tdE?3y1U6UXBHsXmE{DkEG1@X zvkxfWw+}uu<%~EKJnAF>K3hp-@fA01F+Fm+Ye=Y)p6wmIbLV|40M-;fXRR&i8}shn zVhn035dD60tpenVtUiLdmhm|zS?4ZtmWE&KYB)JV9X~XZgY)>bOKdKuauN0<)Tr8%LB) z#A4{lvJdDbt#5BpWW$Q7Se$x;V>#la!=2iSize>6624q7x(Rb24Fy!>M|lv8lyL`^ zvWp&D6?UEB+tmT%9SKn~Fj7~2V8L3pkUa<(80KIoW1RMiU)e{dS<)#H2Y zTUNae!xBb;-1{E?^8e;>F0qVs;_wWRO2NPEvo0^;F{+>?98fhVO_Qxj_Yu?u)*wS1KrY37fycI zf1lN)M9aZG!Ta|3!CB2=o^Twm#(ebAvGqUESKWl5& zT>W*>o5wE;FK#?GWxz?t>a691i(e)@&GtJ!-T1@|-&Z3^x_XCcuL8g)TN_4c8P$8R zy7$0>lRH}IPhL7o{qS>FC3iyD|B3AkQNvAj-S={K9+81NG(u*JcrQAu^QU3#%l-=i z-#enF&d7Ckad`$nDG&vBw;dZhsWw=4@|BoC@%|mFsr13G6{um-HYQ!{{!!cK^9C1} z?`)VA<0!%ca18{RLV&#ud7W5*>4_KDSFA+w7~B`WG-WFdXwiT=GHoRbsYh(Uv!Fdg z;zE`b!}2&oV_y2F^9NjB2H@;0Tp=I!Qur&CC_72BZiiJv%l0nWm#_Z_d`4S^bMbLSpr(e}mlwP9a8?fnL*=^vhLAyx3eREG(qA z(x<#XMn*eBdizyYM|Voe(pqn1usiRj`nR8oM~1r{o>MUMd%>glL-B+5>mQ-Xq>Bt(DozrFJ51oyd$pkmzHf(%bZg=pXNSW0VP~wJgw`ttDW#J_ zocvXHqgaefDivanUOUS9yOmOtCa_MdWyNoAte(MUX&aRU6!myDAm>>esoDEwehQ=7Fv8k%% z;K73vtv=PmI%?7PKb!WQ^l&?x_u+#WlCwjTc09_dW0wRs6F}dnhaZuGH^$2^J6oNa z8N%z{y#_+RckHcjfoSZVVOsygWdsZo^235^jql0=ycirNfu62)p+?L?$_G7}I zymOtW9h&avquSuaTgRL`%Mun>71%Vs^yHh_*4rMpmyM3-H{R?_(&GLh8LE#}m7cWy z*h^DubVNpOVXcpP;9$G!E4=5r{4${-1@(Ks^Q_)aL*1@nhVP=@O|i=gTv0q}>;nHw zC+gXsu&ozK+%PY0v#mw*D^*plA~>Pq_2f}7|C&Qae5RB^>6z|X#>2!Ea|g3>`+R-Z zrrxOp_UomkbrQBvmcb`x6)VfyHEi5+XumDMIN8}JqkqI#(;FN9rI&XPT{xAsG_*d0 zL0!9Zn>jDjTwb%p3p7v0R%m1vgSW=9qYkIVrjc6THpE^^+HLi6=HWq&RaI3HWy&o4 z;$a3~sd&CK8}sDi(y2c-i~#bqBEgIMc9`0a8ms>8q^U^L``#3^=LE&gyxXpIDfNbVlw&BBP%FUWo2bq%F0}$*y0G~D+W|$3uRJC2DXH|;iG~O zCkqh-sQIMmCoEZG@KwfuWO^MmBA*&D&#k61+epzhQp@;DUf$aI5qURGfqYN($*TOw zzf!+>^JdeIL%;6ue?>*>wm&Qk2Tt6iBcq~}YmAIuC{@=~n;Iyu8UAL}rOcY>wD>=j z;}U*ag|-cv_1G%c%%EMr;io=seHvdrAYhuN=j_h~ZZ!isc+Kl_W7#WT@6wXe3v1)C zBq%leelKuksb%1L$8Sm>2Y;H__rrbP)SUOvYtG)&dy_CbL4DA&7Qh=99lLf(_>*5y zkObjz|IwqHpKcQCF`WawZ$Ot_kdwH3{e}&#I&|>Fd5uT8lxxVhX|1B759|$VAY~PO zLn&phjm5v%At>f0m2!Ge)$U?h}*-IPbw8JP)wQqs4HO0V$M@t^?fEU zWL@gyWc_TPlJasRW^6}ReH}N&zi%or{}AgfV&0XcBAA%pBdUE<`PwIU^La?-FW$y? z8MouB1R88S8Dj_QI?epN04hu$;im+ndHGX)`(8QO)?&Cw)+2IGnLld`wd{3)zZhhI z1OLTFX-!SdNT=@HoUwXaPED&+ALHvfd4%hhI=NQ!boaKHyS#&`SNT!5y6y~122;kF z4%<)r$lUxifPMCd-@;@TrtT7hU+L^7CjfpavY0qw!a(F7Syxu}+ijP<18e5tPM;^i zl6!{i+rR%dNWaNV*J1eWL_6tS`|@W~pX+vsS^f*8+Ywv`PJxT|JnPG(mIzk2wOD8V z@&16SA8!h_8J4{dx)46;P*i5t{%wyBmanl`mC;6lLA|j`U{|T2)6O-2%EP~9Lfn|s z>dd|sKb?MCrbW~DIxPH@x~}EA6KC26V;Jkp^h3hdmK{1Mxf8_bm2t5&;md*Ts2TNa z_BrQ7KezhFoZozM)j6XR`nmYL>Xb&EkHxh$yYaU1{Gh$Et_dN7?L=yMkaY@&C8g%W z3Ku?|)Usxzu0u|JVdyV8GFiO7Kh*Dk4`g69AamH@ts~an$xhn(enf8O+Mx%cM)iAt zKUvGRr*ch8?N2)%mzI~WWrco*Xt;085f6x^`6+R4bs$5{pmBYNmpRh~cN zQS#}NO&&8r4mIKz)v8s`1Ew`|aoLG4S5 zZ0DUkc%#!#+uyl``D5=s9vx<^wL8dbhD%>uPM0F%-~{Jv{=heU6&luCN@LRpH#EFb z65`X?9)~d`$y<6;EcTY(eC0;b_T`(im@yi;UvUWVmx;OTJA9n4?$fM(y_nhd|ai~o%<8yu?{~j_> zNu2%KSUYjK{_WXSH(ig0RnN&ZR*rn~()`}G83tPVYxMPvR1EbM6ZeFj`Dpks(=X(j zl4t1S3$Y8)c$sIVy@qrx*2oQ1tk$XN>oTUr}p5xve(Uz4USq&w<=Mq{Dy? zsmkq|wre_}>4erBPBiv;GXD4z_rhhWR)opxS5np(9!_O7UK$IGUn z9qoGM&Q_Y+v*Bm^h`#%k+q4nma=`F=w2JCgK5cnoor_ifVK#}Yetz5dDeqh}!*G)e&tl9rE$!!h z!p44`r{@R1b1e_{@hnk}wI3WfAh6oGQ-teuFaMRQH81jyf4oualr&+_gcDAc*)=!P z?Kw}2A~LF>y(qXzCgUSAFg%IYnrl_|? zfoNa$Qwt?#?N87?(6zeWzQc#7tXZ=rDp3u^$4UGPSrgJSa)DDEt9APHBn42_?0RYG z9{2sw_eX7Ct*ASDon4o;No|Vix0Za;N`MHa}&bVWy{Vuxj?!*P7anlM1*Zrx=*BYf&x*Muzb+;++5Fz1bcP&A8Q`w1%V>}{kv(t zf4;6`H+3R$y7n)kf|o@pY+eHYvWD8jvGyt7$G-OaAWwK{$8zun>gwu$Lo2$u*|FMx zzDgG9qP7C2g{FH6Jx?*dJzc(BVoV=zIN9ijMC|nWdfyt!50cfN3P{5&Yx6_Nuiw7` zutNUCv0=H-DW-z>C_`GIdc>_b5$0w(MZ+pb$BVTENBJ(QZb}oeC`04QrUConNjc5r zAj=Am&g7W!$!nJO3BpcVk{=tMT-IaL=+W+Lx5|ZUp{91>jbC%c z+ArSx3RF%MHbfjjyoYXQWcX8OqU$~1X*z#+gdxTPG=Yh<0*LdtvL3OW`GMU>jOgT! zW#7DE*jc@vj~EZ?$YxYYX4GBJ zqz=L7*#>mksk=j4yYrpi#fO~nSh;egHw+24Navd%-l3axUewhA}C0(TY z1VsSJKnf=16;SKn4>nl#sBmCoR=f%OGo!7BTtg{~^xNH-M4avn**x^ohp2SH*ui3_1qBL6;|Z zMC}cjl%poM*3d9v9hyfd65|;R4NS)4d9;bip=b-e11Rmq_MNwSnnu?Zw)^U}Yo@w> zwdbzh6|yg#pV-p_D;S2)^W{Xt%ZJyV=zp$Wz4|rN!W&j8foKKivP&NIG#>S=O`Art z#H`Lf^S~D62Eg7Pd-tAVg$m52qN-|O!`~G!c?5!m<<<03k6|@jejj4F85@b-J{wTe z2QSlJMq$c8Ey4%@*$BVg>x0by=Zxyb8eo)6;Nnmo&q4dooY7R)k8&Eszs-0O=e!zw z@nj6XQYjqnr=?xtHh7Q7eBiej=IFA`3sLOLmNMdCNJ1ey)Ic2j#Ax^H=grd_V4JQb z9%OTKD}Vnc+MQJ`^Q}a5CQITG$Z4SbB@OLR-w;@By z-`;5S_rwg_dixd~+Fz5j4lwKD`?B_vGG{)0Z%-bj8DDT54m%Wz2na8NSIPO_%*l)d z5Ppmt8-1%i8R6h0)-j1u7O)n#4hrft_YXr$HFxUsx22g7pss9*=1*(|({S4vLn2>fc5VUnyaNiBF)6{E&wn5g*TOI zAECD&TS#PmFM*&@vu5{Ry$ZZ~b*Kmw=M6hy(&7v-lwbI{pmUCk&Luu6%)7Ee z#3L|BOHimdYB)ERbov=)NqBMGb0nFnbll#eJYBaWZXA?uorg`oz#`_wcwWyq5D?(} zA_mdJD%xOfh{7^-fOPRN19dR%H;J)pkHzF|RjoL3vc#@!m4n0Wd-qOd=3-gb&poeuvP;PgQ9R4nz)ub9 zYa`vp=fbGG3?>B)tFi#jB%`Rf6Hk{XR#G7-v>=i2#gl+QO#${1b;On4QnU%){M1DV+u)9*0m~^``E~DxJF{G&LKs zwh<6ih}_$^Z)d6e!|E12IQ$H)=dWIgFJgr5NRtg&ZM8czJNB%wQPZZDUtV7uqSs8c z=UK_Y&L`#dWhbZcniAH@Zr{E=u}yd|*@XMlD@L1bTB^C(+_=l_ zzftqZI$H(V=S0PzgV31=+aBR`&lyK<-M+nvo}{IQu#C5|1>c6dyxG1Q&ZVhP<&mdm}!L-Lz`riLjT%zvF_>?5ewCo#mbd# zQ^Qxi-B6@0up|mGoET-30m}HzkkO^DSEmi&tB^b3NiA`Tb6=Xjk#~6(c zCb2e0+{zdCgE^Jr3a`3jAiVtbAss2t0aNE-amF&kG-9%Ng^SRR~BKc#C8`6mE*sxooeltc?FsI;77Euxr)G%Vje8 ziawx6=gy;D9t~l5{c@kKn|>GeZ1RMtPvKo(k)1-b*CGG~R4tE52Yv5wP*3`xah1|ziTfYwW)PT15^m--1C zxaH~R+f#Pd*7P;QAp7!hkIg~eq_yz+L7+GG9FT20c)HmSxCjia#xx3ws4*mENc_aIw6rvu#E}#hkFl*2%W;IF=c0FCYY%8J zP)A29Omdf|CrcNH&=Da(d7q!ZBWzL4(XKZZMJ!yhN?Si7k?St+0n)xIyXKGjt+g({ zYUV$&EiH*}O_fRdSWtd7q;=DpFE>iwy`z@#c8cB^qA4H@Cso0(eQS|Fl78ySyxf(8 zbELVtbC}g8Xt2Oj8d6s>w#LBF=4cC`QMV~T|I1#4$wZ>of~&K#*3|5rq}!pgNuw3Mj^Q47|;Rj^YIzSBP4Dr%yX!LCVFAz5kUoobb~#yUTiEu z&(jqvLJDWvqLXvzoJxDdb%uCEw>)`hVb*Jl|@T1`?YE&UXmw4tF`pE`IfdbJPK+c)z|nWgAtKed_iH*=KiN0_+i&_yBGVaII zsiJBm$WY2Jy3Y9d83op1WyuH$zxwwTDM z!+N%v-DlYnMF+bvb2v8<5&Z<_;?HM|JtHTE^9Wizken5`_h?X%*GoH@IB5ChCg?NC zJo6)Vj}-DEDP{NJ@*5>2F)yejhWYM1d{}h&7di00=$-!SW7x62&P1l}IYs7h_#(BF zw+^~RIW0>gsliVoRsg8`7Skq0M3DHmaK5R=lZfS$r%Vz1R>r+(H<2M+`%=nF8FFM- zJoN$S!eyUk3Up;G;l`)zOtj+lmOjbjXU~56Z^R;8ZHa;e$O{3*kh`bZALI(Ua3<^l zau)F^g5~}|20Su+ttWw!ndG5VR3i5iF~#D5n*0=2j z!otm0YP6MSeUI}8bTjA^=`8W3Udkz+JH4y2Mj*9t-*bhgW7u$-_4Aid+1k^e+nz^c{%0NlVYNyLoq+#Q%-qhWnr;3 zMDt4YzG>he&OFPPkxS}vIW-uzi%ikF5*>XbEF%sTF-_jh(8PHQ7c8L2e0DFcQ&<=l zq%#*S3U*2y`^2d3y0Jz^#Sh$df0^@CMgVX*&QA&pd(hU*Rca&0)SSxVFq(Y=|BXVE zu&_m|)%6W5-_H|_=U^>PLXX4ztOI+MtR5Xn2Ki#^N^LsOm`&W`j5b7!laQ zIz>B%9H4aD6dPWB0dxht$(%i+On$&^U-d4meW2(2fzl9OeEj_<&YIPNoI$3ZFPNC# z0R%G$wL%F{H2XVXTTICJjV86set;oUqtP6I^GC)vDm^37QYP=1R#ryW(WmG2!?aZ( zo;|yFPslR(a+t^gh;t>*4LfpK!U+pXc~v;FhcF0?rBR%329J_;Qp)=8qmtB45Orkq zQuRG>mx^On8&YYR?=*+)%nU8Bf#1_Y^ENl`*ili zMh><>u@3}m0IU=p2&KyvS33b!c|=k60?+B|FW*=e@u8%|ZQ|U8tbt-~(HvU?&J+%4Hb<3A@YMyQ5Q8PxSba@H_;jrkEjv&0#EnvGUrP>SHR(%8xHu&t%Wi7=%btpaXdtURcmx%&yhk5$B7&2BJ|> zcv!v2ZbomQz##7z(`uLSWeYbGb{4Kvr?ht8SvCTHx7x>6y37RupEF-pM8`}~GNJuY z-rppvoKf99=Y67PFd5>}LStK47_SIh3+Gh7zU1#EjBTa_4)Nw(+3^2<&ZPDLzaF=E z@#3gl1O&Ar;iB{#HYw6@F!o{o3ZwlgR0-7P*H)wxRQT^3VrNFR3!1U+O~JemsIaWT zk*dDlZ9a7PaFMtInQo<$RG@o1i3bI-R*Lvl5MxS8N?g3hp5HQL%bkVyh*LjrUAc4# zNY)=fsE%JqHOavgj}e&@pqIY)@Zq`4cAg<<^Bmv2t-A8NqwEzfw${~+EwbwOV8e;_ z&GaKuqq7RvBfmxc1E{jq<$AFD-=Gg1AW9pee#2YLwMYLx)}p3|PN}*OT6*QLS5uz1 zWP1c7nUE!tLXL#dO%1#l61=>RAUkSuvIGxS19Ma>_Y=BI2Xd+Sm%g1&Iwi$Bv34-(*!IgL8VqNpgvX`I6d zT8ElyIvlvsZf}m7!n@C(r!88fMoD&p+kzZ?n(a7I$&~_|SwMdRzb(AJh6-adkRJ1L z3J)9aMVfpO=OpN{MopUJN{Z!$3f08ZlP(9{$pE_0AYFf?^BqCvC#F4N1R6ndYZk|Z zXi`8vi+8IrpW8q=T6wmzBKU?BaQH*+PQAX)(XsA@;9c1)7Y%l+cD6rN%^aZYh334+ zC9az$2Ri4iBYrE?{kY%cvb%)RDS+J2DOyo^?i?c(;3>G`wPyFqfBqCi=mbp|zcbrE zi9o-AzEt`t2F@1){o`$LOD=+NEYgZUWeX>z;K>r-7V8SPw_VhE=+JhI>hShJ=ay1+ z{wRLsPu)=pg(0b%l|0^0meoH76eqj8C@pZ}572X#!udF0o_J!gIzYy3z5|D|Qfx3Y zK+#EajC=uKd{GBt+~6IeNjJTN(S&<@J59wPmz(!qcBr5$au5BePIw`q$cdsj2mxYP zw;-Y4;Q@<&Xr$i0Jtnreq$G_tY5MHht-uQkcp=A#0$GziLRd9!AJO5;nf3M*Yz$@~ z%#;yFNHcn;iHN%7!4eLZFn%P8J(ee9o^`pk8p(|XXg-XZz$9JHIFAcC#6s;v3+7Y8 z+Ytp2Gg6hQVC4iez429=15BhVyJ8OZHu8jbpnFk68v20SL9^V10 zu^TMUf>oclp)uhvkps1@{Pv2)B{GU6GG3yi*jP~QGmE{2qNHf=+ffqE4o(BLWxFFM zyP>QVet&mo^yFsi9)eXfQ;1mXEYsgSsk&N6t!4QOIg(aFrgO_bluq#^3j0tcqgh|M z+ztFM*!A0FF@2%bB?Nt7w&hyEHP7k`3x@5|Z)D*3i`cEMK9ed^;0%iU8`d==Jq}Ff z!0adH%+uY{LPM74)~TQ|kcuDrLZX{cG<-4<=bxGp6sGd^wqw^+D0XhWV7_oabp&?; z!LjC8Nh8Ar@nIto*VI5+5syZO=^6nEQ&p3!>0>1aPeOA|1uv7e+%{3{Y}#~laJ@J; zOcO@B9+DX$g2CGtchZ0T`UPowJ5(DAU#$_+a&wCm{Yh)*+7;%mnxa@If`2>`Je9tWZ zULYzGF6i`jK3R5>P`2jdW4y}m0~UX&_#-9Y_~d7}a)Ff_+s!B9Q8$>A(V&8=_9pH1 z@K_8?ne}_5fIKK5?Ow%rQ8WYb(|TlCUpv5TRWQyO=h8#3F9cb)WG-jO8(Cs5E^WLU zAV4`DXqG>}x>6FhG3dwVnB=L9SGoN1k7hnKn=IfKv!ioDL zFh*Ukt2Rz#g0Eh+ZrgSutB6E^KyP`l#3$#}Ne^b?9FX#0de%@YF`I~N>)*!goXJ1S zwr9oT;FIaZjrhCJNO3VF?2n=hZ(-NKq=+B#3gBHDYHfUptIs$f626FdQxJs0*MBZ7 zYw@oDr_xfJ4_?U3=kYjD@itNV~X*xrS3IO=m+Rw zIZ&mj(CB|ml)Ke5G_fjrM(7EAmL(^o>lN0J@xC$9%dlO;S2ME zWCaMe5NHt|gRTCu>zy#}JT;JPK!i(yidc6yd-7Q2{avwBAJ2e9D8c}4Q!t5eKYWU@ zaT|tYdvxnI&NguN^C@{#m?Q7ZNAX{@VHaHn^1;z4v+1SBMP%6OI7wv!f*{*670B&d zjkm?H6;u4Ss0BF=Vgs~h_`;}u#`@lWfPZX9{QK}-0t`+Zh z!Y{W%@h(HsTs+1y-hognWcfE|`lQ%|?8;A!?x&8Thy<$QCF4vSUPL`%1O>laXQN{TnQ4M4U3aVRnJtPBjF>HL2SyTad z8ChTsa{a@!0YonNC`ho;d~HIG1y@>pg2WvQ5Kjs;l;H_T+&{j)rlY8+h(2J}l@$v) zvxok*ZL|1Vt1(7K+-!cqNgx~{M)|Xt1>HIKcD|%3kFMOIddGkdM6p1%Vt|?lRH)>7 zi37?L-f~CKh*957Q46;iH7Y)~cg_$5R}>d-B5%E+oTJvh$N6cmxBjbl_T~kyTHTYP`6EtzjG4->o}JJ(r;7@)gt0NC8`fo? zU;f1j61t5o`1oUke;HTq~mZ4#P(Pp>+w7;J)?;n{U&)&#_YWnh!|;vCTCq%#cNWSWQ0 z&3pcay=Tv!1u>QdP~X0P7eG_iGICA`JI_#hvFK+iunh~6HIN^PIS&pUWZN{UZK#PT zk(qaqm3-XMM2g(A^P+o813>d60Nn;ZB`I}Jkvs*C=PvQbr7WlHJRYl7&eVtoXPCdS z{1w_IFWLwA-9)83#6!@3Rh|POZq8?&JtRrl<|-4y?6G42n?p5m#fmT5)&|PkskU0O z0fsm8@BBN6Y^G{&5-bCYHRKuj=wPy{v+LUm63cpBI^CT>y=`*2%RNM z#7axw^UM>|!@rl6n^;qx${1y8UVzlwu*b5uitKbY6E7#e28$c-Z?Z zZCif^W0ON-nOaL5d9JTdO*@b^F|uwL2F!~yz2U~q%w3(SQY1V$IhFmB)Z6B`V=VG0 zd4m8XbRkrSyYQtWTAzT;WXtkV48aOxl5Vu8t!~=jZl|SK^9+R>eB+)i*RseEW7$U>8K{Kz|_0w*IHg&JsN& zR6|p}&&jz1S6EtJp7A>bG`9r>Inha)cFN%ExpvaeYdVYagZqq`9D4x`X3diMOIgi} z0sUfZnWP#I(aZ4z{SJPQ|D z4uwpkL^HNUPCn>IGCc5Tgq#A80-(j_m)mu@Ffps}^(`o988(UkQx*sSI0UL)W+lBx z{`R2eG1YzaFZEn*VPP+QSBI&dN)PlmmPGvYHlHxzp0?N8)7x`6twQ^f-o_%G;ho88 zpePe27Beu{iMel6-Ykf6toXWwWsTcy->$pSybTHbYF;Td^TwW07dBM6I2i3sw(RY+ z>r%4i)0;mQJoMe|FR_(|R6-2sChM>@2%oep2M!)wll?bG>0JjKU_;s+XlbF9P((>M zM<^4)qQ`|Q4&a3xvu*?$>W7P9r|6OdG^EK9EsLh-9sU|HNL{!);ruuSGWL8CvCjXK z{@*eV`agQ?Z?CJ^xnXC)03HWg*cb#1kI8lTkV4|cF&8Mnn85Q@bPLbV7;L4WI{KGka5>>85B?VYtYG#2D$Y+yCTp&2T_!W}BD1E9d|4aJ#(KmS6c>w_%X>swJ5ju1>@xdS+bhNUwR2*xUR8Mg;z99{ zkg(n;QZY34``C38?d=(y3TcF$m+eL>_4aAQNnLIYY@KK~SVRZs^2H<-O+nl_#fJ%Z zCr4z+;5zim@>(_ew)NX+K15;$#RUE)w^K$aiP_)wCN03_6BWtLFNdeV=h52_VAP0K zNU&jm0%$?;H^zY3KsnT;Nm~jyZt04`QkS2fw!>u0ST9dP#N&8`U~*gkR_mF1vL1Ck zwPN&k)uR**K=3%7N%6%%{V9#9-;Aa+mo z>9O2<6x&m&+ewN3TwoH|^?fKKUtbx!5IIU@badj27e8u%H}_~^#6_N0mU{EhnRTfSH> zIaY)yArJEVdVcoY(vLdrngW_H_x~<+0;2Corc!(0LP-7QLu` z%mx-1UdrVcUpFe*lCMTaYSy^d| zDeB3;vSZ~}iwsldDsM+dWcJ+zLFBWJL%!8~ezVTRups^G`|Om*yJzcn_H^HJEHlcy zWT9Q=EUf{D4`sCZSJBpd&*6mbejmJgtpBXhVUWoQ^XHjOdYg|KKg-j@cVtTcY<1TZ z)xGVamWEuYyneM=%IAw^7R^4JRywCYNJ;6Anuk8eG`nXXJ-v?G$BNE)IYasxJmii`#~cw9aP(n5(Z_&cM=%wP!wXgN-is==pMmw#DE;=2#8DsB(V(jTV` z6Ts~7;om74r05G2x4^UqU=gYOrWl=?=5Zh{GN7U)?t3%d$0?@de`n}nFNTGWXcGAE z8}lvvd(GK__45i-5Iw5G!K%eMC0GN}cF1B_Lh>n^GGf|A z+FZJoANR|qgtnscBPj2PiW-2%96`k_AgF26r%z_)f$~e!cM5{dMRq$j@7mRv4keeC zYD4~tbetjlM((8!o(+r3r8s)-?T=^tNi}p&)B*4Jm+#r5RMUFn{+dS|by4-RQqz3t zz=R^v?}-fz53?Pnb+w0a2QBgmZX#^($%KGcgwJtj4L^KmSxV^O*`g}*#^@ax;?nm}*hy_+ffIXcgy=HsJFU?omYS^B=??f6Z8)9~S- z4F)}x!W`1%Ht60j#NHKDbL}uaof3KgI@}jt;R#g3m+bg7nx`rJC+d4ZU|>CPx=}DQ z|0rJ=FA^X8t@-a_YcS3HuG#PEKVG4aRu=#PekGBhM&FD)6+#?N91AV_5t?|nMr3Io!0J9B-S?@ z5P|5|LhxXcu@f-jRxXqvy<-v&YMeEqA%1a-g9{Rv}k_w!8n} z!2q1YMTv!EmOC`y-+#58&I3zqd}B==PeheJsO1H#JDUx#L%_&6bgA`xvo{ki+txN6scnxI<*Ymi+OMw`GNt>-+y_#%C5VNGC0tGx~*c*4lv^8n2 z_(HKLS}7 z$NbEN%HxStH)48j z6Mgu<29tZv38gRD$xz0|ULgk{J}g$OSY+;aLtMFbf`wCVre{=ovyT}5gGcO;_dtd7 zF%xEveiV|ht-0j&YvPy6{O!8vd=qW<(I+yQwRivimI4xtAOF!dsUF_|I%eUg?w>eqrHm2!`23>Gtuy7wJBo$7 zFqzkApXMwu6%*o8svViop_deExqyHGB;g_@-?_6PPl|JSBH<6Fo1)Y*Ha7lk`i{Vo z$WCl}A6cZpEu^DvhPq=~;NX8OEOICI_^}aWH?((?%gCt9O0sJbiY3S|AN-ql$O%o; z(fC>iSp&&z3DKHg#{~#7?=ujvU?*q*I(l{jYifE>^nWb>mF8Cc z{k}8Fvg*F`@yHIhIodxim2Gd4c7f;svo46lf0oim&y_~E_*(Zs1;io^fZpuh_p-7& zxVgEpeWfxbX|K1ptebz1iyZ2>#rF28T;N6LC%iT5rL2UWR$No~aD5z-L&hGzMPXBv z5z)3X*OI_WU3_(2i5l$l?+>NfBT{S5A(#P*d5Gt?=Nm(1?I#Zrts=eQ8-IgQzsPLk zAN6$rUp%=aAPzO%dLbt*oeUy2bKhnsHrjq^%$X`b?+XAT`Yv@a+qmB&T!T})U{ z41Uf;=3(3HBO<}TAuIc? z^=;mz`qAp1r7B8_biC4l{O*1^I{IJfX!4g@>T?@uUnIE;ivfk&A3&Dad6y`*TjM)F zo_h1t&48uIoS^M2`G7JH$PpbtSH_&c43u%)K9SZVK&6ibwe`E%>>ag2e;u81C!Vlg zW6mds$IAwx>TWT0>Qt&@8N&j>{(WG8h{vc6TrIOh9EZCNF{Tg%|5c8?U0PPwLqj9< z`K9Oe>eX{b1V#Fr5N@nPYmt(gN^2alNozVm_}mLP5`H8Mo(5V~P+bF<4`w(;PF(T% zQktN#kokPR@iqHIJul7gnHM&gasH=8|J_d5J7QeBQJeG_&FS8w$3>Kid_|+2>E1-Z zuWrrz2@S&m{g@GPbW^QE4PKCRx0OkKb>AQ-Td} z%1AA((T#+L;{;Wb4&u~xBG6Pfg)Y@Im(Nw!+Xb+L{JUq@u65Z7z=##&@sGbZ)J#xK zLDK~H^#r?dS=mBK)!Vsy=^edwt!ki8-`^;Idx8q&_q|?jDlJ;fva>3GMjs{&7dY)4 zFm%|Mila5Z)UivG=YtUy)!WTKW%EH&MHP*j4Qy|xK$Rug-q)@T6HgwFJ&ie)*jB`< z=$iy30sIH1xeXmUOH+AS^t`ujH5++=Nanm#nrezKJ2Tq9HN3c6LXV0E3jjK{z?8;) z9kN5}SL7PEQ;?|{y!AX$>o`Cg*s=xIn69}bj5iSTyQr+nDc+0ZyGtM^z!V8ETtZGm(_6!KNzu%d z{C4;so`~pS>7V+gd+F-ve2=o2GpKd^vI(2fA9Y*mixrIbgcHAB<=@0y(d-MPL(^jk zt8t7u3WY^MC)l$9Q`{vgizv_w0&xn|`q80p|9ib%65@@>w1iwSM26sdkEn)d@lPke z77^#+q(8dMTX54gfQ0J1!921>XzA<8Rq(A7ZNlo1!??_fG`BzEPCwRV%$hYC7J(7-^41oY(E4z9sANDB3h|(gmggg*r^9w1e%p6`%pUsaI@{NFrGu0;FYUk{p+S4SaNbsN zW%gM^)JQUlD5IlXGT>Kpj=T543AHXmG!*@Z3^@(wf3TmK8d4c8ZEfK9C5$TJ%^U3K^DwyXgoOm>>$n}B_0J`~CC?!M$EYR*G}fj&V&)A=h@LK;0j@3wk3-_+E1{b$fL z$JMK^Ipj7#Z_{PuNVT9DN$4Nc=JzRyr#>t!N@eea&c@$sV8sQcL@#=p-yzH`;e-pI z=E{QHEjgiDEZ4b%3yNCZw{8Tt@$=M?z?aLLU zsc5dIC%O`j#bO(qu$6Z>l5i0Xm1=Y=!K&{+d}zVH4eij-JuXgf&G4X26Gq-5((l%2 zS5ujv$Q=eKDF|!ZYuj-zP%h9i%6B4D4`>>CXIZ4fED##N6C-z(01$#Yg8(HWDq!T> zJm~>*kH!xkrlmFKTazZ#mXBWqdH!p3=fBlx{C$cK(IP?MyaSZA;#h@-jqSW`y&=+) zk8F@qXV{S&dvRCC((GSn*!N{otXe~v&#aVZLIR&`LyZO5LP zB|PS zQ&nYUQ=)mU@t`I*X+5vrM&(i=Q-CrzVx* zR8&w1i^PKK{{1tVO)LA%y|AjLdLt4nwqWGYV0+ttaHuS^2c~hqW7L}YZA-|3(M!zg zZy&oEDha8GfMcZNB`a3cE}bwu+lqE2W5_veFUDgTdfd8ucM}EpI0p0gQ#aBTVbWy9 zDi8FvN^IMJ$tH#hEYFz9!QXmgt6l++H0#r+50u#>-~)Bjdp8&3&%?=TS{b_8$@-QQ=SCf`flGjX41~&UC088+VrcAq^g1Uw}S- zY5U>bOAl}8HM#2ic`YbLHD^y_Su{F{r#Tj9@bj-x??|BK;{7$ zr)q;SN+)6&Nm2IoLqNijb2DpcK3#x}gBPJPMiK zhYfbPZpIJv+9u}a)DUjvSXTY&1Yf6ug!S8pW>G#RCMKq4X})1e0*JWM%r|QC2c7^~ zz6Jh~Z`(GNrQ{wAClfRmJX#lE3AB4;l7@o*P&M0_d?k|jf#>+6pGLm?nB)L$QaXD; zIhI(E`uxwzMTDW>S*xHnWK;6q10|12=Hctm)1i6Ak-HYRrt2mP{P4(lyo|F&UZ(?I z4V25bATWlzKb|Bp*umXknJWbkEe;X7md-a;E?U9DtC^WX%;?7f<|>OW*53{>|8Tt!fYu>q2+q-SAb+KZ0}p3rSA#++Vn(6;mT$MWMD;E z)rCtW078tKk4lK@06kSm5WKu; zR=e7@vw&dWLnoVX4G0iy6$50D@bzXk9AO7`1yu&VzDbuC95)~XOaSx(JDhN|$N=^r zt%b6>4ntZfSZSacU;*-LmS$ubX2T(#h?@hwP zKsgAIfD^(Cw}MQ+1I8Gxgw)0bV6D%O?(32IhpRP1TK6IJk>yXMUw;3715zVOAWd*J zzZbTG0<1vasr|(d_&6bKF!2;KQwC&+2#m=b>LO1HvH@tQRA@@CiZ)=Z1c`R7cIIK? zo&a#N7LSI3tKOjpv920|M2Of3CR#~P%xWMVAy&*pdjooj+ znPDD?9#Gqv&N9+uLcp*Zw@JdyGbcTDd_TeWP@qEwK<0(eH3Ip{C~K&AOL8pU)?Md2 z!hthh1Y?HCrg4d&Q^aou72-3$B_#;uHnXw8&)vLh5lyHKFuAM4`v}-f#yQbep*S!x zF*$@3g5V92!7J@&{G>4mk!eCY2Rb3;2jGfcHW5(`NKp?S6^gp=L7Wptzf)^A9Y@_p zDkkK2R(Bnqz!Pwk4FXd1ub(-z!n{gK9gQbKTfb-vWmvC{5x3;WOhw~~5`8p#_<>~D zX=&ye3MnEtBWRAY?-?EoBdFy8Q;}VZD73_vgbO%)sBfS*2m_z+6f zYUvu0rl!HkWhGutmZsNkzdH9zt!VsNUM&WWeb_c%ttT)y|-L$;{3G8kI!gi zAjP|Hsc*r4@7}#X8wwu3F%M}~McgI30)c=N?iv^UzzWNGUW<6XGS7U7AfqsB?h3B*7A5cf#>OqyHzx7){n~?h#l%Q-CyW9H1_0ZU zxc{l&e7ONrFa;b>q6HbfG<&jt>A68>CC(6>qYeR00RBqW^8olr0~$!M%=`E68zj|K zRnhpPsVVv8Fe7vE*15^)X=1&Qo12UO51Ure`hoN1`$xReAsMHK+;fnv1i8Xce+5n% z>VHqw{TnPxT%xtMLlWqn;3SMc1uk4Q(RP~nBnIqYO7$o8inSUW+Q z(IM&|DD3kJ3Vas7Esv3OkR1)%WM#>mD`8oI9U(2>1C4|OI0jx9RelAqhC@4Uk}1r; z&1K?_P-k1)RfnvUpR_jRM-BpFnmpVmDI-IB?PjJ*$trRtp`n9bM*t8V9E8tx*REF$ z-rlhl>r!&=;P?E1p#cK+T5K-Li3W@KV`%6K5Ct@o#5w^}6Bv`gVx4`U32 zn&=#~IFCSOhof}`QJNq@fE1DJQ$KCK9UGf$kO^7jg%Jk@^zfb4B7vS#fIP^6G|m%L zp?0`RsMgsLkS<5zc=r%%{Ew%fU7UQ7qPo88CNXqgpuL2r%IYN!OPtU-aahR!9=-WN zZ5|Z~j@;lt!1BC_X9SXWo=cAwLFk&aJR{bi?2hYvCshTDIQE{C)G`2RU+^nZ#U>X2duqm1R3_-`wGf-%pMQKLZ zAV|+hWe;ln8|EX@ft-<^luXPB>X_)=*^_7T9{oWz!4q)gScFXtD`7K$#IOOXI5dl3 zx@|EIOr(dmZ@)n&sCEA8AHB#yOMxeU2ePYCIU+P-jGH(PER;HXdOlUU;0L8zvV`ms zCW5WboT&$G0`*NYQV|jR0j?rAAxvwD0)Q^)5)g!O2y|GqTa@4JQhIlKE#%0!&javl zfb?K1tdek`QQ|O?1HE_oKtpl|+%nuaYZvw}l^8(X5cZD$q8ZFfyngzCx{rfWPdaIN zoV)8h`Z-kKjRKhwSFXSu<4?mLfM)>kgP?vR9XG*U@iivr>}+kV9378#<+-}J{N5;o z$WQd_r=aLko9s#QMCrTtgwHe}B?CyD zi0l?8Hx6%sEbD+woLC?b!`x2GO#2|)rd_w=;s(kA|MuYx5yt@3pJVXmYJ}P!$}3z@ zc)PJelm(^oSPok&l-Fp4s8+9C+YL>tzQkw)v33F>LJV4@rKO<;U`W()AJbV``MU6 zO_+oxFY~U}-DzF(&00xT+oYZCJK}L`FPfq`zVcGit=Z0q6}L z;|knU>VAxC{o9CQxgOxoEwYzYQUu37A^IaKkaG-0Srzd`!mtLYH8P8e%4i%9gA9m) z$+G|QR1zI85&ELcq!8>mGO|VB7ZobNPjK@mh(9s0!OQ@d7&?RnJP_au={P`thQn=p zKuO+4zn+Wf3Y?HYgG?LL@Pu~NQ<_}~CJXQwnSe(rOYEs}%0MPB8U1+BWG^8p$pbVW zmn9E2W#n$5B+o=51xjLrw~F{c?41yu$f-v7!~6ePW0dvr=f)ZJAI$656S)+Q{#wL) zD}du*JPfg^8#fn@X#LX1(wMqt0o_Dmf{Mtw(R_V^O`l;7(}phfD85By;txY=c`TpB zdDX#B`8`@XQ7`|*zNzb3WR5{5oE%47HI|JeP?vNiMdQL^A!Kf0;XR`G$3j$GL$dCh zxRFtC-Zeo7gbl|eBxF0^rXwZ{WU+Yi*=jG8DyQ(E@h58pK4=+ffK}Z|NC2+Zji^ik z>;;SFhdBuy5KmE1ahh966$3~G21C}f8UR*8 zAc6zwoR0SkkTn73F@VOX_IOQ+03)Fx0%!s{3eK0vV=fU*K7-OD6v@N|2YXEep%5Vf z6t4;`J202C!=JI{7x8hzbr(7DP<$CY2QnxH+5yBEHEM&s zfLlNy{TU`+KWJ?c`~7-d0lG(1W$`~wphR7o|? zBDEll2I%qaK<>sspGm$0$|opheE3H2scrxPCiYIS@jy*W#$zDATa#`47R$z70dI@N zP!2@W)MVrYNRlgL24H5i@rC1*{glubuBd2fVF9ZJMq^U=Q4aPlVw@@h)DkFSkB$q$ zDDyxauHF4eeVqWVRwbw+s;4N2!J0tl90jJIEWF1q9W6j?#M_T7kVVudS`HXBAkbrb z75PTk^kUVgyMKQ&^oX%>ary|Jr$5|(K|Uu+TfEgg-=nxV=06>nRTSd!YskWC;1407 zo>3fQC&zMvHiUGcLBfqGCm!knDHI?u9#e(hUU}j7M(|p_AXkYP<>t-w&O#Kte=-J9 z3L}}NV5P2Tpek^)>u=Mq~cgP5L z!8^>8RjmN9p@bnQH;x!49!}z_5UTZR97t<0aR6Ie%H8p<3Ht}YlI(ZD@!%B^8H%c$ zR+fDPf*lwZG<+p7aXVTB!LNG>_!`Sf%aF9;geT{{nOJ=<{h|j zXio>WP5m)i=ckDZ6xA*Y??gGVbc0ZEZe^_%6Gzjq*ckkYH5y4w`@4dE_g$Q|gOc01 zKR1xV7rJCXxDoUwX-)Pf`L+z0o)+0{eH;%GoyVZF4NeWYxY!BLBQBm(X}#m77JO}JB-Jy@bRFn<=Vbap#72s>iBDlh}tjRg!kRaLBh)0X=;?XA;wg11exa--Or_0Sd zX>jc(At^p#ZT$)tlmYES*REc`tswqUG4f+T2cB*iwL66m-gtv=QJa{u03ST{;r@C^ zG05aA!tdG94n-n<*}a>bTf%mrB_VUJ8?L4u5=0@q2Xa*a#mOH}V_0=J?uuyPF?d^=_2=Ls26YKoMYu3%c1R#ZcZnp90-X#$fa62V>&bjG z_m{^*ZWJf7T#{`-D9NCH3~7yqasbG8IxuZ$REZ@H^l;=G32Lynm+@hwtPc=8S;&SE zO(d*DOoduK?Bjdr=PEyadRl2M$V^A3XK||FI*j3!XvpCt5q?};T=syS%^LXFt{%Jn0DvFiuN+#gz;y}T0q+{`v7Ea*-6%Q5sAR|vbZD_9cI`R| zQ6GeJR_*iC4eAiC>_AZT9^be`(wo29uv;ODJ=<(^|*R%^Wdi3|y= z9e_ywl>tMwotYDCg7Wi;S+>$Y>qu1(97x04dwzo968t{j0m{NVBa4^OObM+US^nge z<<+1sz>deJykb%*xeT(OkUoHr`B44hurR+3Uo+;s?Z7;%h=jy7U^fcm7a?oIHG4%Q zlb1x~;sgvica2&a3_fFE65NM`AS+^bYS~1IJ${~+Y0Fhm{4Ftl0a>d z9e>xj{g03#*fSFIsm?M*{4*lh{wnC`a`%wnmbtzAR*(H*$3zFIRe&n2W#1Ws>RUCK z@4q)tvJ>PP0S$n7k|PeBs0IO-kcL;c_qbW)k}QQv6*8DNs7x;W`bLE~LcELN7y=JX z{fF^B7z04o_&4Vh95%vcBc@tVA`uP+)h;T$O8^8VJVuU^g))d$!3LR-;GaMsMps1A zA6_;-cr2z5V{;32CWWy1~KK7qhdl;eGrKO>(r7{Uj6mc z24H7Fyjuz7in^b0ARQ%f06uUt8MtoaYvHvxqE;ZI-p~c1c1=!NpM*76s8*pT_sJW! zwz8tkVCX|qO6p~OeI%;R6}cEGLM2T)I*>x&u=18B=g z_pE6nZX86_K!&U#$wKvvT&i;B%%c?5ja|+{fI8eRGj<)EM*oRqMdlmkeJb`4#|BhFegB1jiQ@{yv?wb|e+_O_ znfEGy{sl1exvt7Jm~3a;?P!wM+y0k*R6sHyQ1zEmuhzyC=%cJrxDdJ!k3JW?DfD{Q z&~^c8;E>zNlequ-j58CYE+k2UB*!rVX&a9t?*gO;*zEECUx7@kBp}~M>G1;Rf>{4y zlvv{5hw*YR#>w|#rWzvc^v`9;!DKiWMd)!WtCwVHFy51enKu~G?L>2nCRVRB2kaI& zU%-2RwyW`jkCm2`BqsL6s{vMy1f?O)QM$Uj-RxDO!=jrn1Q22a^K7cYkk_!1Yz_(n z0mTJ?fNJnxC!)3Yp~ECiuwOCu=%ymp6a5pUYeaxbMr>+p1<$ExU@(h_g7DPAz7v%$ zIuLMPI3vNpb6jwK466EIwFN2+=1i{)E#vV#fuCnLR1+jg7D=Y-ZQ>w*T4WQdk*GVlbRpB)lyqSL(bs?^QntY z5YTQF6=gs#4t<~>@_pupa~O2QH9#Ya72TB_YAJ^rp~NM=3HbVGok)?OXY|G_#E+V6 z3a{j_!L3C9brx(R(8VB>;kEaF>HSkz$x2R@rz^temA@7Fmg0A0_6N5Mw`bY+AUQet z)10vJ!-{wB7|?;k1QOGW@<@J2Tf8~+LbA03S&i+_nV`|aIML|pk- z1DJC7fOmqfCd5TJpu&^0NjK3Vq2l@LhZOX&kk7YD zVJ!8VVJN1Ln2jd_{VOqrxTENG3lN}cu;B6yUfhSo(2e0azhW|fwHZ5D z!R>5AQGg3b!0m;(|BnyCj8nQ_DFob587LTGBP>83fb7HqhO!51b6^mIA%O2u!K*36 zVLZ#2AwolytX|kdSy;((Q%fDvSu)rO=`l*|pG8oMVl5^yjKS2^k*)xS{~KtGp|fZF zPYb{x=v~nWR}LR;x#jgU5Vd7IKf_ZQj#(9Ya%BM&5SsU)Nu~!V)JCV;oaRwOTsQOam=CH$QWZ z?AL;r3#bfgeo=5rm(lc1pz@7*nuH5smOYjE<2fV%2(e^P358@X#*d(zhGCJPjXAy= z5lNv(O7jy%Eswe<4qrVL=6%F97i=uKKe&O|K$U3Kk-BoxR}qO`t?EjiN@Zd#1!31p6rRWXWD&d1$1|1aSp>QXf?IJoWYPUuIUDD?gnW4-vEbRvwAi0 zXu;tnYj!CZTA?D50A*U*;^JmH?v*4~K{qZ9lou@qN-{?LHjFfLqX;4V7~1DGjEs=c zu0nGNEgh@|yU;C@`7AOqaOhC7rQ+7W8M|HZKtV~5(K}-60ngKPUzK>KoE_;Y)QB}> z4bbag29*)A2dmd}OS<0#`1zIG`Tr#`eW0Ny@EDedj2)iaj$#pbE2LOK$a$z^TRSZm zi&DMb^`)b7@nVEv3-Sh{?gmKlrP$*t2%`ux&yNlio&XIh zz>|b~L|=|QU$4PVQwajD!X{TJx0bCWuWmVrDWZ;!4)QQC5kfRxaAqR%OvK0P=H`i@ zqs2_AZjjT|0xBk>3ZSuUapob6eNWCjqTJGDl;|8}w1Svc;Ci4M+APP%Q>i`mlx?;8 znt4=M=vzgkgO{&=2LresBCiecM2EuVLNKv67*f?WfNq+piaC1`vBO2sDPnEdqn`>{Tbl%tcfc+?m(5T z8sxlCT46>5`hM&=W~SEoHzEoFZpIfOb~vcqiTh$@WgtnCXj>6S(T-O`_Dfc(z$KoP zoio39a5_oZnW4)?+HQ1zp?y%G0QnqwW?kwtSLoXn2Q~=m2I442A?*uJD$#9%fFK{0 zP_x8-7D=xPni@c*&^BT-IUhiAD`-uKKo*1NI60vPnca9^SVNzlCN4C+CCyk($0g9YB{eT(7$tv#KLJb~(sD$y;2+jqWB9SJ+ z<$1H52#>|)o6nxju2rSwSvv@*1~_ro;9xjWLqb3gg#&1z#>SL2JQkNwU`PT-TrjW! z!2+^LQd-&?FAut|ri%5;vk)PEXrvfHAJyPpLq!JpMvgcKgo9-6460-lG1tO*~`Jfa2#8V+CNe+Mb>>uE)xel~Gk~gRTr?iI{b*M1(?5 zeKqCPhOQu@cPNeRa_hP|-K5D)Mq?=e)@S zcGO;LITMxv7SFFlJPA^-&tmu#x)azEpwT_Cw73AOImToKsxg-MeU{k6J7CwSdV<#+ zbr(|K8s^&?di`PIl zoD)h&ZU%RX*fYQBUxo=nWN!bfIe2Kg5n&$ra*xLdCzz^UoW{$HdaK7+ajXBsZ?MFi zsIN)$3+GSLS_ItyPe`1xP!%$u@gPYVJrM-D)_@h5#B0Hifb%?`*Yg4`&3KC1zvx7z zFua?B0rkFziza*@D$wq=m0Xa<$GgmUFeFChb6U725rhwYdA1SNNJIn!aGqCiQ$}>* zv0y^83*_pzvN$O6{|FiMNNe!q$TTo!Md2V19|ChocEV8zI~-(h58Hq~Vf9}t9yD#K zAWMiJB!+=hgZTqJbT5T6^uHUaXd*2K@Y@EG~>9bXaTF>dSs5E{Mi@89!Py{&80^ppk-5w_R<)5!*_RWq7dM3n_rScN-ExJHi+u6_Fhc}ovKSh$J!ZJ+ z1Vz>tTUF8F*q-`U8#vP^__u{rDPhO?t47*`h^_kN%S(X#9%C^MD9b?47tju%$KN9- z*M)|~)|Q_%{HCU8O(T%Kp=|2_5lwr|9wsF?d4kV+g^pB^ZDD8I(@@rXS*NjTt6J93%2URb67iLg&fRBE` zA`i_Px)QM65>ir7T)6O7;gU1T{i)z$^Yti~I31X9c z#(RuAk<0^F*VfjSV6t%1CIPupS`bA9^n4@+AatE@unW%&71Bz7-OZDK=&JE5zyyGVZ}G$E2uj9D=?4DI z{4SRpgyu!9r_cp$V3xz%+HsRET_u$9kl^027}p(wcTVOsZ#rY1EG#&`qcNp+l^GT_b)T4}H@ZH2_b^vNx~A-*qQ5V{ zZ_}b7+bO`-Pk`}6&&sw(ibstoXxRY1BJb}oHt7A6y^_&# z&zlz$!J*n^)x)#{tFDZ9HdK`Su$v4=cH{>#=eo)8V>-yJv0=T(0j1S z9bSHsW1Q&Hk*E>C7)eP$u;C;nCxkptVme58!Cqd)UV>O{~1zy*^mO5^eQ?~oO znbh5{TOS-5-!3o1VYpHHu-10aA~pzdBvO+PrVtFcO9CV5(2>6a3_$c&l9ElNA~O@l zo-rr_vBrl9>La2P#69WZx$XHQ6YQ+rW;rCj=dOK>XvgnD0!nT%P*7A5L~sO_i~J5M zOm9Y`;zCvZ$!q8JP-UOWu+Af{io2)^_&XcFmySP5Kib!-YJNbc_@8(~^*3#MuDb}_ zMWnZ{GhhEs z{E+l3zx`>_Y(-;A>8(fnRe1y7ScV=to$5DCiXV7=c>0k>06#-pnUg$?S$2x*-#)bA z8`1}UyCDcV=m?%-2op^P?s77ec2g@ z5rvWf2U%85;piWYi>gS9e_t?lf!RAEv;t5EX(zzQ>u`pKF9u1*1t)B5)KJpT_+ggb zllf$8&DiLzA%319=B<2t11VH0HzN0sz6(w@SjkMaYwIPtbzxgCmF)Pl`VzB{m1@|w ztt;NE4V1Pvnr~21x!5pLKUZTL6L@RuKL=!!2H)I#H&izw9=}`GwX<&o%e0YbrwXdw zhpsK91?IwWtX3LRZ$vhN^guom^umJrsVng}4dAV;e)+}m;A?y1sT@ z_~*Q^=rqKHI&Ei08pA`n!J&KT^(~ zm3i#ctZaWRe8)1tN~4b&5i}-2d4QWDUfxwMW4f9Q`9KM*`H5HoCXqxeO%&Uv3T7c* z*S3{;ir`%lIWy+~fr8|k2V$I%RR2wd>9I#`x-WfZOjOkA z)8INFbCT)zVI$*F6ICs@$Di|-b6aKkH5gYy(YReJIvJG)@e*CXo@Ze!Xoi(t=1d)0 z0Aij&Ov+&_jo*aTZg=t2##t zR*&F}5X(oHh5?*IY5gIRU#;v2)G({oZr%$aepo88tbwLU#m46D=cd5gR=7JRhJe&_ zU7WvwNFLZ^Ux^kMG&BL0&vZlwZ3*&ZCY30L1}WZ(e*AWZVwZIPJnCZ|U>kTUTdc2~ zD^|ssAnQ586cy7wy}STbZQsc}6X=Hu8|0?P$FDEWsC26kjr81f1}aXN_kb5S!AZrr zKCQWNTjvd&4lC#w-T0$w!QT_(J{&XzWFz@RCYlyl>S_aPgMpdOon3KjW!Qp} zI{7lTH)kI>LeUMre0J&^+s%#GPzGXE6XtGvy}cC>tI1+E^ygmN2cK;ItmQ49!B({xr|lFI{>JWt$q*y6Mr3|+JGGtj_1kkE<9Td zfK38-d1z8}T{WuaLnQAAZ$**9$D{|BJN7j^=sc2=xBo5g^3%8^hEYmfH?UVaxPa-n ztR8T0_=XjFcac+I$pZ|w2F8oN2$iTmI$=E8)w9pbV8go0bG98|(JvJ)L zYq8e{>jgw33}sXg>+)`~S!$!6YTsU>eLwbZpVys^$zvcV>}1gZ=3Ge5gc#~HHp`yJ zr%!|48yR8!mM!%dScA)H7D9>OHC%$jF<{!zvl3q>EP{YL7pl2ekT8%5)DMUUWxd_q zD=V^N?dx>I-khoo;Nugx9(~%0^`4;(Um59W)J{A`m~DArVEW_Gnw=>pfMw6iHOCRcFxCeEe`%YcM%>s5d;G_JZGNWz;CN_mc4YBoZf( z%!E9!f*25ezb01CcZ(M$&K%j6^WctJw}whs0e0OFrT+UI#`YjT5;G)1;}~ZVw?c$@ z@@}AoLr|qdG}D*A$8aObET@?20h zuVkBLF_cSim9l{-jsyv~nqae~ z4k9?J;~N7eskQWL){xD_+A=x!xzxK~2IWpfPl;5e3&(tjT+T;4e zO`KRef^4~hTMQRMpas)kTTx15no{|N8~O2axydU4-nLlj40&W(<( ze!j~cTi7KeU{ttOh=L?w0zoH>8KJ?#Sa?v)R0-ZR0eI0hhHls{c-@$i>=Ea)R=KfA3&suFoua5yMV#k0*FD%PnVcN^{)}dkNp5Vj zvtOCNReh~XIa@^4ogV9rVO2H@58tu1%rVo4$x^H5`IgBgFec~*TjXeFee9SVOK8u6 zD=!}5er!*Zm2JDNn$-iC2l@ea%-0JTt<<-NBO2NNgkwi6DBzWgKCcNbu|y`1DcFyZ zf@+ER5tTAp>&y3^ZIq`ZyMD;TiW_ob6b_(ZL?lF7)I~=O-Ai45jk}A>HW2=J@&x99 z$&~+%=F)bj7U(D%5|4y6vWDdC!qoA-v3TFiajJ!gN*aWTpa8>!8who>D1S|-df3$to_yWqr^#}V`O z!bO^mtPEkP$Mq{5^N#1m>N7LghF^N^__$+tyo7Lz=?0c?tFPh{*7vl5dGTn%mFV&D zim&fzP)I=tkqY+@3NiTkSCw|tQjv#l6(Wnu0Iu>CZskOz^<|?2PELEssfaQjw+BRv z{&0v&_nLNQb@Ov3-OiDWk^YlO-0HOK;cxy~4$74q?RLkzb_`Gve@&vR$J%rsb4M#F z0r8IGb4{+CN*)olp8_=_X7{_9IgD9mQTg-+Q4)*;bhFg6J|1rzY_gsG^rGzQ`SSMZ zQ^QX74_RrY+CSPqnQAXImU%AHzLQ-_dyqv}<`*=ckusk~Av2Zw-E{gtEr3dCo8t=`N$WftmM+oRCGPMyC$$YqAIhAketRfw z+>q>HL`};CpE8idZKSwcAGF-z&=mk_ee5x60l6625+h{%a5HgcCeINV0n*%kL?O-V zw`_<1x!?RCU-y}AhV^W)a{g!?mC~_sWh1G1bKj1#hjH^93rZZ7uis`Q*1EEDJ*5A9 zy1=@dZ&H8N<{%^M zHOw#UZn`x6b6n^ApQ7wwP%=>UTOrBn+}Wew6Rpy1iBdSo0{sv9`zVvJt(X~GTu_2o zi+4i>Z-Ey-?@+j{EI@3ueZYHe#PR3hi+>&sAFH0^+qq+HZlqx7!7IExv#+oG&SW(S zo^@_mvGr?oeL?M^Tk{L_9Lrz`RblSLo-@bo4nn%JJCsh zU;EU<@Qt_M+0I$plqQ^yckDILzo%I;h2 z+AL{Thld%V?pk_t`dL zs$843MTCvGtudvfeV#HwrVGpQk7*wO@m|1PwcB++2B z4hdg?eP{l4ep(#9i12C2jg`!@>zS%%bD6d-FdwZbZT}0w)bOvkp+BmM@7Bf+;{m8K+W5YJ*hn-$wsywZ6v-RO*E(r7p83uvT zbTWZDHX({^BjpdOn7R(D43wWwAf1E0fdIn58%Y@6g53lw9y&Q4imv;4wqs4{ruy#_ znxhvwpX(VLd~T-o?{t4?HJ&OoHK*k@`)f>?d&BR;yCRS7sqXppHd^R=&9Au86^A~S z(~VAEjM4I?3RDlC=n-#j^ZEQdxvACJ_jN>U{Nbsr{l}lZ;Z*XAo@TuwuzPGO^+TbK zm+oj0n&m=|UeqyQM;(f!61&8nl|dkB(g% zo)GFid_}*ZT>VF~hUZgem|0IORIAsS7fYO=Fc9D zzEPG@`r+3G>qL@e>>IzWx%YO-F|CW+HmWT6>-4$T=+6txhOLWD7IG7P|BSGmHch{G z4^Ywz;*nM6{frsb7FQveZS1hJX&s~YesWfnKQ5h*E-pTAtYqhaSJ{@?Z8zWE?84~C zJxK6S#&5F(LMeECadFO>EX6}cZcv=&1Qi1wzPjw!@VofgtfXY7X={goPJm7`psvpTR5-Ce_9$eEWmh$#+By5)RS=pmKC;en_@J`vqRTRwt z-sWK67ysl3$IZ@hCT4d83gsN^eKsckiGI>)@QKySt2dspalC%=P3X77*Z8>dhElug z*vdV3q*$kho5$5H>^lO)edFjV{4BkLLtFqTh_;l z^~sFX_NK)&%}46D&9^Yrg~i27MqT~&^JHIg@q)mSoaO-I%U$6wiE$#?J%dr9-R>fib0G8X-E@PL--eu}o}A%Gn>H^U3l|fm)9oUojS=+g1X-${ zH^#SJifnf}^@Jt+e4c#vs%&-ZV~zFh+|YzK+Doy%F?`tW?>OxA#I%L&^>a~&!P^hp zM_M-s6piM;Ih9mnbhg|zuWZh#xbvLHh+p5ZJU8#)l>Bsgr&3}0g}sG^${tFW)o(mI zn{4&s;j^zAwW$SSJMRn9v6oIwsRUmXHH%oaGx?)AtI3DcPm-IH3ktN}58gkPx2i@Z zGR;P?zs_twZGve4I$8L4W9b1qyxSl=h4)Sd#%0NzHav6lFSsryit-26CWWzz*T-1u zB8QH*{v$o#dDZU$ws+O=zp}CVJ+w*W&)Kc8k|GX9IAK`?7f}tHNv$QSbAXmluD+R` zm`DSLJY_Kp?YO>tDwFKvO&`z8aj}G7@1rgbc4M!-rb|7{t-PRNJvW?d-Xc_zInc&Y zEYHq)>TtReukF>YU$bfCwzU+Pe;&;-%wu_^E2cAlPU;lfz|cBbwctNanP8jbBS%+# z>#wqQRD90mA7Ho6FvV@wu>mHe5-RJO3Q(x)Fmi9V2c5N}=6XwiM?%nY)j8COePbv0@g_2K2z%6+j7Igpz!v14Bun^r4Bgp&KtY%-Q#{aikfJXWTAM>GVWQL zYzXw+fLb@K1R4?O__mN*7Y0Yzfr=@|&q_O%su>1$36AGHRQFDMvG=yDq8_(jRb;1W zp7o?E*N>jwH5C#4?b2pvwpV`p-o@yj5ig)Y%gb@^%Sgd!Z+BQsR>s1Qr+3@wdv1%~ za-=!yPo3{hY0Q{`U`z_i6l#yw+cC~&g*44N{ zHLFSD!Z*#Qa?f)6J}BK2iGTAkzIDsbiE{3MMR(!V3A)bNE9vxCm!fecD}tx4dL(^* z`*Kp*<=YU?Cc~b{ODir9(b(jFw@}Wy&{VzGj7Q=2ykz`=eJ_Sq+6qW#rq}VMtL62N zo)j@3qxaqJLmY3QyC4l3(N#eln2WL30&996I)C_4Fda%!$P0aaC9zaxc#n#LWU=1S z-QbT>ZoAkuIC(Lw zm_=aQZfEm-U#~=TclQKyNOIiROz&S5FJLEKbSnRe-_!LQ|GD&Xu(^XzY+!1I|JZ?N zmTPl6?E>~U?B^Xa-gCfIqpmaTYT@(%?XQV(o*ng{HwcIcMP_K-%T1c<8i|gD-qNFe7nxLB5@*b^=V@4iA^})f*IZ4X&3}g>%LPvE zh2Lv3a_;B@Bh`znT4RtPwO^Q#b>kz+A9Hbp$3%Td<`am34HNQDXqi;H?=QX0q5K-q z;|S5y(wDiyr1xoFxv+U4ZtE9VFn!3p@z7Fm<<=XsLA6$>-XRYs4r)}#B{mcPRpQW! z=R+WjGlh#4n3(8yyRanuwIOS#-jRnlhu`%dufTsA+F6yIEw8NNt=F)dFYy_36V-J& zEu|^OX}!PiNTz9u+`$Jj_uQ+@rfL*izHg2>bM$*anf3ktBmZ=XjYNx@UhaPKWy#fL zd|aqL$fDM`g7%ZQJ^k=tQTkkdL(@XrqbFINw+;puQgSCM&zz24mui=P=CII_I9BuD zb?%Mx7Ca*C57^6ts*uXUG)c*joeGuM9#j7-vD%F&C;Z(;G^?>Wb7 z0Z_fv}V~V8zeq_ zET%D#EVGxY-&IuYOoX=`-zMr66qDQ$dE4y743}*@V~Xk7zJoV8;;hsW-xv z)Cw?lA}|(+Bnnu)Sa}aIsG1MsG`Fn(YF=ofdE3KtNm;G3+etp5LpSsH1%AE59W_AxCZQO*u!kSmb%u{S`?23j6759G*TR8Q9zPk!Q09G1Ie~jb} zd~o;TRy9V@XwX3T3@Ltsek9Q3A7leHF+%WSBAs~F zVe)VtStm@^pk2WJ^A8LHVLQ$By#1p;%;$gmcrB9Jbk9!?+qHAt4J&t9eVM+o$9*jD zbKc>b1qqS5S=8$MFGDXmR|tz!w}7=`@k`7Y+`n4iBz-_SR>FA$g-qbXdSZvb29<6B zbh9gu&qcWcE>-c7vEC4JP$%VSF$b91(>3c=j1XPBc!t`GNVt`D?ogOp-Tx0Y?KsBo zK56Q#PPye~xX2c&JW?F0fTDt(!TAOK4GXK`MCFf>cjcUJMa{5Btg6DgX#HH^I*}R- z4}&iEv>!P)Gp`TUP5Me~VDwo9CrV?tq+>8p(Ov2R=T{502FrrmUxOFcf=m=drsg?nbCvrX;A6VG;W z3Pkq$KyyRpU$(b%pk}k$Xt;mBt`VZf?8_vtZ0YCmMfREh`&8+W)qtt01Q7&>P?}_f z8Z!RHYT>!B$1U|fY@F58noQb%+Plg;F23Y^p^R%+u$$|uwBE9YDvrm=9j~5y{@8&3 zrFXfivM8n}RgmxU1U+`#h)Pr$71iZpBV|inxqk$ImTwmm7>-XX3wl7Hc=W zn3Igt8B%t==23p(YWVjUwk99@$eLKuB0DWCA=V&G%v1KA_Wm)!lOB~h?Z)@-XoOrE zw0e5}`x_{B2!I&H{V8lFREo|r#L?ir&K_C$OfJ>cMhB436&_<`&f-GPCNNA?dm%I> ztCitCQSth~;-`?BSD<+-$~07Uk0u*%xj$d;lcg8V zZ>w7u@7vq=G}WA7Cg6Bub}X$#U;r?3lk(MJVi__30f+q(h-lc8Z@E68X(GW6j; z31Kxa3s(iG=XK|17^!#C+3zxoJgVT{>eC)MZ1XEdwe9Tj3Dv&MjU(HAeV61fFZ7*v zZ8=af_+QzwPE5pq&MEQZTNj+>Bs0&c3;I17dhz~MjW3; zM?WMhX7P(zxBeFOmUdZnQahR|8NZX!FF*cO=g>Xh<6O7&OzP?f%ssQbejQ_ryrUdu zoVI;y@GUu0@h7pOwzXelbV9r{Rs0J=%Ei0=-y8r=TW_Jf&R_2o_stutdBy|aK1a=z z6#Wp_VLaxS`5KDC!tZACG!;qgkR+>}Fd;-t5&b7^hG4f#_OgH`H^SYJz@XMD7v&9| z%^!hvghV#XDaHG4_YTz!xi>h|*LKcIX31;V5Cs6`%ILHbKKzNHOY7o_ZK+g?8S_}1 zYsBV5fHI`I#D#f2zaZiH^UxD^hEj8drP?_DGKDS99(qcqr2%u*xp-260!?CS-`z4w$@@pj&AxND+p_wkau+BH#}pqc)@0Av zGpoO7-aa=ae{z9Nh;HjwH#I8b0<&Ed#sv8X_||lVAo9_uelx4v)owMZ5|WCYlnnke zmCSfRQRPP&ix{u3eZV6cuHKY>MBbk%=w_QE++SqLEH=!z4`E6Z8VWVgyC%hfG0RDE^F^8J0Yy$t1(`GXs{Q`EEXt)1^2A1Qs*}x$b7A1Da#SC*p#6q$B_`C8^W`#mtP>~ zPPJp%*Z23FzP1c8$X1|;U%|x2QS~77tzd7zj=^cEl&BV(tgDtvuj@A!%lZ!R)koG( zi6Mw5?ot&@Q3CrGNeezOMeSps#cS6-C6)?2e*vxEj5FH0JD9 z`@5uvWs&%l=~G;mi&51)X0f?^GT80<)n?0p*!V9ht9- z?51_L60Z+=>q}hl^1`?tz{!mAuC309r>urHl021^Xu~tm5`SJd3=ZmN0vQxdT$*|rJtR_FGVX_Pb5_3cHEVQ(> z-rM%@bMsR8S-=h)vioZ?Jo~Pv^i} zrGtC6FMQ8nFc)F@{kffYs`P7V{#U<0Z`d^I*n^s0>@9tBezub%$whK#TX@mDN`Lm* zN9vcydt06DLKDBP-0DHHylducVP#5*I_S^mWox9`e>}`&j>+gl2n9^mq z;jr#DweQz#wP>%o%c-o!covo52tVs&VC|dT#==D#8-oO|+!ZK8zXFzVKUUHb)}I0l zr0<5F(g{r6M~g3g3z7_adZWrpF+4BUwKaab9M5H5*2t!O)9K=o3Ac%@{h6nur^jfw z=IWfhl=#3_{8LZmtMomJx0N(;xi8Gke&@T#?=tj$4fe7E#I4~tcKJ||3zx!CMM3kI z>$GjT{m|ARc}Vt0%v_i=sLM2Yl(_DjLFJ|u-fxL2NN(5A-mh8(=gzyN*arQixZUr( zRc*v^C{5+OcZpWYNBjNn_R}0k-w{1Fb+X?z#}G&-s&|A6iTHOz7f+c$dAi)XuEN~UhK;*QI%k5X~;MRA}5h}VO1YBs=mm{cFCVXQBw=Hj7fBR2b;KDMGgg= z|EKlzqS35#jz{Q~P@AEmjr;c(Mt)fEZaaM0&G#m5$;*bfF*^s8vx zAMKxR;(iy#Ri1C#kVH8e`cw=5=i1S!Rn5UZ|76_|ZjT&2Uiq-;_o>+x&TedLD}om~ z1jJ+$Sw^2UOnpgwRCVFmF~8eJ&MyZoOXI9tev1g)DGV1^VOB%VzJw>VP0z+=Q8XqB z)2!QFuZ0K4=ObCwT0V(W9oxjVc6*ovqD@LFR^E=cm^(K?*iLrhfB+^&eVBD66Hyq~ z)EExgmXx2+AFuOFoNjcTY^7hHUqwHwCdmgEb$`CC%GI8qZFFczZV`( zNyWY9y^m(6%4&>|xt+PidToaeYBVhQFYpAr)ZMn2%L(R_S<#zv{Zv5+;+SSD048C~i5m336h^a%M+V6JW(>&_ z!wD4epmfKD+EpG6+MmSy3=jkSKdOO93x%baLzcP5h^LND2s}CBU zn>>2$c=2dcpyv>~OreG6gt)2h^0D35lkJd2GQE_)YRI;F_cNnIg3I^3aQ=3kJ&StW zZ@dw1vbXE;c1dK+#fKegrGD=V&wPw4>rLdTN$CHm@|z?zMUy9La$3&O;AdFw}$hqmR?=*9Cwh@D$DJJciyhUV+|=e?j`~0B|7%N z+@gon5?}f}E?KTwcW>?Ri_hX6Hj~jQSGXFZx*k;xO;0f=yjRsD;s_# zp`a(fi|3v!#kZc`Tca`6FkLUBC&OA;=NW%{(_344+v@gGwvPPm$9=L-AKBrR6MWA- z{jp=*n0qAKd#O4;zVz!SF3wDp%yF5Qs<4rNYr~c^>lR{n7k(}UBdX7D7pB5|9N@Gy z{(wEpO|l(kWTYN5$QQl`vBt_cZ}D50jQPC2${H5MLKKCs3PePhhAx((bus2JptGgK z>_$QQcDg7TPKK7aXwz^HQUMp{iu%9!-qCZr$*0|_ad75%$LQ1IJ&?H$rY}sDa7-ok{%RYf=xqKJ%HXA!-xobO$j+5i`)p7q^VsXF)_vL3vv;m&Jct&q zYT%fLFZQGVv;aM(m;D%%z9+r1OPtA*&C3?N*Hru2DzzUXUZ$W5j5@r)ANwHly#UKO zjMIDv&T$vYd}7FnQPnIieFc6DS3JeK8^xbv36)_b8(B78zN#q%DHBS%%5vNIpEpOg^Gnt(-I_Xg3weXqh*K7laY56oCC4125B*7E0~W)*+Oq?z90cfCSRg&TvdbX%W#xh8rQ^2?m5 zl04a@QGc{_pPC!z`lfRfn^@7K#cc1!=v#+tI2BwYE*j0xjx{J!KCJ$wuFo84>npAh z#>fybGpap2#9h9}mrDQKnmAK)CX+{eTOQS`Rr8@t+Fo7#&U> zp>;x?_^%D z9s^0Wpc)w`Cky9bo9T%_u?A+JSvh4^kbROR^9cDk8QpnT>Y{S1uGGs835`=vTUGtj zZYjevUp{_FExi;R6;6Pz&J(0Fi|8%mjhs#@(;00!9~z<8n-jnjE85bsT|e)@ z+L;;J=Q}fXCo+U3FZOCt>f*v}lgeBIjwmmL28~W<9ErbJXIhZplCHq^xsl#K-I;2tRqD#6PN$KuJ8l=0GZs~66 z5|HkaE|Kn%ZfQ>V*6IB|-w%!h{%rPMIp>&TjzKIu@i@bO=h^Fr7jr!Eg_D25^@tp1 z3P~D9?VW1;%|oNbM!J4x3z5QF1DZ#*zxQf-11e2H+&LV7%|o9=hgNMGHRrHu(YJaF zFC8zwXCfh~R(SPeiATPq5fe6D9vr7umdY7x*0)5KYLx;^-rWcj22IW ze?zsRLN#uHE-Qt3UC*92gXgjE1ltb_XYgw822Nuk#mtvJ<;8S=_CBas)4S5A?A-P% zsZ5hX{3Aa}O*n6w@VqdSVKFu;Zarb%-}t%2?q@b6Rn4|HorCCA#&K0H)W6}ZN$PRL z&z`K>tVc(Udej%T--(5tgR0eO_~O3aMkFEq#i(w3V8#>@fY8QL`&zRNGwv?`i|mTb zmy5U+#bE<`-v{_uLHVyxuO?8vhT00Hb6E9&D@41=fef4(AO`pBbHm!QOq7U5fd%A# zYpK_paSIX1)R!v|!{FB#6I0!MScYCeKL!v%-jXacnI6zqoCWAYeCAF zRLDK4m?5Rmt&r`A&o6uLRy@CEyeCrrL-S#c?o4UVMxCa1+tA`H6+Krt=|E>x!qkUo z7(>0xs8NHO=%8&J1w-^*VR@T{*p=@$IEI}N^1}8=Y!Y1AcKRnGK~fnN>oVV*XSBl? zBH}KvswuXAR6KCH;Mn1CoH?)nozB#joJ^CVHmg;D)){PK13PtE)tmJlY6IeMqYX^`E~wFDxg|j?=RM!o+pLKek>qA#i46=e()HQ-sPs1Lw2geL=3M z$uzPSI{xQiK9jPzC@wQy(s9lk108%2In|g~4Z!Ev=&auCu~|e4?9HF))_64QT5tjd zS{gQLZ^r!81k8jXIa^U=iz;!`hnBTS4fD!ya=CGwVA^lct`VR+3GK3i_6$HvJ)njQ z)no-yMo@wJdWr}EBYrCv$9KuS+2q1!4mEh^g((HJgSKm(|AK(LIqhdEXuvI6J(pn2 z^>K2oQzwBnK{#SS&K@@_2K?Hk!ozwORZ6_JyBMvx{m>+VkmvuxFv_ z#}1-Z?7D@X@j8A$eqxSOhr|N51lXsp}P}UZ0`%%sO}zjhJ>dEk00++yQzx#o$_nD!D+dv#q6Y zV!ODoI<1>Uk`lr)Z&T>qTW`a0geAJoPQ&fvPd}1fe5sU30;lL}_&~DDN1@%RpN`?u zV6SGis1Hx^l(e;n6c0foREMI{IKKBsIu%_1PTP>J9bk{>q<|EjBrV)0%ZV z4;LbE4?en&m)R~AY{i2DYVXWYSV4F9>a~RTfJbul!^C8%@@rl65T(VDEI}G(i`Hiy zaSk#~dsDw}8`IoRy`#9g&Z9opIxj!&R`po2D6w~?NC&n$u?j>a>0$`8)CC%ZCUlDg z7$PwRN#@O2pSih{U66b-IN9~9o+(&#KfuyY|GoWp$02_!q3N|3`$P^!b>X*SxOLN} zhX*z;vT)`UTa$xdV`}uO@vM-=%SGo2wv8p>lRGV)e`zeQDo%dbJP_6dtuDnNse#ts zaF`7;0rNfSi+NJW+f4n+m)no#rsMKPmImvafgd@5nr5 zj}~6`+>aCrdWgMKmPT{umjL$oxzfM*WqM^ME}q10dGyy}UwbNrCWT3utPI(ATe{^e zV!E9TnOB|hdZX`f3=yOAr7jo2;ZMo9(pPy)$rLJ8v(u%0-|(rcJd3c-?nau8tpXp3 z{NpCCBWvOh7wl?xo1csN14!>QBQ}{9ma1$Q-P61Ev-A8z;q?$BYne~1RafT->m<5C z++t99_&VdOoQ{`QOq%X&rKqS1J#}50O7@8*=i6WG6`eMuiM(t-?}as@k^PQ@jD0KN z00pa0!iL$e(PW&5UkBwEC|SAVgT1jV{XwR#F|c{f=Bflevw1iSUuUY!?mq;vs#Vv{ zzfMMhS;tk+cFfy9^$=PJ#9s|zcJkEyQnle^+8S) zi=mO^Pi)q}@dKdwCXqfZi=|jtpE-p}Qhxh3<*!1!l0LJY6chb|V5OMxe5lmL+dc-; zw7}5F`gn);!~Tq|m}$*u`tvljUL4{!$721*9%l5`6$M;wy-g|n`E!R_wN}DwmC>7C zrW^$pl}2EpUF;t|cP~tJWhbN%@Vn!l57EgzIl|ey*oY2DzJF|fc!@Mrx`12{V!R_k z-?WCS@(V~#>*;-4=#A}*fFYBO;b_aJ)6gqka}q(DSJke*c+58@xixs@bH_s6e;^hx zB&ocdf`PZ&YF~y^{+P?b#?^%Xuu)3t#L#}$9KY9Dyg)l$_`;m>)DIRJ$*qoH+2kNW zkA45S?HG&@#0uhT$dD11`tn{*%jntTJ`BHhrPFwguISxjSCb~63VYW?hwpW3`->x# zTcN?gn0Ask@-jMabDn;D?$%E~8#;U@>$Tl1u%D}acELI()F{wCmf_j^(MMD4bfLm? zsd3tL$cwWSjAT_z5y1j#@x`bGSovYVhUg<`o&;|5V;!HMaVE$>Ks!lks@(Q0s6JVN z!xZK!R4`H+8Rjk?==sb=bplj6NFumqyO_#W%lSsS@%5{2AP*!D)MsuFir+kbcMe~4 z45B?lA72R9DA)l-K;t1SD2_s#!T0GcE`w(ON`E+aG1JcP9fx{~9bT{;@FKHTe@2t*aFRjLG;^L$*(1}KoceC zI4S^mH)!P&hJm^a09qPU>=QI{%%IUaeVaQxE-=ZM_0ZVi*!0UrvJNT;#4K19@si}D zb`DvL3%Z@NwQ;oE=1>WfDw;l+G>@TAgaUgA?If~)dd{uh1Y7*ntuOW|#Z(Fjd5;U? zSN_d-6&{}xKEBGBE+-+EPb!gg-Ot95RaKQP{F`q>N5xxvYH|QUDv?^;MnDWP|n#|m^at$x6C+(Cm4YdyYA0f!b|1u6SBlVrz67Cgzj z7kyL%f%)slC&7W|tG)`sw1~D6K4?y?GGS6XfQ5OQ3Wb#kP#Y&OPn(-8Ud$Z!zPec^ z$w`z;c^;?cRfmrXN2nW9a&-6#5U&${2MDad z4>EG`TpUlb08>I45T+1}#BaFO6(~>ss@NR%D4dMj*$OrgYtm?fqP3a=l{m>D4Z95e zZSrnTDdC<{XXT=@_zTdg%?av~OHY6Hb@XNgbSk0mw+tF6O`jjE*>JPtZZS+4)(>61 z46Nq@a)gKmZ$D?LDYeIP8M>P|3DNdJ0aZXGW^?yZ3(d9V+e0l=i z^%njc(54|2+c3z`soT~9Fbht2*hs1X1 z2QHWx{~W~kEc?;87?(}(pd+V4_c0=0_79Noaryz88bK}nJpg!sEMAd#I2Py@h|@Im zh5Cv>+Z*aB@U#Kl1IF^lTTsyy&6254oAiGNS{A-JvAtmVw6_Z_wq-r%v_GK7<}Z`* zJY}V={6!B!R}noW7B4F?g2Tl{nXA%LO7!;6C(k#i0%qZani5SB$oSo`Vb~k#wMi_)u)k8`6&-vRdO#qZ!k7viwqYxLv@PC_|-jveHxY$q`ae zu~d`2lcB*!JgXes+M9a2UjEJOWMhN-Ng=DO{*BNXCR;6gYW?;|-F1gSPVCB?QngB@ zor?B>A&2JWyn%SI-auPje1`qR_p59vl%?zs1v=_`bIos_J)H4Io)$HZno%<5wuY-1 zt=3BLoKvbck`(cHu(zde?Rr>9d?B6h)|xI$CNPc`l5JWVi$r}mT5rr)uQCkpo^Cn` zmK(7fua13w&;5PNhn}-GKuYNL-DKL%z4d)f3e@t>W4|y33i3l?V9<)E5UO?JAwU9}Xy<>}ux|jT{K^O;L_u{GiIC)$oDSHHan^ytO&+vr&3dQo+urxR5^F1rct5j-~6 zCn=b}hYoZ%dVUB)NJ(1FuAI-0dsJ>GORu_qA+23LwbAMMZm3g=53t_M-9@EctAua* zet&LX_FVX6N;+(Omz>nb_Ys!=`h;?s_~&Cvhe=NbciLT`Z#OX^?nu67$Hr+ww$Vn; zGX))2+yH{0WT@mZ-5DOsaqE7b$C~$%{NlGCe=c)6Oin-hF8_LvRAIk4o9BHv&4hsr_yw_ zV1C0lqKi+0k8LNwJkC<&nMsq?W+;V5U=6!puTBMxr1i;IXU68UEcdPPjAGl_kd_nr zPUe}#e3KgmN#_QuO4%F*CwsJJQRmNJuARwyyZ(I8c|W`J$>XdZFV4QD`Bfkf$5m`j z6xW5&bdaC??S#LpL6CJ<=zCqRx{Q1X>fTSn97dDg@pczGjnEF_jEmkJ!n;2yu8+;# zPfG#^*M2^iBYb`atyf_mQ45VA7fvqfk0kWCzwejxw@*J{|y ziLZZbYPqA6Rff-EeU?Crv#;&#x!GPU7RmbF7)vdzmNwOr1N8>!T7X@z1*Mlo^!e5C zkWBG&3E`gb0lbg-IZDf37_C9eZcfE&LyY%;U|3#jNtPbNU!MXUG>@liWuF=sbg?y} z7^^e^@1;SLfxW3RLW))5p@ak}=M@Ra{_iHS@J-0$0PiyEwUDGAOZsgIk3rL+HjID} z^JR+f$PO_R+VN7JGQUp|bK-v_o+F6X8fD$sr$S@=hV3H|%~fKrHJVlbkThBI>0C+Q z_)Vm)||&;Wu4ZTz&GW}e4-ZO07ggd7dQUG z-4?P!7E0BJrAf9Ev~OJxv459qq$sOC4c(03pFe&ou+*ZU`g`v+b5Kj;jKMA7&#q!j2DUo!CoV)X7k#N|jzpE) zktvh8D;qVF4cc-xxUb0C1~87&veSvf6Pf+C8;EwQloCQBK2BksYDJbqMDzKU^q?8tSB76j0D5+ z>OxS+9P&L=J;R-K|FZvaYb-4_S=!5-tDNi9Waf|ltz2Z5H#l2J?XHs5Q1y#7lKQ4& zO5d?mUR*x>*H`m_s^j%$qI?=#aIDaM7_dr7v8ief0WC+DK$G)3Fyt`sKIQ}o?x9QA zZo83adDqta7ta2W5bAnDN9R+*H=dVUYEiN#zcPo$;kD7*olZN$96~?RMfyKJNdID+ zE`6=b({-Jp@}7K{iT$gZL+iL7pj9@K_%Z&yjg9tq+GV&2-JH+1)67M{=SQ(t@1$~! zt7!wbOtWWm#X?8S=N0&%?9=H6?#>FspAVNsu-{Kb;OnIPWn9E@LXnSF?=SrxlGSyO z-)=ixsAJG~{P7e`eWKBRK6_jq$fULyN>41xj^_~_Xq1nvR10A;lHYusN(Z5;4a`3-45gJVu}MkyI-jFNNhno zSSsIY5ozMagSD}2E4#e!j;zjcrOI zWU?F3t;1I>cfz{C*!%ex9C0Eid8#qHH)#A#Yi2AL4StUgkyPKziFgXPjwX1+3UR_& zm5YgF)3A>Ic*HF7A}haz3LZP^Jo*VkAwg)h`ZEGaE=XaZRWZN`htd+MRNmi0rnjfEzqUM@%ojx(y&Zd!Ru8PTA-3#z~av0>ym9mUP(@O)o*&}for8@PR zYS%QWz{r6J*5nrR<70c#<2&&MT)EA|%nV>BRosqq5bpmy*HqmDcPoByYyyocTz-1H zEAMFXGHH{3vdB;N>E?i2#Mt{eC^ZP&-Nl1XMP{3BxEd$K6Y}lV7DkOWC9hM&vj?(Q zNr*A!!TQp$(;oZtqf&2n1M5l9f{plX!^g!Q#TVe3gEe}D1XoUyFK>)KLt0G+6vsZG z^*34eZ<u)?opFR*;EdO+jl={{h$O?JBMQ27m6}d^9LK?;p`lTOrJXe> zrbP1j?vK84;?Ut)^PSmW&-5LxNrKGZ`-B~ai{^Wuj;$lQAX;WreP+!{mw?Hmz&hjo z14di<5g4N<`@_9oZA>{n4}|TD9Geqp{HYCH9q)4-*I%njJw*?mIa~;m{JLH`o}2xo zxHVU=duQX#r@UdjSDYrXnwCBEea?dA?_&0&#rCJs2Qx@QnT1_# zp>d6{0-zK6dNXQpY-}eO-(VfMvhU=DlH>!PClJNY0Cql5KPh(Oo|hMw6VC>|yXi$% zmgzr%s6+&sB}wKjEry;iv-?$hbmY=s@T$0OK>t{+(VB4QHuRyuxalNq92xt$ zlF|HpB{iSZF6{DN#fMeljbB79L+Yq&^TZg7lkUCStgWuMO7+m_7&#YPa>?1C(ictU zU%mb}PaGh!8Vjt(V7PAaU3gQBYttI?iGXkYMYfMUj_!2h^mj?*k0%8BwmH0=K4Sq) znr!|HqR?9|UtL!8^b=hqQr+r$F=sH!&t30`=i|{Ek_UUMsRN<&1Jy>PV`MQvz^7-#FmorV8-YgMJ(c& zlob2DUmR>Hv3D&j>mOFv)wHy@dUIL&n~q1!PlU7Pd#-|ayX~5+F3ZI-k z%HHkc&p{YnPnY}IOh=BH&k>(}D;ma54@BUA6Psf%8aK4%h(o@>u+tCfo+)rKNYNip zyZQH3xrWawMe%y)`5nK&-4i=)A&5sJQ%;F{{iOi95h_a*_V>~CQ{&SpF?;03oM6<_ z4m1|syx+AW+Y*tii6F0@(7lB$&~adGW+FB`I%E|@mcY*(PPh1tO!~_+Tf&Oyxe(1T zXcTz$TU(|pn8?9`KPc$Q0g$YbaLTwIXG5B=TnUf5=S3CHij?FDHlx{^V;Qx zIc2<1vheNl%BdUI(IUT2@p}fHT1+$PPZs$~;c!7MjY@7EZcGi@kb9vw9~`%gGrSQeTed^%VMlT!74^ zk2YS$=W_i)1hr1bY1&q43*dfOKfxD9hPd~Z+{~w_`^@I-(#~mH44)o0UXJ5OT4@x& zb)2G^!z+F-?>)Pa{9~FygqGopjd)^88iFWMv>M3Q$0LBk{@LwTEYwaA+Sv!B1qpyJ zF94agfEd{pklS|S>$?;^D;lg>d^rlaBIGKz+bCM)c2M6PDb=h;2m5zSOml5O@z8JM zK^Xsh;OEY^_sCpu&whzP&0EI9`rMDb4SLHB+{znq0s2$-qlvqBR>#Z(K9z;FMqOr)+cEmRTEQ zrnNuj{8w?c)6I^%!y2x;O1mhhfFHA%0pak4Jj30=U0NQb!^@AFS)O!YU`<~5z`{(2 zIzzRQZL>WN;@yngCxHC88N2_+A(K8Er&jDmg>z{$7RL+ot-6dv#Z!Ny>vFkAQVy`PN zs?GJ~xw7N7_eC>g$6KuZp53|DV=K~~V0o9i>X<8F?MdfnK5pds14Mx1TscJl;lBce zSW1wV9*OblJ^H8QBxPS|#9a}!8Cca*2Yp}K-}W4ylW(VD;C8-}U@X<7NE>U7s4my& zlw=F3!Y0O4(EAY^QeWn;|OjwBMUFQxD7j|!}-Js{A!r>Rx`q;QbmN5 zrZ#o}H+1jTJx8ylB#G&{;GDBwj|SY%BgSKI&1bkevDY4`m4{j3GVYz%`3;a%HGQWt zX3DB8ePB)6j9?lY8Xn`{cjJS!)|*_-s?}m7SLo|$7eh+|mOwQ?1%oz-=MbvJ3a!%t zLpvBCbqsZ;^*QTC7>C#R2~?S4fynL8PVUcioxVQHz6sa~Z+>s_*`4@O*lC_`FI7dU zH5@NUUgr@xT{wY%Mt->dg8rwb>2y`JTVZaIF&)Ei#Gfk2g*b0NQ;O%-$JSPK%$zX3mS)fqqn@Z&U$%_EcYZw1ktpRox^ZV-eEv( zV_u$BaQ{hnN0JQPJ6U7;=@?Bbt>M1Yo2^EpB?8!PQvAk)V%YB_=`97dYT=0ba>cn4EYU;Cb9u| zj1%M^w9cK+=`_N=v-=J*luUdv&(T=}A5Wv!A9f-$(L)mtu5S0jF$ivt#`5|-CGNJ_ z^d7H6Ru27v{uVIqUfBo>daaNy>@Q?&yiu{5KHR&dSk*40eRBafr&MVI%k0CG6tQEc^ttlx z6;0PdyBTD0iJ%|6`5^O#G&>YUzi9Ozda zEymllHs;F&d&o_jI9tOf2pRSqFt$bC_h&K!ScXWNtuPY?oT4ft1%T;xL ze+tPX6qgcr6pK9^6iV!^K1|`oi!~e}kUO###yZP6iJr zOAVh#e^>hp?c5x3x-7HiJU9&@cj(n_1`QB!9IQ|@=quHeLlY6m0)nU8#j;aE7ju~< zAs^W=p)~YPCkYOe5O1OQP^z2*F60evUk`|oj~}ULw$H4cAry#} zo}d>RYy9T(S%c)&(}lY+^*CuB=x*LO&^jvgev;k^GIhFiUTCtx#!&D{6uS#0ilpHq zPmh(9GdFaDH+%<)XzcWwsL>MN&rcMc{!#aa>oV0lz$xx{hL8nO}-bh5|aYMCYJn<2a}94mI-(!5}5EZe;g3 zGlI6`0cHG5^cp$dZT|LGH{g;rb3T}5$BNYW<{MqKPm8M;G>9n3RD0tXTbStDw<*yd zTkvYNm;Sn=Fp2wXUo4Vvb8vYOt^60?Ry56hgA#%Hy7nJ~yoq9S#`yeR6z>xit}88} zZ*WAo(^91DfQPTjc6vDiMb zo2R-uo)EVSRqkz)7TVS?jKZkxE}EMulJQ;mQrM46|KjNqEa9~+2g=>hkxegqzYS~Up-8KB_@lgg^jG(kMGCdNu>n*kHTNTB)93L%b=ReP_H`BLHhw50lOIS6q~?&{pjA6*jXcrgRM7@XPO-G|LOy(=A)_Iz_VryTI>bBDNuPT&?nM% z_a{TG+F)h>Y`ht`e#0E7mxH0mr+lkcjUZCkCxb3U-d8$()pe#^bdTaFc?-wwK?R_h zu;_XVn+BQEeK2f^Owr6Gup<2)X;bfpnW1Za_#0FmkfFLQ9?CWW&M@g*pN4?~vIii= zLB$ECH?r74=m4{gN94kTrHti`VG8p#E@|W694IB_#?!wi8xLB~-vz>>amKNj&gh;* zG2&srs19>|S6XdO{lLKX@cvtMh21LPP%|v=d(%Qm8M%KOY0bKbEw6rk)(J>8!KWO#KC>LIN zHNOJiw37l|c)LkJQgW)%-VkaYiHwYFIafstR3$fn1{vyAtZ)vk+0D1A*C~6@xxz9z zdMW?8x(hsr$2AYM>UHXdv2Pl^ClP5*eGfvm4kIjKA-sJ-w~P;T#{Z$mfJ>I$M`w zGST-iz%OU^-^iih`G`wF5#aY@2O1RAY^VW8fu8766hY4aN@4gw*G>xb?xzCJuOh2o zz_b|Zc?Arj_FXKC`$@I_o0&vQH<+B?u@>q9<8Bt`{dcN1U;L6~ zo+?%(?YR3xn5d%XbKVauQohn;d-Uv2Duj>hAPb(%m$V1Qg>5;$fyd`M{4%%uQFc)S z0Dq3aOiMu<2yx2Lfq>YB4~J|VB?-1u7KBc&JV1kY`pcpIi@$brgWX`Y2rhD$$}42I z8;GYa0mcL)QOpNKiw|J)D>Fp{D<+`1ehKo&e5<#hotqBWj9J{CZ777gsr(>Eku~_8 zUk-hN{ly9trj`H5-(^->Eqzd^*anW1naN+iz?zscqLYn>8OgRC*`}?Ki+dIydeO$M z4S61Z^U3TpCN# zG#GlkyL`jvQZk*F^kJ$rsPcfT*!orJ8B;XVr#YIx9s{eyzbln*c)U@R@69YMu>UyW zx5j}*%gGuym6{xGrVW-9G-^hjb6@WVlH#W_nUKCn@C4ts) zOAS+|S@E-N4G$pig>wFHx7|c%nYkV2H z`yciu)lLlJye_`g4FoL;=5{17MWr7iBFV}1@EUM;5}+@%$wCqv3XR9ht6CyJb0s!0 z@z~naH8)gq6$lf9OTHgqBOK8nan1YGXrR|(@@^viW!c%B-7`u6vw!vor+ziMd=g%M z1>m0H!DMB)fy10^xWSK@8E(Be$KMJ3C2sYah=N}B{IKP?NgrMe;o6CZo@~7Ro|B&S zy9J@2eq&bhm36JPGyRnfHQc&eD^ZLBSjl+r!I41*98*F`{Zc^}V-1i>Hu?Cm8FV(? zf+%Eft+R7_eIne((Q zvLyi0IqUJVOpY8}oogqRcJz_lovD4F0~cruZ+DLiL{VAY%t=%_4vhd)X6mOvvgIs1VK11Dw0fRC?c{g+)hoAKuhh9ZMDi0nRj6 zU_ct%#ufOtLhnGWvMVvJ(b03)9FW5Lv{_w@6rm)72>Dj+S`+M8y|qZR)@!ztY5S>w zo^pM8uq~RQw_p&DJZQ(~gr2%k1Fq)gW~e6!(A|QXPXe2ci34whgj>(mN0TLC9iFTu zgN{%}E8Q1O&t=}J*L|j?se-aC9LIhBB>u4s{Duk#PaGh-?E&YX!(pU*4WlnYy7~IK zC*7G>Cc1hU`+%ANWD!8_O>J9+3Q`o}X>ls;B-}T(OD1xV3$bNSCusn(1<$r3kJh3s zHghMuFIe3fP|t8AgpWl#=(TumN#Q~>{p_jSP;aFaIq`E@_Bm4Le2m!!+-)27zWg;_ zvh>W4yBR&ia5wcnMQ^P6sl+`go_B$%?;9v?;Q-}7`P8KrKIxMMW=-$p*_XQysY?S-^{S2tm%&JcvPN*8=yS%2r_5kzw zk9T8@TXr#<@@(Gct+;jNImJm_c$C2i%BulCrZIOh7zQRz37;w11mgWy&!YguqD(E| zdzb)#Tl+sk?}>;U>J-D627)`h*fa_P1*fc5zbK(rqKXX37hSrsB+i{d zsW0sgTm`wWi9XnxqQdx%nC`A-y#o+`4&za7!Ru~RqbhW*x5GT9Jy6j-quKaAmTx4B!dOM6D5y{DRNDKfS6Mk4Yf2ScOI@jI{VU(k6{excOo^QrDJ8G&RD>yE_i3~(C)SpIuEvV^$<^N9 z#}B)@IKU5bpLKW^?2uUj4C+5%mOK%+{Cm*Nz& zqHp4Io7BA%4gurr4}OBj)@5UJ+ebsYBi^q7jx1H(fdzL>K!(>!z{FoiTH#nwB|KUL zg4$gf1L7c_(C>n8?E3& zjB^k9?0Tb%4lOO4Q1Ra)>vJDLTm?B&8xSVoL+o;u_R`U5Cplc?rRHFMbh#-Fi;DH4 zqW;Fc4p>m3F0$Hed`vCs`SA#-AD?M*V5<>g*Tg>0iG6Mi@KJn$fPxO+L6UD?_;wq2 zJ1$e{Gbki}h>*`0)x)Zfw=pKtxZ61Qgzl`ICwutPhZ~q+eDqmke2mZwj8`U1jAB+~ z3bE#2lFay8`nvnXD21tDPbd!YpOgY>NrQRwQN?q8J%O z<@A>W*Hq{GJ!U>F4sYvQ*C&6E(3ip9>N?M=13fHBC)S#E=6bH1Ff6Ata0 zx74tgmYC~4cFH?^Yu76>-F3_c$P2xb4*T#Sd0W5GCMzayTB=_CJo#+e2p>{aaM&W) zFy}HUGIz}CedevS*Zs1&DDV9`=lm9=>$b%bw%y@5-=cC7b`C~oou}KhjXr)7gL*5H zs)sle$@_MGP35zt`hQc3EF1QpYwcg=TBUxTEiE#86_aQDibPk&xODxzyH+ldep!?5 z!S@Jq%vFJWhR~rY^QtQ89f!+fa(L}Kxk9C6h>ohZ(Za*MJhm*R2L`)~-n2?;arksfh8kJSMzeD z#ZbHb6JvQp6&flfBgdEs-C=5yFqn2&kU#I@yBGcBj@+GYc0{N;^5HcUdNza?@4g8y}va!b|Yj&8Sa7Vr0 zwL<#3zl**4c}xl@q$45$TN4#zKQAmb8V}Mi9yy3@Y>CQ}ncr_-TRtQvdn$ykiLjtQ zbWrZPb7fY7&hGEmtT_y4_w(`T-3@{d3u)Q?@ktpA?abvbrO=iult1tjE8G2V$UXxT zV-laU_t3)=>|*KT#d@d{G$EJmIuwKx6oe$k5bFIs$lX;6zh>rxs7?Q?@|QpRMmsKw zzZ;1y+E)vc%~yx~ak2az#}v)~-FoRQ;Hd~rhpzqIVuyJ6k~|iXc3N#-K8Q|uLWJa| zV<$MyAKGu_v18Y;%fcGp1#^Gbr$fov@BN`xgMu4eTkZ_2e&_b;D?rbiP#-3es}Ra> zj*-dq8yTLD2l$wJgR2Oe&@?yR1&BQN8F6-2wSp80^AB?GjuYlS`oJ+dKy%}N))Ss@ zl@%WGf9=kO^9C2;_*0X44;TCd;%6QEeE%kgKd~lD3D{efI*o6A`MJ!-W;x`h`z+FLAE}cIj|POWRp}o6uyd?7 zE+1IsQS6OKV<$)&A0T)Jox*2)D7YnO=o+DLpJh&a%(-Rg5Y@s11y_ZWG}t8)?z;~| zd$G6kCKMR%(>Fi4f0=pg_GL5!dYv}?v4p8Fql)%lVi2cOy-t0jGjNB8ncDxVoV1<_0iCrjs8dj_DH4b^U1;eHRk~lqt?}LYrChHMWDl1l;=Ua{ znHVzNAdS?z9mr1*GWT?%4;*+D!7>CH<1V3lLkzRzR<tLQ;Xra$tk1O@tytq$M&cHJSXYIKotYpQQz)4XP(GjP+roAd>p=J|I z()CkzFQB<}PWV|Bi*h4ThU-4f3p?x2Dan99@{ST3Vg$l?TG*SP5&f+L$KcexOYt+(9LC-4it?|VtZFsEo>#0++z`hd&oZRbMUpAQJx?Q`;W8LyJ^`X^Zo<9wM)Jhj{OhE!}YM0 z2u98act7R5(}d@k2eJw=n}wq$>4QYUyap#hsT7-*iLkv?kv)+Y(g5v5R7QqcI{_?? z9XNd*%vDdIFt>F9p#Kd}m*wRhI3Y~UB+|+~_(Hu)ujcqR{kI*eh^=i!FTnn;n=tkW zJdKHDhRwEH3p~%KH9gM`yqjAtan%&$iWHYt|5_~(1{}2!IbEX1XQcFk-1=x@=$neD zM6$g>Fs7WGO>nr4;CH-`qF1y1A}CbTXe+^0ONW+CdMA^b6yKRbMs|7%37hndKSQpR zL{|({dvW((*xY!yw)Th)xul$kP9KZ6=k2S!a0}7;{H?{?-`DbQ_cb#jYR@$HIwchy@t@*8eq8!3Hc9=A65!iYDSh0r4;u6QGm4 z?75ru_i!#2$aGACf)`Y;7IcPrZbfs)+@}NNA1V}lO)~EtQ-E7+a(vxsnei*V0?w@N zUMnpASNq#IZ@m(i;5Qi)^ZuQ~D5?W0#j~$mKKYTYWVja^kKt?8`wmDR zPkbPf@cyIo+4R%*Vb)X*4IGVd-DG`7J8fzJt22DXX-I5`$*sll8^JHr0vUPdejTYU zo_Q|pii$?b{W3Ca>aKGBpjxEiwPE%FS2Fp$fGiot`t9v za(pj){cK-0ETP05UfaCrbyz^zSLP|`?l3kX752E4m~-t}-UzZ;XIswuxP+3^3O7KF zli?e4kGbp1r8V5Mb@?4oraP;iqSG$TYrGE?Tw-J5sxd!?WYyo`iDu>`GwI6!V^9{z z?u0EBC|IXW`jB&JCL#iWMxg; zwWA|jm@@T>6Y-Kw%HY=HpqOV$d=`MI{YngBkm^nPNTbfqRmf&@?(%ea|8i%RMGv0! z#1c@gO5*ea%hbz$71+2x={)17=NVh!$xO2>^T|w4qABs^E~u8e_KNK1624{XMSI(X zhJR9^wn-R*>A{5B%L0u{H^|?8m!IS8(K8Ne?LlH+-jmFQH7q-k#g)~*eFV`#-`3?i z`|*HKCw}$*00-pu(a)y{BWHgARqgyiPFSdVqQmp!{rSUjgx`q0Ng7`A8%xFAs|9We zIi=6LFA_^F7n|syH~_Tv571XBeJxhhv`uDEp@6z)=qc5I0Xto}MXj6wL!@I)Hl8Hd zm>|_jo@)3Fw4NYNcLktysHIl6-@O$$GzLJ~YV7&xMi^*P<1W%P-KqySQ5N^$(2%jc z!-9#O0L4sE9;r*KCLj21INA%I4|UjZ?7+*`iBjmB(IVnl z=rW1G1@|~DNoy6-d6SAX2ar$yK_iSKiATK+Z1+tOb#;YD1)r<`x0RF7+KpvC) zugNg?ro$@D?bpib!0Ea1{qZb!_kdp~Y0g~ie!T^g(PxqtySXW!;31b4{KxmYdw`Vw zocUTb@l`1L0)wHZOq3%)US(3Yzwy8zxA`Ti09&N>Fj#J~arghNNn6n4wd^=R3?&wT zVa);p>Of6+Pl;T39*>-iZ*_=80_hdQd2B6w;p%LuaPrTs~ z(5@1>!GGqZ9qFTOkQd`0u0gkexn_(iP;Vh+lxBXOL?#=~USA|~RF3<9MI@tYI`jKu zR%O#~k1=5vQva?Lc%R4f0l6HZEWo9O+EPQW72qc-s)|U_LtcVo7zYwrbSe568gc=p z@Y5SUC@fBSwC(htuWw&5|heGg@_2Gy7kIXmK~;e9wG8 z9~$<4JrAPw-#!pSBpXJY=6J(xM+B56EdVqMbF|he{P!_fo}U*toi-03HLyzSaZm+A zkd@~*0XxXxS(7&o$_!xt=eqzrmWGTPIe;Z4t1VVB(Un5{jsgmg(e_3#HF+41t@a;v-wHn0{f+Zx6V7NUaoY*fkQMAo$+9)6UFMmxg?b!u*gcSl&O<6 z|1l0~3z=vPB%09#PiEU}YQA;Q>Vp=c-cLxr$(CN)yncfOr#Cee>?7t2JrM#+7uck{<#9NbLRTbQBK~P8{WuW z@-60x1NfwWpINA^qw`i~Au<;sAw@LN;uGOwUD}-83fw%3$TP5Tp%KIC!Th(%*eXB) zGeGdGvdmP&d%{o(tN|zGOOzM$9q#UTAOK^n*$V$t@ftC>MbCuZ{`2d&qS9cl9=mCe?{nK zN6!3DE(JU|jH1$@osVO>L3Nssqnf6@Q{v7Q;FvJB(j&P}DtbocAp={kOtfS~OeEVu-FwwfZW+^z!q|1tFyP*HtfxPvH)AP7i0fD$6zFtkcaib%JBba#UyAtl|Q z5-JVSEnR|ygaZsPz|b{xzBBm$z4z|ovRJ^Kb5HHF_qV^jHzd*Q?VJ-2+e7FTM*X<$ z?K>YcZJ)Dqd>5s!w({0EdLFrLF=1bD-0E=xs+-cK3cT1IYE6GLUyVi7J+@)2$J-}0 z-^|1~Hhz!(3=MLSsn)m?8Xd-9>o3q;IQh01-h4kb?=y2&+Yqkf=9S&pTWUmXsJ5MT zV?=IHzN>;QvuPh!XUulV!R49}fb5@#hM5DP7s}R+{qbKZ(I6NLh^oSa%LGmS5G+}l z>FxO#>7auaSYoW^+~|I0LZ`ZxS@ zD40u`DJM$cBLi%mH*;J5pW~%xXUHH_s}r1L^P>L%WWpN0dU@1%bK=hY*OE_`RDiO} zvzDSF7aHactK0ogrOf-fihgv+rNC&VB=a-*t@Fctju7w=)#d&m^ zo~JP$$JQ|Py961kp0%#xlS)XZhmYST1uv=64}T^$v-bzwF14A&i_upuIzVE1*XXBW z0cS#7CQ(ZG;5-4R%mvziYv`HITDsb_j*Hn}653fFJq#gNT<3_nF3)&**Ie`8R?{s_ zh#I#qmq0xz@i_yPcgc@T1Pv6MIoQ+jRYHH{>-OCPV}KV>M$6fnR($Pj!y4xijtJ1apZd5!(;g9sUB>3#V>fJ_rt^F_^&=^2|l#&J|KeaT~7 z%%x$k+ZVS5NYAGk;s;MH%f6UNO9YF1z(#h!ZzA9zMW2J}p`K z$?I+qm}l94>B^3mbWSQi3$OUC3DOGmUNNQGJzFZG3Z*=@)|f?44lY$^cfbS;Uf43w zo|zDn3&cIWoOEzZ%k()Nh8C}Q@k6!-(^`u-r*NfllIt+UX3XwG-XcRC{c7c2$kX?( zJ?)4-+Kk?ZoE6zKJrZ@oCPkV+!&F0gzw2lJZ2-VQ@!Akoz#!RqPdM#>#A^u!=2xG% z(cL-5dUP{=wj=nYk4Y%o_$TgeEwa@Zda!S zh?&3K9!brL{x(m}m~=0#p@%YM0Q?JVye*Qn8kj=zlX>WB z#Q;8bm!^-;*8Zu-#k<>cif1AqgBsNFF2e_lOniJT5GlpzDOWS8w}@isBc|o zXq;tVGgjM$FvO>NY1I_0aUmr z3f(c~{6|`E_%k=@yvg#PJS@P~e!?srI6heHt8Kct5R;jp@b?0w`JmS-vlJ8`X-A<= zn7tJX*Xs27vI9S_eVRntCmDabQMFbVT)eVehx1skF0k0zBJkRMrRqbBtv?RLuhI|m zFIIub)j(SSC0h%p()frUQJqczwB7PxUH#5_&9xiisW=?^vUm*~_tNH`-8>a@rIs9d zaCA`@6?~f%$1)K1ZmZz)v#v)D_)6H4KL%-kH4&6a&;vaIi_{{4(ql6;rRuM0K?fni z?Px!p4EDuR`}2Oqt51;;FApv>mc9Fmm1Sjb9Q?R;LmAk^X=GGXc`pxk*zj`KpK&Q* z=+-*7n^z>6?;9(rzp4>=PS#INa}M?~iMMfOSs)jmU!h;Ffer|j3MNVoUXch|Z+rT6r?_-&$X zq8KmxZ{e^_nCQDFHH@Ep_{FMS=E(@TW0mu}*!ccQ#fDO2KKWfz8tIpMbRglV_x3D!xomu-S_|YbpN4fFJ=rNazHG-U%6TG(J zse2u-ANiIgvyjfOfCVwF!$12rpEMNTJ?=J{f=9@R?}Jh^c!cjo^Luc^qpFaYssGM{vf9&17Si;kd0?&xc=(O#-_( zWZp8&Q+9{i5idiB|Di9zH(2lbEDd?jXLSeb-=8eCrXL~m(^*f(9ooS}8~2Im_3pB> zf^Bf*o$8 zQvQ&w)8Ua1g6`CQ)Y(io61J5VEKdhVVZ2fk>f6D_LHRrS9OS8a&(ybqX$sQ`Url0L z+)kP+XFX&tzZk)doswoPBSaWz`5GKGz9f5GB=^3Kw1({A3vIjCEF!;X>N;<|N@u)x__U&dfQurVStdNop?Ja78BMttWEKznrFlkWUnBdL#_Zdxk4Hh81t{rdQ- zRwAWWBqdCu?{@n=VcBb4gs)~@uwG?>}heP$(JB#rt;a%a;k0 z@M#MEFz(KKBuZ#=IYmCJ565}QZ-_xw{}1e)WNfNL(uD!HhHtFsPVy|yoSq^F`UhIe z3j@5}Cl1j&T5d}NjqU^e93qFA-r}e@A83np6D+1KtM0|zBTiV(L6QMyB?l$>lkKyZ zHk=;STQXi!L6#}WI6*eyrM67|Ds0cH-rH(xCHf=yBFXw}M%t^`Wbl`Nmb>as=;+J( zn#5B_s_G3gQn_oD`LVK&*&jCc;Zhj2d;>@G(O2dcxG8E5=WTXGI7&pE)B?@9@$#~#tqX|st< z3Dlw5E3VrcqHyklkBh<9H87xo>~Gk79nn6v<;?ih_7Pjo8ILgmB)IqR3t&!{6$?Q@E{10OhNzT4g14ag>1@%Yz0;K>iz zW2hLejg+up`|YzM4U$AlF^m9W3Dz>=2j8rmlyK6}J8u&ToGLR_)v~pmUvxKx8Nt7m zYl&`Z&dQqPkM`gwjIrIAK;e2}9$skKJ6S8iF3q))ZHWnW;rPySrp5Nu@;isq^YLtk zCd^AxcfX21xCJA&j9zFkNUc%8G^wMmu72Z*wB^&Qhi>k#5CoXr*Gf#FN#Gb(e;me1 z=LA^>wEv*OkG)sj3a$83S4S1FJKq{WPqd=vl|+tx7xz8n@#Ej`IaYMy+sTP~Ugxb` zQVtIG;9**NbsOQB@dSA_m;>MQ@^Au%-%edUT1QIu(P3)u+Z)E6+yYf%Ln(&vl)Nxw zilFruzdy@~?5)iRf|&tV4v7K-F~o&aov}$SPj2G1tRz~`!S{4^O1_TlYDAJPQ#~?6 zj49GxmUo_p(0l)GY~MmAr+(DJJk2lycw>;zph6>Tq7|t(N*DyF5V2aFwksM9Jl;2; z336R8uUeO;i`m1)% zAr9~i*MJyN;P6HXv$TXt31|LWLuBE(_OznQvk>|iv7X3qZ=NsvV}vEg_k~o@x-0!#%k=wh1=v8GR`p!_pPm2VMoa4 zAepbGP^;086f&;wVA~SYy_qg_&Ifs>af?uJ)&es^IY06X3b2hV5W82O;pe+fnJ5>c_P-gr1aUay7qU~&xtv>vuw)sERy4GF!{W@%*i;#tz`75u z;P}JC%LHBOrzF9Sl3{?o^Ge|Low^Ij^!2s$VyHuT@_}WgAAuRHn*mcVg3QSWI(XRa zPFnAPxf2nxK3Rdh`lF6LTeAvY9b84>QgkbDb6VbqEpk$CU4J^pVQH10m?Rb+C!0PL z4~RV)Uc{`^*p8P8M?#-(jU$dph?U=Jhd|%iYGcVhO5sTNq=C@dBSKN0T6yArmdaKNQ2A%}ma6gdYA-+z$FrUuKr6tg>pAVF;p@!Kxr{3bbzKXH>S zesdhDJzMCz7FD=LHD-QG;%w>=%j4`1lgIiW|F5*pqW`Vi+G4x_)KC8Aw6>*uo#4Z* zpVb5E(oN8#0TDNzA9)eiXLH>(x4SQAlqKH0sbGxkLQ>PD$$k7M5WdTw$-!<8q6rUJ z*Yb}x4gDZ3n#$+I&1bv6z-~9 zaDnY23BT%N2(Ra8N*!3Fm?;$rTi`Zz)fXE_?ATMKzJ?0fJ-)2jB&JsB#X{AEt1Qfu z5M+O5mYJwJ`t^?UrT%#NmM_DoUV5Iq&x+OmhF}%i%;cxwY~UAB;CINL`dVp^W32;G za!w+se_+x{Kr=mL>_#c5=OiX*Abh`#E4kTJ{Oh22(&CzgqJ-V2IQFa4O*h|6j%`TK zvSIf8Px@{K0zI_Ea(TXv){Lxqijo^Hn7PWa z9rAdcWR}&uqYNUfZu52$E;gjZ!JIp<8+bTVx{LE?frFWvHmBPl6;>#L>Q8TvkHOv+ zl@K!2)*SrhF40%dDsJU^zwcl$TXc{F3T|rn&+#FOuaR zKVyJCWJ;H0xc7)DUQ!tr;_z5e`SCN@y+_2iNeJHKP8!p>C6`jSR!IgG-mNk-PSNN* zyqjqGIyw0AM9e{qaD)qd8+Q)t$d*EKf7zjkER%V?L!ngmDBtbXkD@pC;nu8^8oJMI z&u220BSb9lyOc$PpSL~YYS`k!Z)@4tGtk+)Er_^O5U@jxuDa!|(7Fg06Ttq-r0)x+ zbVFXB2cj5DPIJVt)nrWi&XLE4qS*osL9oIk2A%Fa2j2iw|ZxF4w z=|A@n+)oE2mh?DMT!}~-r@8OMNy;kEm8yp1jTe0{`CQeMXj=(iQJV=N6xUIHobr({ zgf55;4^BW-Mz59l-ga`OZ6COd*An06!mK?;)a^W_%l&M_pHA>{3|D^Cg!TN zziu({vn3PzXf}H>Xya~-Ls03Wq3L7x$9aX{3OlT=Lj|@Gf?3F~hck6uRv&AS(O$RU za{}Wen6t8&l?)xXm9pXDcCb@rReXNl7JqLE9r+`ADU@4sSye|WTJl4(XSV~yYW4p2 zBKt3IWa;5nZl$&5!8Fq!v@4vjGf~DAe$KI@F-3+B^T*M15=In{f}8J+@Qti_1z1w_ zoF6^c8bl|h1P8`k>>iq=kp<65M9mpf0m|5GN}RkEiFcOC$%!jlg#NmHd}Xm4@8xC$ zc@J!{ z^fcnjiqv}JJU^*W_3pXYk{3s?WvlX67>-}e$IIz9R}znpKH~I^%B`+H(c7`QPa^pL z;{v=_GFZjK?s9e1Cm-BD+vjr7Cm-Jr6~WabhmJGO)%3WE&4*o&TAPD$;Ew-vJ+Gx~ z7_BP~M;)&n-*|Pw`7Tax)03v{^w6knjLM1r;cc{2_h96UWOC!tfXs!ZBh=Frl*?dq zZA6!WXS6iy_}0Op7$fn4_dF9+7X3^v=|8>kjISemW2$ww2}L`5K~7^TxAikZ%mN>Y z6K&kP{e16n5#$rBIeGr<^@;i(_9t)0VDAs17&&8P|Yob^TSc_C&Y2C!dbtv1z0I>Jdpx zxOVWyFpNUt!u{O<5jEn)=$E%z=jC@+%><#CX=VzEq-i(K#^L^?N!f8+dk=*gF8NZ? zAt0+nQFZz5;@-Mm1M<;Uea}#h%r4#Aq%u3J96KvdtMgao)99CLR4ZswiQ0`PPX5J7 zWwfIBZS4w~BQ-}oo1^FyO8PJQC7#CvH>8WJ*9Lje*W`6y4$gJO*3BBt&K;A}E8^i3 z!uig_IdIrHohX7OVkx)r33)wp+Y}8RbH|b!1Q0xr&>S24VKeX@QgigyTf|y&?djsu=g0^DdZVsn^sEwvx@DuGoFys zI^T@pDc1gw7gcs7A0I!l`#eMX_2RWzuS~;~xmt#FsdAk*Tf<5pCS!ONVyugR1Xp(1 zKySd9{%fhnKJjYy9X{!_&_}O5GQ0A6m86i~5^O^JmjSjbNKK5e*GZz9UeWwkjVO0b z)2gx~x%6-nhb(ryUy!o-fJQH?YRDmWUq(@gBomI=4Sb`sSDq5koMkHLaZgmO%q$-5 zlGErtRbTsV>cBE*W5&j-rhd30?}^QuAtf-9aCqS-SN*#p_E2fWu&c@jzfD17hw0Gd zBN_+6oo7;PUY!W-JeGn=Po@~An6xTC~Jrob6+3FFW!94>3RS%szwX*ydI8bWuo}RQDVA*B!5G2`?e?MkIMA>PS*z}H5G(?& z?#+ht132iM0f_?xT}I!BJGxlk>?86sqFjXjuT2XfSmlS!%H@d3+@ZhjbuLW+_70XssKC0h(hB~VjShBcAH$0)#f$knh;dZ) zyRuDdW9~wT;2Qt$se=tT*0TB-FQ&QMPIy>caU^f9HvBppRphl78hUpz@2TLYd_6!; z>$%U0*FR0{&!0b#z12JhKY{MP9_&~DjEwpudF2B(R(u$7%s{UD;cJLZU;A%Sli`kk zrUgh@8fZ)rzmRmD`a^}}({5KciEhyTTXJSXfyd^~eLB(}R9tQH+&bgY#H^ z=)k)5-WfYeF305GTEHQsNmss|#dlm2kR2n&+{-GD(D+}|%5*ecXwgT}(0eYA=`vb( z)Ch1MsFRre&2LXCmc9}&RgTEcy^S9FM>io@!BEKWuim(6ENdPY zzX)5j-JiCo_6&f)L@P+9C$c%<sV4y91X{ppT0DpycV?9`6s4?I4 zr3n6c^sdusX>a5$!Sh(QHq*b$ZH{^&&7#NdPr&Se%TiY~1~R*ogg{P{-iOpIogtH9 zh5jFn!(6_>ON637+U|7Tv_5C?dEm-omLhK{KmG;bfzhH@<5p@34#h7ay7|?^_pIkn z@S3~YKO?cDlpz;;MF`^ZXAK7zYg&1vE-=hI#oi$9A*wcp&nNneOWI13WTG6;bD4(f z8yIGnrNn)!eb1pM>Mka~@-}=94?;%zkUKC)Vv#fJe{fLZB5e&H-!TdN;yk6k2NyM4 zLm=pL;njOv;T?WSU%kVU5R_+h%kU&T#P6N$BxI#086z&GbdWj335h*<8~jrzgO|h# zFmOcg))x$#Onvmjl6}0patyM3^4Q7IvRJ!2Oe(oodK7Xeo;804HrMOD`xrUczYwUP z)|xeY0Cbjx8FHEy9`=*?!=;~-hc92gfSQKtkD<) za=Rw?B-hl}eg(|BD2?HciKjOo(9wBw{!#wQOs2qjdfaT6t>S6_CL%?~@+q!=^MQ(< zKk5#f!MWcHV>cmkYHu2ZD4GS5skhBW*tmBKVhjg@Ld9og6(CO_2#q2*&`cYAvxUbe zCGmm?7*G-(pjj)NK%qsb8Gi4wf!mcunQ5>1zA3IpR~2pG$=RpH)@h~cB-S;fcl*Z^ zbrS77mpqG#lRV)H%0@Nyht}?ErZb3Rp-=lU67}Ah{fk9KakV9*)_*;4!GxeMm4pN69b5oW4d>{^2iAq;y&XU z0w^P8ptgnvLX9Y_W>u~Oc^WQfcc^i6XaU#b<NJydyQUH9cp0v?^u5 zq<#9HrF@WX?k=L%h)h-mO5g$3p_Sium#nV7Ae9P(y`{?!7xsTb@x|loPef^K%X|(p zB<3*4LH0?s(GzL^&4z{;z!X z0+02wE)S5FO@v1jKq(z2k&vK5{Zqfo<&w)cokzw#`~CFHoXiVLtjZ|l2EXWDtFGwD zun0AEez(E>za?)=GFG&nRgnW)zkkD}6Ac-Uh1Cn#jfsc0S~v>%A-4Jt8J>JQqgQrc0~ zYy1{0Nh;j!v@V-+r50^*))(#863n)OJIAe^!0U^VB`B{RTTwm1z%|d6bJ+KDF9R>b z;7Co0*Bp?L#DHXYJ`jH4oMpqH&^T$)rHf@?zo_$Tx2VRZA89!tz>J? zI8|e}HewH*5*(8$Dk}CCo1~4e6rW^p+c3jY$M39XUvXqNtIfiXV1z5qk%}U?C+J;g znZu+mYzG$R@m7mZxq`X#Q|9@~pCYF7)BUf2EES)SpsJzK3E=tf-@ng+bV5rYYV!?X zYuTO)0zsUBI`KDlcON?S-(o{yZXoHMhjv1S>kE@h{0}UOMV)bI?F*KE5svL{d4_BK zaP*c9ZX9GAX{}OJ9BHXiWb11cxC4ITQL^ciM+hjrd(r9J$H&Ef$qV#&#diySHuxlk zd*)FwQzc;`;kJ`nc_}-!3(Z@3#&7422NR~oxY8sfKOOUS@uW(O|AqQikF41`LZ9r$ zO`s*<8D#XmXJ!|Uf&S2WT3!!WaX7N3J>z<&x#^Ua6^KS#0m_d9n`OP zt`B*<^_Y5?=n(n{_4=qHo^;W z?4h8CNSM`BOuGNxWKgX7K_+Tv#M^#uE{PUyb{>1p|BJE2&LgK;;jIQV3>5fW`BOk1 zCPmlSkk=G^qmOKNY}Z|@)aGGUW|BwWcXZeU^wI`_7 zlDLW;f8@dI5H6)#lLC1w_U23^+ld?g)p6`wY$VTm+P%8VOWAlcg6xa<(_Ns0=upP9 z1wXb-xtW74K^Y{UR5qU!lCNVPm?L~LCg7`mUb)=p=MDT${FS!EULBS?QdI-JCyssu z=PdH>$H!yq77L%r5%XDt92V{ok*b$df`U1!8N-$TL&Y~-zKE#Ln|ry;G^}raW5wW0LlPd zM*IQzd2mDME|P3dNn^j?PBc|F%O55>!|n`9YjM;kR)&u67bsFQ1tNvP+8WY|uxJR= zqElw0VN4Ar3hxSKnr|m|r22A)PbN(c7A7Xu z8ox#ErG_(#zH$GF)dOkI;{b%)(}gFm3=9Tb$Mw6~!$`tp&IJsk)*LRK33nFWnrqb^ zybGYeH+eZ#DqE4(=B#Tl*CC7AsrR26uBzdex0DA;7t-0HeT73W}3^1gQSRQSVU4&iOT&A;_8@h48+l*@zqg>Hbwfz%8Ngu_t30f1r4X4L77=AO(=rD7 z6(4~6t1LJFfMknaJuE9J?KG^KwCByg(|Jk$tSWAd)>ePep5_?4+5c=XUF;m61GWS- z#l37@W9F|)V(&-tGOx8%rP|tjpX@v-TGMW{q&^n%1iqi4fw(n34GV3wAN5+7qTW`RkkSw!%wB3`LT zs?h`7!;No@H|Nj@{C%%vS$5D)?Azl_Wyh!7?`v<=x0k;`>s;)&N{WhKO7KbDheyL4*7_XKrU`qu`bE5Ln?BFTzjp|B6p+bY&B9;w* zhGL1OaQi)`Ek^v^O&(RKltZW09r<>j~1cca-?} zIxH+AhLdgDNFqDJL^yVW-o-U|@D%#rC~2sF8(lqK>Zr?Jxv#Wt@!_SuX7iR~`cQLn^JS&BW2VY3EaD1DL@@I2P!rt&cW=;R9 zw&KsPiT}x--1;>&Me5UJKVyW}0W3~oeZwY~X|KRTFzwuH))7J9vK)TjX<*c2Cqb}4m4J5E~ z1eyJEFKGun=Z)=rmNgpEXH{U*Z)X=gM-RiCkqEmti@gax$oq&-4Grm_hyeO{&_8o^ zb@h|vy%^}?Pd|E9!+bcydmro*yIoyE?FM}j&&Xjzy?u>{?NAO20Kx!N3A zJciip8>y!Y-tF_a^HB>pTM}iIT)G=s)SAUBYx41r zHecgNaBo7x{&VNwq2Pi9JoF7-PdZoM`u5pN_D+FdG1jbL^qFz*kh^ zH)=GiY$R5y{Hss;dcK8(&B8rM>xPXaL+qWV{UUp!FsV?P>?xNKr8Dz=|DD~pQSv$H z&;;1o#=dt8SIsV~;oP_EsCkeuW(m{;z!&BtT4@K-BR5)}`qrUabyL-37|f(DGa(W8 z#aJ+`jzlWCFaSs}DkMS}n8;%X>{jZ`AftlofR_<-js)51-hfPOkSV7=cG1%dXP9R` z#l6XtxV4>V;3xojAFygx^9#Ox`!><0K{uSx2+Hk2M)@raC}R{8D*X)4lMGVG0qRAq z@DIOnUDE)F9Pbq(_cD%iF~}Lv4ondViHW=KIeoAKyf_6w{-wr@ViEzw@O6BmvL2*Bbm^|JUUtz^y{xWN#%F_gc$g%wc?-JQBa`LCc>%q`h zgqWS^uLFP@`{zy0Y0mecCuu&C1G(9U=9P zxe?oO`*td;Gtk#G0%GL6@1e+t?y7Ie^!UBIc^YRqm?1*WiD>7?d@$gTFR4L*nQ{Xf z7V4rw>$^w9&(9B0q!NDsSRTS5VQs0h0wp??EPzDuKc-4yX(^ZQ>9%Ufyl4LQW?^1L zauBdfi5=M#e)!9~tqo=0oYlnbM3aCX#rlHd^VRqtBe=lg;v(Q_&}EE*Y8W9XPbkkb zc1meT=ba5nzRX!<DHdtaOCKM+>X0)mK?SyAlWYPgU zhvB{}h-ZEASjxx%-oOp*e9gq z3*1&locKnS`P;d8FUg()+R*;`Bnhxc=<|%7j+qT_!RRJ4Qb?k3KEX6l zTq_0Hou+)Kk2 zh73>4R{i@|2Qs5uOA&w{Tf#wW#W1|;gk z`c%V}^dl;j0({s{j8iL4X0MA!$-r}w6j=NuE^>6#%2!P!raq`-rdq5LYQ~;jam=pxC>$XQJZ|OGT*l zfS51_LmzE1FiZD2vVbJ|A3X$l<_KYQF-HG0ZW4}^r|d0vj&+;lOe$iKOw?T~YAUM! zX94G%`G&(kDsFC-==a*w9@ES4m;i64>5o^87f~MiKsK1xx-d2=_W-&=Nz)07|M{9B zR`d2W721ai?8f<@+!R2F zTv7p*7LTo}c(a^@V<~h7RcR}RsOo;0|wasH@Ix- zVfMfECeKITntK9{PG}Hae~K@sY;@M=4`&1i8$X(R#+5HW_@AmER5(@k#oVAuI4qN_ zuDcbczhc3L>ah#gV8=1q;W;-XjyX7<9Q5l1xzBF35Q@8BBOgqKVp`8ceuegH4yI$Z zAhsIfP?_GCW8m$--K@a4Go7*2p5{9qDOx+L-RhQXsPD*YD1q#Sd|6Aq*eyah5A{1^ z9UWs=mvITDum|LE#A83Ty8fc#x!8{Mf%M64eXhz)B1_tF*W&^Arnc7ic)*LGpq$dV zPo5QOJNY!^QMsWndfnt`Q~C#_W^L2E2EFBvneW+u{)B#0TK(#T-p#cOfi#5p$xR4{ z$Q)YKbA&#f>$rv>vV>I#@K$Dy&ifRp1Y)QoLBi!C!}%E$?Sv(J1I7)KsHn4?A-n4_F7)1T$CYkkIX~((%uTvV>Xy` zCuIdG2P3GSKCr&<>N0#wpp>Kbdr=1<>gq3E1Q=5Q4x)91xauk*vnkw+mK~L(Ii*-) zCw4qZZa4cut*M(@WxD5b#yh1hn3@{8ABb9~G~ekUkx-F-?hetg*J&g7_hd|PRR?UE zl#6ZvatwXu{%|lfxb+_wU|j|9sH7B|yXa0kFV_#^+sI=Yx4R@RVnE4gG^PV@8=y@- ze_c3Wc089p2X~e@^yJNKeSbgvP|^4Eofog|`qOj)Tc{9GvzDo@86%?U#0n!MY#it^ zLa(-NKB(&G3%4+Ne9^#I;@BBIfQ;29cN~cLLGe3VLZWsd1OhNZA~e|`YM*dsw$aqy zz!F|6E}6{bBC19x9)T;_shYfY3ALiKItFP_9LIlLPHj}#IoZ7p%3kI?f^+7sy#(Y*tOdlqzkkv zoP0w%&2-7C%!td`+4>kvwS(42c|^{&x_LlwOQ|hMxgwy~lq<3U1nt*?Ey>6>Jan^s zimy}&Z)8vQaR?j92p{(y>^45RJBk1ZY=iXirOC3IPF3TRY`3%^#vmgVTo4ej47fe6 z+oG4d1t_n8KxA!Aad?^+#6gdI5WOwxAU4>XG1a*bfY6SX7FRLoV4JHxew)oqv#is7 z&RR|ht#Q}bQ#7r6>>y=$*K-&RAYZY?JjiqyHoWky?l_kMKI)n)#U4KA?7A2viN86W zQ6_o9b?|8>;{I^-lL++w*%7a{&HjLsDXDep8qNX56T6&a-%)mdTzzpst%xqJ|n{+TVwtu$XWVl`Zb?f!nQxi&z-5r(Q`m_%7W2~3kxFv00vk?%jz2GGjCpO?Lz1; z78*>yG>GwVG8`owu+vO~DvY^kT2{*7zzmu{jhCD(gzMT>@Gb$rGj3MRVxx`^q@n<~ zwV5n8YnEv44wSl5NB*SCVUL`c`VRBXVE+33q7h4G8vo{#GB~tS`k2t5KxbVt*AD9#|WZK^n({Ff!Ba-U&0->d1Qb^Rs zrQPf*#wuZO9yYV4n3%H8n7KS*TtIiK2B-~Ri5Tfl8BC9}kX5AezU?1?xu9ERV|94fAGDQXyS|j+IzLi zIN9h_{ZG;PF;CIm;6LR`@>aAoMiVi6k0Qos%&#IleZ9@4* zM!IpxNrKYRJ2Tuc7a@8gsGgGLM=+>RoMiJI$-mXt(mkP>|2_(_`DT3a;>0c-O~#27 zYKRCY^;7&F_FIkq_DkJ2o7tWj`kXGNO-qVk%;s`AJ#q$m6x-UfJtcs%N0_^rF@^+P z9WH1TVzbLe0_VAvLSqc4vv~$HHA$l}ArMaY*_z za#z!7rmf*j44%@KNlQ?qa!p9qQp3vu)-`$4!ZXZ8i z_mTVimqv83gKxw1wS?=FsU6(zSFD*@Y-4kS?B&flu}3luXw9TBmp2bZCR2N>wrx}{ zze+8rAw6j#BP00)1j>C+-N4z^*5HYLOHhD(?{pSUNZH_EP*9NiS#KiuEp6$ui*b(o zS{_C0h&ye!x13^3ns@Z3JWSBeLb%-&xa*8xC@9HaG-zQPbZRFMS#KwKbF?3d4_&lp zJ0E!I5=|yt9f&Lma@e<|#dEP+8b|diWAm+cnzy22cI?9!DH|EwXWaX2;Y)^!4!l)_ zc~jg>>zV`|NZG9(_P2~E)9P2m{d>9i zr8iK}o&=%)Vpu0~{~|&X%WXx(CSRE8tG5ivc^6KU5(nfeBmwQHdxlr(a+}-KtysW- zZt@ZFF6$2c928&keETXK;_%<8^!deO{V+s!4&AIpj#z6?Pl2AMuN;GSE(-bLVNG9rh=KWjc&3bCd9(v`*VDfFsXlUDMAe|y)p#e+g`R7qXOr? z16n+|-2Mr}1i*Adi|*1N16y<>#wz0zMwK7E(f;wXn=t4b^uw$dM`my(rf=Oe7G#V- zCrii=R@(oXI8b7L*aU$^VVFnWoc!b=X4=UF-x8|3XK+JWYcdN4uVcLZlk{eQqgDRu zjiGBB*RqBdl@Z@C&2)GlM61$D{eR<#;8PM++Imnv-kKO07`V195sPWALg{J;B;-#i zDA{?>$7??grr-G8EGq#SE7re{X_Sfo+GAH;-v;Re17+BF*2I{a2sNfn%d~%U4&aJk z>SeM~X~j)-8CtM=dBAKPL_cQ#^9{F0Ipw(zylQ7^U`G%&uT8#tK#M|S?%(U)*pZ7p zX*6@-w|-x2{akijMUUG2!H-LqOE*BwfK&aLnC)s$|K%^dEQ`xiUGo!4SF(p9L2I=a z{Z;?}glvckt%mxwap9k9Zxzby(_$Tw>jQT<6|gA1nRr1C-A7A)#qBDLo`#pxmmaex z-Y}ED=6@@v=}SaAnJ>54HofNpBRl7)6G$Yw6&Po7!#E;1Q*Vvi$6UTfP*Qmc#P zyH9qRG3oUqB|Nv)B7bDBub8{EF-j<2o{`U7+$Q|hlmyK6zxIRvr{n&=qB)xEnt?WZ z3x2Wi`@g6evES|BrL|cS+7Cse^R!5$Yu`h~op{g)!@CZq!>J0&N6=ZOo#=E&2LB6m z7N9>Z#Py}ifdnK+_ne|7{AUHk|JG#!3Kc4Z+&8O~ddZMed~`{`^^V9l>xrjIz8e>W z7M!+4Gat-!;>qr*X^*FW;sjW>!k;CwwTsoy2p1O*>S8g8Y|W&GPN2mZ$nqDdg@QR;`+Kc5q^|6t6i<;*x)jJ7Q82%Is5V ziue$_*--7pEqH;}0KM^xKE)4t)^Gt&0&HLbTST`nr+ByT;3?^5QicOJie_J1`RwP) z3T|7o?|~r9rQLMkxJTOCXNH;n(M}_}NeLJxwW!+Dk-_7ggGfj`X@cV}=uvJQ$6R-T zxhe>RQ2L__X+Aj{ZBxE(w6WxxE`F*9!LVn-vId@St!+pQ+%z&-e58ExlX7Jd8w3sP zWQodEx4y)1R|KcMSs{RJPph|09Yy8OpkApidb;GiV*BV$R<~jCg%~6WaiHGhJ;T4Z zIu_^Oc=VvzbAiydNz+hlqc4KSh0E~#m!S4`eNwXTxXO3yZ%9qesn*YiX@O>`_0v@# zr=|MN!3TFNt%fCEWwCXs-~*cevDG3MR+dG;WEy9T(CfJz#{@`m926bEE&e4<4#J=*Hn-A_xT}GX@*!$k@01v@6@q#iXhPB){Zo;K2_R;`ld%VBu7 zsHsyZ=sNoOY<(sRjlOAzT&EwLEsarw)Ew2|C3D*eOEjRF&gMTG^4jjrt=N*4_+|aD ztAPY4yzz~KFP$aAX)j5VX#BaSZ!5rkN`O1(v+h%7F$LC%AuSceuDA>5%0L%fa2}?d z2CoXSq|i!~2C*3=Otd#!f)_eIPG+5A-Q1_?U-zHt#@jlJ&NARhoAW)KO10U9b2^=@ zJ9~O}h@2f3p@z2>F`byzY`a7xNSL=BMEW2Ptdpyc`0Z-XzQ*4>lIR*S&*}p}+wLUj zKmsHB`0rLzNBmq|vUuKkiM9L74HxKtY(S7$53_|uSE4(RqB|#QK5i$J7%D^UYBhp@ zi)V83dq~#x7NGIS-gjg4nF|M+xt~^5Tl_~#(rJVEa`%zk4bSiW#C(Xmhyjr zrT|Hjc8NVjC2LpQBQr_4qPo)7JKbj)7js{nqH3oujD^z7YdHn_P}H%##RRtC&qP7dkJlrAxj@dcF1}h~e;H8)js?V6PA^Zl zUlhk5QPxV<9)jD0>3zsUK15947#+`{t~K0IRh&%Ti$3^GSYANm`H~)@uhMUc5#)e! zJn0L%psYMMbuOM(1{f@GY;D>|UEa1QE!jtl{FI$Gw9`amvKlMxSc5KxkSRh|56z^` z`TBiVgj=&!K&oa~5Uy#<)OhkQ#4GDXE&p6}{Y^3@pVd!6`N?-yXtnjGiaY&)_!%{1 z^U=w<*t>Fz6i((qZagPb{e3Cu@!x98dK#!h+~T`W6>v1`vRlyy>Hmq8Ne%x7U-*Zn z*?+qRc&#*$`$S+*ap-xX58Dm=2?JQg!nXX>o@@z=t0ELtPE!}cOw}&SImJx1e`{XV z=-WD~yUR;wMdlkNS)BrjWtRRXT(8a#9RUCD1@a2ge)l*A-TdoFu=Z09oTX(qCr}UVAY1MD5qd%Vgl{LLLH( z0rEP$fv7ZmK2{cR4Y+aCVNvxBq1V-eF)+z=3`~{@;aRs&_Xp4Z=VU5=i=)En1zz@k!%3#J!jo!2)coA zK8b8z2?XT0!WS%__m?OciRE0Ml8GEtjgKQ96|Bht{A_)sn6x87W+G>oen=nyrb7vi zS5SH3Ae>NGycXy(@fvUk1z?Iwg}>s222;EqaP?#zniidMAl48MC6(+`4=-qOzd{i{&bHKOJ8^TBuck zse$#9%oK;pvx3e3%=7t5;3~& GvmQ2%-^Evbp z*DW$uzZ2m>iN6o`?$rUQdHCE#!E6tP$8hyElx;v5WbSNl_O~FY%&Sil@L@dXG3l)w ziEw}BR=&`o%<^e|jg*bwc4oaW!|zxP@R`K}woIa(!QLbNCVPH_$&N|*K0`mw1wGi2 zTQDdC3)0l}9D)l8wSvld%X#k!1b^lpIkST@al5vR7>k%L#cJJ7a2$^`ieyxWx<(XpvrHgt+yJgWmY;bIY3U3Cp=!g`i4W z`1Ep%9a&SPV4>5LXRa4$HSjXry>u;DM%nc|m#OY(Xe4C0eF(f51aZIH)Nr^gwl>$w zCQz4*X2oRE4h3!$C;R>xpsQP7W^rv8DOA^Xd z3_Z2C2L)x1dS2xV*~Agw7vx{7s(Tz$26gW{`DiP=aZLrz1$o7am;m_rX!o(W*sV-c%G5~ zlHfkghW8N=KeL#%>O%v5gQ}!vkwE>Qeq1r11YfIWw{@l-r|(I)tov7%beTdjDD&<> zS=^t1!2Sz{t3k~lva@}!L~I?g8AFgmDMzkPsDeiJI%oHmw}7W;=rW~Yyrt)4!DP0^ zrU6Z)`7-@{=of1$Jf_{5;M$KE*qHz|KYd0JN}RUTxL+5^I;4<1-$j87q{vzmF2b3< z02UkSN41HE~h`Ux7D-(^8;=AJUdPHiS=V>%h7|2 z1T@W+TdrG=N*vwl)Q-<&wf9xJkk$Co~Fjr_WkMLj`X} z5Y=G%9UaN}lA7ebMdXsW)%gKiH2A{%73S36MQHoijdi23U<2F03cN?GhQ5?N z9modE=r}y1(g1J1^g`x=shtCk_Z^4a2G~k?W;QEU8h4<|+^SOM#hvuGofqo2R2I>1 zZ3DM{XY8!F>>XljB#y-B%62euivnt1kFFEc!dwyj|64`Wi%b=NIJba zpV*-=>1*wuJ9`YTb*u-<16^jW!KuUVPKMJjEr?Uvi-j$T15TN>TAvdXub`4aJ+wEP z^5w@@TDn?2$w#s&)>VA#^L0#_d{R1EhVRxYXQ9>AUtr$gjE-y@*)E;2Y-^qN7qKJp zhwRCHTH4yTJeSTWKWu`^n+xx5-?Fm(h)W#~$nnD;srUn}NFayAJZx}efDCYw+CQRd zdBPAJcy)7NBnM{oYay_(@UOD9FPH8e-ObTF+udE_y`0xxq76sT=I!C|CpL@*+Gbsg zcd{{v8dHm2@VD~U2fd4yvBFNhHLc&rUd<38kKU~h1+H%lRd#=Rz^s(-N~j(&%1Gem zde?RbXhnU7E*AK0f_C(F{qFv|t~c@VLdJWgTT5lWy46(KHO5^BjTEvBUQKuPU;Qe`stif>ZxGu8aj+}ZY(ThDatM+={9 zyd>i?jrREdzB0KTBR%>?(k~Fv;jU8)Q|MK&&Vo3H2e`;VXE zhce8$;Jq17!soG=oUHfDILaw{FX55-7CmP?=Y#jhl3x|AP&A^tdVr*dXNAgl0f{d} zH%aBs`GRbyWr?C_=fXTOQNi{k*XlFHYU8_&R3V@rmXb=<`a0EQ{{oW)p!jmKeR>ax z*|F`$zVZrhEdYntU=&{I7wYnzgTW|AeaJDSDJG_y~6n>Hiq%R5$01WC{M` zPZ+lyxYR53VjT(xrO@`Se*W^Ekm6=%fZR z*Hth9hT=2|w5+7YZB~Li|369yEW6*ZOf>Dej6-*1%8&Ti=_(blahJ7vMHpQ?ry<$u1NkWY$Q4QV@fatDRT$2mbk(o5S zzziq8E>WGdRYkVpg+%MBzV$gzy0GH}yJ;udU;$l|*CmRa)4k7n^~cJt{=?+WOOP|+ zyg)G=wKAb=pyP##EA*D)Z`bXV$!7#tzgwArWq0L4^QJojx_4MaZUd760=GaOsPT`z zd%Y3+(u87(!VH4<7^5x4HBK-zLXrxn?r3xEaE2gxO+MNqOu>=yr7Cr2bIKKNS z!YqI$I88$&L+mg^yf49Ko7GziPS2Wh$bRm>ef_hmWP*?Tsv?ssY#I}cNBTF5^9YM# z>%Zf+ivoD(hT<(bJhHwjvCILi(MCM1Qu@XJ9mAsdG`$T{v=+7F`q+C%w=AhU2@Mh z4x;e7M48h-01Nj8HSQgH%>Fkt4UlfinKBU34vV^w!1-+O7@waxy0RoEydB2Tzr%w=VZh=z3_Vx$|`)=R-3I^eS6fr56Ke2?oyI%{O^r z?Hi&0Y&I3j_$Y+#O-k=D#J|k0^L4XV4wJU!C8ICL;WZs z>lov$YO(vzcbVhpY;hmWbp^KF@cY4eH|btvB&WUr-4#&Xu#4;24|FrUrbH$&8F?ZF z!i)JAZs#utnfxgyK4yCPWNys?Qms20H{Zqrt_}O!JJ_FbB&mYi_t7ghm{@d8b>jYZ zU8%Y$KO0i-b5hx%5%m)|w!pQ>EW9XGRE6CfbW|&zEPah9taAH(unMqak4KVdv8}lF zz&?j$_qJm2>R~?G%5#Zv)HE7T7i**Km)WR+d}x$PLtQ4v+x4AYNIR5>|QKh%*&_#W`9%2WeB!ZF&+E zh`RHrk5S~=rSzIg=S>7mX9a6aGyi)h=ACO>rVe^#&~|%e84%W>rCG{xf42ceOAY^d zvht|kKs;j2rl}Q)Odafc4xZD>;~AYlKU&1U$zkULIP*Vh>7H(-8M0=GMoHyskccu5 zi&>|G!j4BF_!iTll#-D!7Ad#6>D%I4^%eT2HTSm56=yQom~nxJOtpds>IcTIND^(& zzj=hx0_vAs?s~;e$AL#6-SoQCs2Q%CLr{G+@@9l<_m1FWx19@*4gG;;;zJ80(OGMc zc`;XFpSF=%U-Sguy76=>gS(ln=aK_s8e@Tr!{?H_^_!%!U#ga|4<`*ng!+-RnWPqS z$TZo2;}aEexH*(Jd>-Z+jffRiO!fLBeASYf*|L@1xGPozPDGrATFG8okf4Muy-t%E zq#nrdW+ruX-nG0xo4qG3Ef$6n&ux6di|D{;`@mvQ^+|cp8R}74Mfyz%-}hiIKfTh{ z(^h_fYrdjB&Alpk`XT=txC2(5`X@>R874#vaT};SZO?1%Khy7yrjk3PgwhIvGo{TWXshJN>V_g+A z^<%NZ4~tFUXQ2TCCZ3Dfh5#^K~MeC|v<_F zCMCR7^Vl2B)v?#kQc?R(GW6UcI4OO`CdcwCB`$b49MA^7P>_Xyz}+|BpY&PCQ6Ddd zFi#u9;7%OP=)@lDy&CHt8clVpz-%W0g~_2+L9uvDpr7Yfk9)Xw_nMCOcjC}_lI89o)vV|o5Gp!I_tD@vYs10R$1{QY7!=Q3cZZs&xw=9_ zmuN%}z236q*KT-QB);h~@ShXbxH#cH&6jP_s^x8b1JT*BbAQ_!%-d*M!FWAqAT3Uu zuhGTAegA-EPPf*|IkGB@$*J;79YxvXYa*s_b8-v%Mbf(Vj%&`U^x-5H9*Q5?lvNB2 z9CNx>1<&5KP{?ku{CHy0TX2^{+`Ri5C8K0GVArEXpDk3J%!;4b*fh$9mUpsh=z$9e zaSDBxNClcj-wqBuMYFhbmGfRbV7=BF8P5SoI96wd)lLlFNH@BpIgAuMYtK`I!T*s+ zX8liea9}ita#0oj`qrC30IJ(F;P&WD(0x9gSI^_Z??YOqs8!XIKcbbfDK4NNvm~w+ zyd_?H^7*%?Nh8*`_xTci=$aouG`$CJp_eLhoj}QwQk-Ygx+gOog5DUyd`9`^i=&tKXivzeyDmEJWUOMWQ{RmF@kA^V5Yyihy<@cDiGd zr*eZs$}z-GNRL%dPgFrJQ@pYt1OFe(+4Mi&snrdF$_) zW6-xlsz@woo&YMU!vNw|AcaLUM#fLW!|Xzpe^TJy6xQ;mBbX}DjMJcD%G}6fOGSm8 zo_T4t0h@C+i`@#-`Quumqd&a!^>;ddIH{ z^IOE+Y?Jf+y*vDAS4<;ajpfBiNQ)fX-hH6fK1to-{xyQ22y09!YgmK@R z!-mLxxjpOXCGl5P%;(MbDVA;eP{*%Vt|X#;j%L>fu3P$i74QnKnp+O5I|}Oy`zg!M zu_%wI>j^4432UeD$e|lb57HQ3yhiMpBdqKwb)nE6U>js{ArmHX+zAWP$p|zPFTY!9 zv8x&)6!hdBo3f=dD5SLuC|w)3x_<lk_Bq`FhQju(L@Ep%1a9ePqmKBXwjsg1x-b zT%>SDX5_opMH2IX3U#sfi1s49jPK-fY2f?$^Jb(dB9Y`@p3-hgOSciEm|!y7QhR;H z#vFyQDHuh>Ju@w`Q%>K-)yk9H8@JLXU$MJ3Nz^ddXBc58Y>|nmDyk?;_L_v@)aY;j zb1^eRL1~joK0i>5Y3dFWA7}v+r3^3V?*v5L8coUQ)EBa#fxB3E8XZd$Ojkaae2+b{ zo}ToGfgaEH>UBM%8c1$V%WF~3xmkcFYs81s_)|Wc}RxBjWozDF_1=Um6SbiXxS@=xyB|=cXD>!(n&GfCZ>L z{T!;!M<`CJ=tZ9=3)mhG@y)HzWLfwgZ0JphY`f*&Q8=aiXTc@t%;-`>#;X+C1k$Mm zV$c2&a;o_P*aeC=Oy^jTM+VhS2AAq0{xSK>$BvLeY{6d|wr>LK(jt19^ijvih{>Cv z2?B(ez)skKH$a3Yh*@kkC510ORst0{CJeV@C0JnayF^Q1Ye#>7l>RfE_x*-Sob01j z2P*{)*<}*Yn})4wKry_8cuvB7`Su3wL-WJUX?;hDi-n)A$s8zQza3SF`bm86?mZyw z@7JZF8yK525-(ABEu5@nceyejvXoJgZi#SjyIHZ&F`vnRfb5np|2ujve)LgFX&~_3 zs=@%2c90t}7^)pk4@>`5O1MF)^U;4IV# zAR8`eHgIkykQ|Se5lfu!=#X`MxFJx>eyKp=b*Oi<<>lpkO9JwMe_$SrJJAfMV$&GP zlEE7?+J%;5k8Hb4CN+MzsIy(5+tby2dEYc0=mGL0tG62da08GahqvL|tGsDGv1u0q zv>%6Npw+T~)Yf9{^BLYu-(U9F-QEbiSWSG_9iN=s z`zRO~HghU@$Rd;xNJ?%CpG6e9I7BuyX14Pqad&tiD?a4mKvN&r4hpefCWII}VAY%{ zg(W4`u5@?r-TOUxQ-!$=2$X*|ITU}Wjh9S`1*Q8#1*M^EB(BK_0h5ER?7fMb5n5>i z)(2@5#)o5lDKbV&P`sc8fE9{>za=if;|K6F@0( zObr6UGuHLz<6j7L6dlbkSJjn1#xxlKI+@tK{OzxR@D9U`x(3)!Jq1c!;}vv}1h^|E zC@9LYv@u+W+_FUba-NDaxA9~u^=|GI4gbjlTS-@e5L=Req4+tuC<)X!r|=BeKj|tm zu86J=mvlgkYa`0i0C8ydv=L$7YYmuSN0OX56Z@)9Ay>!t>V;AM)KjZ*21sJjJ*;$B zWwS~Hkujo;9w;mMHa2ugoZj-SadOhqq9iL^SR8IK{^7i^*i0Qzxi+=uLSc74dfZ11 zFE%}@BWL5kNO@(eVY@isZLt~dNb^4@Wm+45?!4{+<;0oYXMgUqjb^_)Cmk)dMb