diff --git a/CHANGELOG.md b/CHANGELOG.md index dde9c5255..6dcb9b8b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,121 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v1.0.0-beta.3](https://github.com/consensusnetworks/casimir/compare/v1.0.0-beta.2...v1.0.0-beta.3) + +- Fix nodes and blog cdk providers [`ff8a73a`](https://github.com/consensusnetworks/casimir/commit/ff8a73aff189602910ee53c4af742f18c27d3a13) + +#### [v1.0.0-beta.2](https://github.com/consensusnetworks/casimir/compare/v1.0.0-beta.1...v1.0.0-beta.2) + +> 31 October 2023 + +- Promote develop to master [`#447`](https://github.com/consensusnetworks/casimir/pull/447) +- Release v1.0.0-beta.2 [`783a59e`](https://github.com/consensusnetworks/casimir/commit/783a59e2affbe3e4315272a4384560e58a0d5446) +- Fix migrations script [`cfffd3f`](https://github.com/consensusnetworks/casimir/commit/cfffd3f2ee3926ceae0fecb9925401099d47b67d) + +#### [v1.0.0-beta.1](https://github.com/consensusnetworks/casimir/compare/v0.0.4...v1.0.0-beta.1) + +> 31 October 2023 + +- Promote develop to master [`#435`](https://github.com/consensusnetworks/casimir/pull/435) +- Make small tweaks before releasing landing page [`#445`](https://github.com/consensusnetworks/casimir/pull/445) +- Enhancement/landing copy [`#443`](https://github.com/consensusnetworks/casimir/pull/443) +- Bug/operator page [`#442`](https://github.com/consensusnetworks/casimir/pull/442) +- Update Table Headers [`#436`](https://github.com/consensusnetworks/casimir/pull/436) +- Fix operators bug [`#441`](https://github.com/consensusnetworks/casimir/pull/441) +- Remove export buttons and add coming soon to operator buttons [`#440`](https://github.com/consensusnetworks/casimir/pull/440) +- Feature/goerli network [`#439`](https://github.com/consensusnetworks/casimir/pull/439) +- Enhancement/goerli cleanup [`#438`](https://github.com/consensusnetworks/casimir/pull/438) +- Feature/eigen toggle [`#437`](https://github.com/consensusnetworks/casimir/pull/437) +- Promote develop to master [`#418`](https://github.com/consensusnetworks/casimir/pull/418) +- Feature/migrate new landing [`#431`](https://github.com/consensusnetworks/casimir/pull/431) +- Fixing ts issues for deployment [`#428`](https://github.com/consensusnetworks/casimir/pull/428) +- Deploy contracts and configure variables [`#422`](https://github.com/consensusnetworks/casimir/pull/422) +- Enhancement/fe loaders and adjustments [`#427`](https://github.com/consensusnetworks/casimir/pull/427) +- Feature/wallet connect v2 [`#426`](https://github.com/consensusnetworks/casimir/pull/426) +- Feature/composable refactor [`#424`](https://github.com/consensusnetworks/casimir/pull/424) +- Update/composables [`#421`](https://github.com/consensusnetworks/casimir/pull/421) +- Fix app bugs on Safari browser and Brave [`#420`](https://github.com/consensusnetworks/casimir/pull/420) +- Implement addOperator and add node_url as a field on Operator table [`#417`](https://github.com/consensusnetworks/casimir/pull/417) +- Promote develop to master [`#406`](https://github.com/consensusnetworks/casimir/pull/406) +- Reorder functions to match styleguide [`#415`](https://github.com/consensusnetworks/casimir/pull/415) +- Revert "Remediate Hacken findings in contracts" [`#412`](https://github.com/consensusnetworks/casimir/pull/412) +- Remediate Hacken findings in contracts [`#409`](https://github.com/consensusnetworks/casimir/pull/409) +- Enhancements/fe tweaks [`#408`](https://github.com/consensusnetworks/casimir/pull/408) +- Feature/new landing [`#407`](https://github.com/consensusnetworks/casimir/pull/407) +- Stream events from local Ethereum fork (Happy 4th πŸ‡ΊπŸ‡Έ) [`#366`](https://github.com/consensusnetworks/casimir/pull/366) +- Promote develop to master [`#405`](https://github.com/consensusnetworks/casimir/pull/405) +- Promote develop to master [`#397`](https://github.com/consensusnetworks/casimir/pull/397) +- Add published ethereum docs [`#404`](https://github.com/consensusnetworks/casimir/pull/404) +- Reorganize documentation and add setup check [`#402`](https://github.com/consensusnetworks/casimir/pull/402) +- Add default env vars for contracts addresses to cdk deploy script [`#403`](https://github.com/consensusnetworks/casimir/pull/403) +- Update/local demo [`#400`](https://github.com/consensusnetworks/casimir/pull/400) +- Enhancement/fine tune uiux [`#401`](https://github.com/consensusnetworks/casimir/pull/401) +- Promote develop to master [`#373`](https://github.com/consensusnetworks/casimir/pull/373) +- Add operator selection and internal operators for testing [`#387`](https://github.com/consensusnetworks/casimir/pull/387) +- Update/demo [`#388`](https://github.com/consensusnetworks/casimir/pull/388) +- Feature/operators db [`#386`](https://github.com/consensusnetworks/casimir/pull/386) +- Add operator page and mock data for it as well [`#385`](https://github.com/consensusnetworks/casimir/pull/385) +- Add Foundry for Solidity docs and tests [`#382`](https://github.com/consensusnetworks/casimir/pull/382) +- Update/mobile wallets [`#381`](https://github.com/consensusnetworks/casimir/pull/381) +- Refactor oracle handlers [`#380`](https://github.com/consensusnetworks/casimir/pull/380) +- Fix typo in BreakdownChart.vue [`#379`](https://github.com/consensusnetworks/casimir/pull/379) +- Feature/user table data [`#378`](https://github.com/consensusnetworks/casimir/pull/378) +- Add action schema to track wallet and stake events [`#377`](https://github.com/consensusnetworks/casimir/pull/377) +- Feature/front end data renaming [`#376`](https://github.com/consensusnetworks/casimir/pull/376) +- Add start block and compounding to dev network [`#375`](https://github.com/consensusnetworks/casimir/pull/375) +- Feature/populate staking address [`#374`](https://github.com/consensusnetworks/casimir/pull/374) +- Feature/connect data to table [`#372`](https://github.com/consensusnetworks/casimir/pull/372) +- Feature/overview metrics [`#371`](https://github.com/consensusnetworks/casimir/pull/371) +- Promote develop to master [`#359`](https://github.com/consensusnetworks/casimir/pull/359) +- Feature/dynamic chart colors [`#370`](https://github.com/consensusnetworks/casimir/pull/370) +- Add users and web CDK for deployment [`#368`](https://github.com/consensusnetworks/casimir/pull/368) +- Update/user schema [`#369`](https://github.com/consensusnetworks/casimir/pull/369) +- Feature/more fe integration [`#365`](https://github.com/consensusnetworks/casimir/pull/365) +- Feature/athena query [`#367`](https://github.com/consensusnetworks/casimir/pull/367) +- Analytics service [`#361`](https://github.com/consensusnetworks/casimir/pull/361) +- Feature/breakdown [`#364`](https://github.com/consensusnetworks/casimir/pull/364) +- Feature/fe integration [`#362`](https://github.com/consensusnetworks/casimir/pull/362) +- Update/type errors [`#360`](https://github.com/consensusnetworks/casimir/pull/360) +- Update CDK stack to initialize resources for analytics [`#356`](https://github.com/consensusnetworks/casimir/pull/356) +- Feature/functional components [`#358`](https://github.com/consensusnetworks/casimir/pull/358) +- Promote develop to master [`#330`](https://github.com/consensusnetworks/casimir/pull/330) +- Add pre-audit contracts with dev simulation [`#343`](https://github.com/consensusnetworks/casimir/pull/343) +- Feature/screen response [`#342`](https://github.com/consensusnetworks/casimir/pull/342) +- Feature/connect auth [`#341`](https://github.com/consensusnetworks/casimir/pull/341) +- Update/types [`#340`](https://github.com/consensusnetworks/casimir/pull/340) +- Feature/redesign-analytics-layout [`#339`](https://github.com/consensusnetworks/casimir/pull/339) +- Feature/more wallets [`#337`](https://github.com/consensusnetworks/casimir/pull/337) +- Feature/check address [`#335`](https://github.com/consensusnetworks/casimir/pull/335) +- Fix trezor composable ts issues [`#334`](https://github.com/consensusnetworks/casimir/pull/334) +- Update/calculate fees [`#331`](https://github.com/consensusnetworks/casimir/pull/331) +- Feature/ledger multi [`#329`](https://github.com/consensusnetworks/casimir/pull/329) +- Feature/new design [`#328`](https://github.com/consensusnetworks/casimir/pull/328) +- Promote develop to master [`#318`](https://github.com/consensusnetworks/casimir/pull/318) +- Update/siwe [`#326`](https://github.com/consensusnetworks/casimir/pull/326) +- Update/db schema [`#320`](https://github.com/consensusnetworks/casimir/pull/320) +- Test mock aggregator [`#319`](https://github.com/consensusnetworks/casimir/pull/319) +- Hotfix/sub account [`#317`](https://github.com/consensusnetworks/casimir/pull/317) +- Promote develop to master [`#313`](https://github.com/consensusnetworks/casimir/pull/313) +- Feature/get balances [`#315`](https://github.com/consensusnetworks/casimir/pull/315) +- Fix hardware wallet emulator [`#316`](https://github.com/consensusnetworks/casimir/pull/316) +- New app design pt 2 [`#312`](https://github.com/consensusnetworks/casimir/pull/312) +- Promote develop to master [`#307`](https://github.com/consensusnetworks/casimir/pull/307) +- Update/user verified [`#310`](https://github.com/consensusnetworks/casimir/pull/310) +- Add automation upkeep test [`#309`](https://github.com/consensusnetworks/casimir/pull/309) +- Enable login with ledger [`#306`](https://github.com/consensusnetworks/casimir/pull/306) +- Implement withdraw method in ssv composable [`#308`](https://github.com/consensusnetworks/casimir/pull/308) +- Add dynamic balances with mock rewards and distribution [`#299`](https://github.com/consensusnetworks/casimir/pull/299) +- Add contracts readme and change balance to stake [`#305`](https://github.com/consensusnetworks/casimir/pull/305) +- Promote develop to master [`#303`](https://github.com/consensusnetworks/casimir/pull/303) +- Fix oracle authorization [`d48716f`](https://github.com/consensusnetworks/casimir/commit/d48716fe8594c44bfa06ee4b67c3f7629fe63648) +- Change FunctionsOracle authorization [`311cc2e`](https://github.com/consensusnetworks/casimir/commit/311cc2e3631c03fa7e7e4e5fed489bb72ffe5dd4) +- Rebalance a change gracefully when previous total stake is zero (skip deploy) [`3b79d03`](https://github.com/consensusnetworks/casimir/commit/3b79d03d7563de3be633fb0e49fa8006d1201920) + #### [v0.0.4](https://github.com/consensusnetworks/casimir/compare/v0.0.3...v0.0.4) +> 30 March 2023 + - Promote develop to master [`#302`](https://github.com/consensusnetworks/casimir/pull/302) - Promote develop to master [`#301`](https://github.com/consensusnetworks/casimir/pull/301) - Promote develop to master [`#291`](https://github.com/consensusnetworks/casimir/pull/291) diff --git a/README.md b/README.md index f07532af3..5b3dc434a 100644 --- a/README.md +++ b/README.md @@ -163,14 +163,14 @@ Test the Ethereum contracts. ```zsh # From the root directory -npm run test:ethereum +npm run test --workspace @casimir/ethereum ``` -Deploy the Ethereum contracts to local network and simulate events and oracle handling. +Fork the Ethereum contracts to local network and simulate events and oracle handling. ```zsh # From the root directory -npm run dev:ethereum +npm run dev --workspace @casimir/ethereum ``` See the [@casimir/ethereum README.md](contracts/ethereum/README.md) for detailed documentation. diff --git a/common/env/src/index.ts b/common/env/src/index.ts index b5eafcf17..8198e6d1d 100644 --- a/common/env/src/index.ts +++ b/common/env/src/index.ts @@ -57,7 +57,8 @@ enum ETHEREUM_WS_URL { enum HARDHAT_NETWORK_KEY { GOERLI = 'TESTNET', - HARDHAT = 'TESTNET' + HARDHAT = 'TESTNET', + LOCALHOST = 'TESTNET' } export { diff --git a/common/env/src/mock/validators.json b/common/env/src/mock/validators.json index c479a6fa2..8eaa3e80a 100644 --- a/common/env/src/mock/validators.json +++ b/common/env/src/mock/validators.json @@ -1 +1 @@ -{"0x728474D29c2F81eb17a669a7582A2C17f1042b57":[{"depositDataRoot":"0x20f836e02a230e9b2145e8a5b015db9dc262e5986ae6007e66cfc4535c02fdd3","publicKey":"0xb1845dfdbaf5665d69f66e8f47943be98b848a460213c352ed436d27341ca11131b32bb9f28ec59ab927278c0ed46b1b","operatorIds":[208,209,210,211],"shares":"0x8a933d80e0fb5bd943485e156a939c6e4ba34eb8e1845c8659c5ca227901a1cc3ca2a23463d70a22acccf2850107dde606fafcef8d4a8aebd4da03616715f135378ed612174b2dfdc12daf72a903b3b9526f73a2200555b6aaf0520cfc691262836c154786ef3bfd6daebf6c6a3b3581a86f64637171749a892f9d89c3f716903cd717d7bcc8f6e20bf0e7560c948179b3a3147f55783201ab7797ceecb8ad63635f917d3e978f26253dd9fa5ae1b8ef1d47676b496b1c29c69ca75cc2836e0783feb70ce2890fa5d7a421f300dd33c58dade7d8b5ab24b54e5dbdee358379e3234708d6ec7f2bbf585f6d7703a69c80ab9f850dc9f731289a3fe867731b315b9ebec9836cb48a9c1d4f28430b45836485ecff9d28121c03962f043534721d537b08ecb9d323a1fa6853bf464ee41eb74ab74bc00c7fdd10291a3ca2d8ab33df9a5fcbf716a90fe9fe641e2e0426d2470aca80d0917c655d6cd523cf41eae21bdc207d1a336ae9a9d0315b8868aac10f221dabc4e769858d05a288dbe5ea30a6a4f3e62599fda39c27e6291e2177556a13f9c433f5b5076476630fb32f2a8cbdfc8855b33288c4c8ea328590ca33742bff461ef15bcd47088250ad5333c7e621cb5c525534349524a5b24f72e90edf0b646d3a630cc9b1b81632ee975ba3450c90e6214ecc22b3bd6963f5065fdb6916b3a07b45a31acee1468531bc3a23bbb6099ec1e301c9c929f2f421bb4448aebc7d7a3a35e8bff35bb1fff40704dba51e0ecaa7832183aada16fd2d7f6650163b121444cb6948d2b56bbfe6634cc93ef1cd12986331e4743dcaba1b93aefc683c98a08d2577f4ec7bdf6d3b529a4aa9023a7113d4a3ca8897bc8153a8573d9ad07d6f39dac0fdf7f3f5e6815299d054ab5e676106de81f0f69e61943ffae7b3ffba10a866c5f2a8165f6e0a9a567310d24e5ebaa67a01270109986778a38e57a1d9c3b4d57511495000500811010a403726914930eb4d48837c8f3f243d57343763077b2c7c224ccfc35e29823b11818c216237e0f29c494c119e71cf43b6839583464387939ad233cb2fb812b9d5460d0c03b66afcd8569f55b118083ad82306075bb8ff502b6600bf5e8fc75d1695328516597bee5223d3b8136427c71cb693760062bcd351fa20199a7d4fa741142c287b7238cfd8bfa3c8d9ebbf54e0e9493d58f5c7bd17568723bc4f6a96f615ad45649516abc92aaeddf08880a859b0f7b5719b182735d17fc2a06d51af5786b14640b8568f564d450581d06f403384edb46bc40c6741acd547cb5f9952d1f4d696ffd1e23608641dd3ce076d7568fcebb809c4b668ba0ddb2268d505bc7e5f57f72e4f7af4397132656c057ab2725a52ff0e431d06564d69c92ae1045330f5252b05b49ad31ca5904566797cf911bc448d172f606f52c9ca4ac8fa3fb58f497a2576044499d1c2a0e603ea9c4ddc814d4053dd5f4a9d38b9d1332330b6e1b894df16be9c3f0fbdf96a3c00982ef586e9c8e9cfeb8b63591b03106f14f80b1a6a13c045b3c104b04d31c2751b4218a6973bd347e69b5a0981da8abe10f8083d22fca056792391528ecfeea5e3a516549d58d6e4a5f838e1823c67e612c825e8ad5d190acc57c647c53e607205cc5db5b2056e05873067f6083ab4eba15067100ddc48cd685e7c2e4a9012740ef266562f7fa41d99dbface4294d4aac0151584f2f7e0a7ac556135521cf7442a8d12fb3f037b7982ebf443ceef773ff0aab0cea1d7115526755516db032e052e13867bd905f7c49e48c268f47ab92ddc2eddbb5bb97f298cbf061cf3a476cc243e3368299e989aca36602f51bcbc61194c955a47","signature":"0x8b1e8b51b4dffa13dc8946cf59244335d34721acf5cf3819a9259d14d4765cf1417756517e86cb4e5fb15bdf029b58ad0c18ae5613681176ea9bc5d737733848bf7e0f5f4b25452768b14200b337141214a02d55d64a4e60cb1cfe233447f251","withdrawalCredentials":"0x01000000000000000000000067da79860b3d49fadf28bef8f810871b03e93c7d"},{"depositDataRoot":"0xe17ffa9a458d0906d920c235f5fe750f4644657b221f2f467899380cc7c2b03d","publicKey":"0xb73bad82c4f7453839c4621ff05304c6e4e682bfc8cf8f22f21a4b702fbec7c63ae39c3683a9be95d3edc1d60ba0ee69","operatorIds":[208,209,210,211],"shares":"0x895ed1e2685e29565e89d73b887cd1ca2f5349cd2809b4596c9e4a22ffee87fa857df84ab6245fe77cd04fa2c8ff3f8708134fd92b71e4e299352bf5c49b60f860f625d1264f0cae8a8e5865468a0c501a1e6e255b6387fd7e3a7dfee336fa21ac0f2f5f05b9cba9b87302053a8b56997549791e9c14cb21e45c19798a71d79e519155731f910b71d11add1175f5ae0ab867d67b4142e7d41771afcbbea3ac65b3ba501bf7bad83999a0b62ec6f408798d0320c09633ecc5276575dbeb5e3c6a828c57615b1e83943dddcc04147fdd9eb8101223735be23ef90f76ca36232315818768d646c8d6bbe451f845380bbfcca6d5da9b34ee6a0259d304ab1eca9b0c8ed612bc4903490b73ecb886034e56ba684af7b302cba6e5090340aa914f604779a5cc62144e6415ef154ef2e337ff6d2cd2cdd57ac0b4f5df128b6ebd1357830e775f8e80e8ee3b33a99d827ac2a7e46e7fd8e29592cc587d3da6f601c0a38394a64d2e0a066ac75caefad37f2efd2958287426ad87a7122009894e8f9bf25d700f9535d67acbd588a659ab76964175a087d244b800192d09e92b0573f19d1d4dbf0e17e8a41189b4f0a1c263b93562cd34980587cfd24f9ea31a0e0fc8f897b919ba9086b2c3d8a26c642def1325b0f9458ac3ecafda8ab96900b353667425b6ce0f66df976122b084a7e99e2c485559bf3a5ff114b3c7097851c7cb74c1dd699e1f8cbc84cc4f9fa7a21949baa7598078ca8adb0ad616e0086e1a2fd15203370c881fe91b6f7c1aa967e4b26b613f6c9a9dbc0e9ea93d0bd0fea61d87931c4cc9bc4ee2766e8e420f4d17dfa3e354761cc04a1c37aa89d9cd7c9de621e4cb00454a6604293b5ab46cc69fe9de18be98e2b8216afb280026a3187276efcc1089ff96d3f8c373c88ad1787162c3fc95206f00cd9eefb06083a1effa911d63ef4cda560941f589f236c2c15f5e66b648ab831e1c7df4867b174dea392a7992ed9d5471925b0c8b7567c5f60130bea7759966d390d1165f3c53564954a67d218c4544571b1b008c16b5adbfc1658bb173bf11b689c872a139d64d090a432cb6173b1a8d0122053d6210c0e1734d2fd20bfc6a3dade5706c88300f4a2ddf625ada6634073e36d08bc155e4d5996b6870ca3620a187a11a579083d41841ec54cd598bc1e2a351db14b87c4bc34fcca7a86d29317b09fc016071b1279b7b318640d18838ec8a9660e1efa530352d3b26e9bb2d10ed38aec2a593d93dcdf45c4a441a047449bb1839eb35b187f981fd4c2a7c41a87082ba8606d501ae356e830a2222832c54bca6418e6eb69eaa11bb6ae84f5e0ea5d6515ab6aaf8061615871ba29c30efdee803694715b47be96887111e504a779a1612a8da7c15c8b06e3cf5ca9289f1865b627c7671b38b0f4dfd99a70011b9af089f14d2d8f5b8b5becba54c332a883e422cab6716fc1356794e3cf18970bf65624c6684b8b59d18dcd849a38122d3f8e6918a356c255ded9df45a5df269b9a81592889cfb1f5eebdd2e644476bd2ccd5aec898277594a04a93bd434ea9f56fe37b574b10caa2fd7399eb5e55717375cf95ce3cd0eb9851df21e112a019731a1a264456f78fa8298954408f833275e1e49259b985e043cc0972694c0bd3cad43568c0ce100d50fdf3e9ee8c46d2da534c0ca814b3d0d3fa7980f830eab1f2f6f9804d0793a8a8d270469e16c3a916a0cff038fae011c9a628041c1b60b03c8a6b6201a40039448f655361f46b4eef85bbd60b47e06de9117518a3c378043164dc68426089701346f121804338ab0fa3a098199736e9e5018235d73ce46c0585af8bd084058f97aa93eae9591d2","signature":"0xad9bafccb36e05f5eb38492e4e7b29d24629f162e052377dc37c03b81bd1980367c0b51622ac0549a03f52847be8f32a10180991d7d1995a9ed4ea2362fb24991839486e732dfa4e7b524b1084265b41962ccccb85bb571a07eb3f40c59f81ac","withdrawalCredentials":"0x01000000000000000000000043ad2f97d01cbfe7eddc13f06dca3729ea25d6e8"},{"depositDataRoot":"0x57fb272f0d30e8560d2aea4dc90cd4b5c4299627c8d77d6423c0c88b992c04c6","publicKey":"0xafdea5bc2ea1fb96f92d0ee1a0f97966b8ca58097d4692e95d8e8cb50ce89885acd83a3f5e5fa208285a65de12e87036","operatorIds":[208,209,210,211],"shares":"0x8452d40315d76891ba8203da6f3e8b2a8bf86fe4a3937b0e38e1397449195c6116f49332f9f69ed932ecc2aa7fc1fc93139b0c2067ab125623eda68b48edf0fc718ec60a2a2770dd3787e2a38c6775d3c3ca0792c68832b6a6e4d9bae62c5f6199f42db948e1c8a4eab67c02a2bd186aa1d12fc686121969e645958f51adbb127fd1795fbc0df4c129d7440e295f0d6197c14a7ec47a4bec37e337dbc61a55d637a00abf65c0671a6b4ffe261f44188bf419d10c5b0d3fe42a515d0af8862e3a943584acbec240d6c7d16fae91eaf90a05971acf0e80274d468f4ef6f448a65f60b36cbe1bb7470d8a98a0a241c49dbd89b56c125e85952dfdf35a83b81a6ba1acd171f3e19f7d50cea0e7d540fce5f5475b64d16bd6fc335fcf5f44270b2c078d52d79fa4b234ac46628fa94a121ab8995b643854b6c414d1dc7173a6a2a6301fdc97957673df4e09bce9e0fa864b3db58839866d8b7c841e6ae7d0cf62f30eec2ebd47f67da0e3ed3f4c405583532488608d03bcd4d9323d35d474ee98c26902a739bbe66affde04a765f8519b6d68937aea9678a837dfcc5f0dbe9139a7113b928824bb1efee3dda887eab05561d410cd1aa96b86d9f67f093659fe082259ee3cf04cd7d3bbd11afc88bfc3666580b825fccbdbf01d5d6a1bc0f1c0279b9a06529e65a372beafdc8e8705c6ce42f0237852d0bdc8ce53a6ba7effd48c017e6dacabfd8c4846b026bbae2258e58e23dfae0603996d07770255d20fd0b1cb9946ed5dd38dd7ed234fbff0171ea42adc9d8d87174e86a6925bccd6ac198e623b2e433912613d25b54b559d14fb671906239d4f79236d13cb486df29d3314b919066569f719c1aef59a993e813fdbca9f2f81f2933fd483155b78d467753fbaefab5a56f9d65a24f5778018361be538c765221e3e4a6e946e72f2e19b1aad9125b0aae36009913c608856ef1605b1bad6a0774ce2cf7fc486556a6d1d4dc3988d72cf40d3a0713c110de03aa8fb24a1fb5aecd8eccaca7290a0e3faf87bffdc6ee43c8407783226e0dae57bee478f331953b53db3c3953b7a25a2cab2e229979cf21384aac21f4790416e2c0cca53c4a90ef47a238c5f9a04a02e977b5c10eaaf9fbe34f537dabb425d423ee64cd12554b47b8e6da18b729b9d3b25b37976ee83098b085c727af3d1856471fda29a97f7455475312e2d028a7e3b0f0e2f0fcd5ac9b68fa0b8888a8f2e5dfe77608174c891334e845efbe6e4e896f65d2d42cc40c4c3908a2899c0958948dbaf8b50d556739c7e2db0fbd49a310731f109775bbab52a995fd54dcb26921743ef071dac93be5a3f0693d7091c5ce38418f8856d48d8e603723a524d1625e3ab47d481e0d2465da6c6123d59f76fac0b4381b3428a7ce7003fae993bac250c69c99f38c9d669644392da0a9be141894fa665f30ae7f77bd3fde98101051dcf60f0dbe01a87b33043a4095884ff834d116da968d38c9b64445683c7411a06779f303fb05a464335a65f5ceabc7aeb58de8a8a1a97e6c99d708b4d15efd2839b74c6b04bd7d91211c757c4e2dac7062a6ff5b690d7c908af06b01000f297b03ca863e5785a93f75e3641d5028dbd3aab4ed78c7020961cc6e846b7bca20d87a8592ee0a0f66196c2c0b4ccc77448b66e8adaaf730e8b7791f34be8885cb82939bf599edf4726ee27494f0a8ab88f55449bd7aa9e43140ffe717f732d4f9f0fe19ceac5e767340d3870cc4ecdb34ffc5c6ff30b597bcf37656a729ffac4b9bc3547021702f9b0dbaa578950d4273d352ee86d4c0fe440ea6331904de8768ecb431a816a8b4f63dac61c8690ef624dc740e0f1528b7907","signature":"0x81d5c9ec279f9691246b5bba9f7b0c724dc416d1fc89dccc88a66e79773264336bf95210298f213fb6ae46dbced4f17015df528bc8197a0591d6298e2da87ef7816d55884c32f4e1b3061c8743fe0ccbc7e0c0667f3de2ef8f5f806ce7d3e782","withdrawalCredentials":"0x010000000000000000000000bca59dd097d6b98635a7853ab8685ad9d307d5e5"},{"depositDataRoot":"0x165cb28e990cf7a824859e20b366d064a735555d97baff2865245b17152a7c78","publicKey":"0xa3c8857c4952a9728e2d19cbf47500001b103c8d39bdba2e3bbb60794c46d8cbc1ebaf5d76aacff8fc8acd29d0ac0141","operatorIds":[208,209,210,211],"shares":"0x935688cc9d88ce1386b58089ea7e16f4e430f355aa6fee9d8977f442bdbc2caa26c5bcf83ad74d92cb11fa235a68b3f309e749792aa958b0dea34ec3154c295f6d5eb35ed5cf7320a3348ebafb7fb4fe2ebb737257b7ebf0114578b07ba3564eb8634f90effced62c673b49d754d2c9d312e21b95646a8350732ddd10d398f00b861d3a43f129fe8112c321231e25e128a78bb3fa8ed7488b1077333e0e0814e74d2b6863d0f9961296b43c7de8479463782d33686b6a232f7c5d4182f3b1d7b9287c526f850f62606b6b667b4280e7b14ab169bb94565bc27a85784cdcb1943df9b19ecb0a9aad97401a08d4522e16982e52dfd65867d96e7b1c5098ce5bbe094a73e4d6dbf964b3f3e99881fa9e20cc10c6a7ce868620005c6717dbf93fc95b74970a0607c7cbb5c8b7ed86b6cb2bf4e985cf6b981197aab27f4fcf3ea36b0b6becffe3ad73e9934ce2804d2b4d3fbe41cc5518f112492e489a9c2b5ec99daabb6d3df0cb8101cc7ce78f3da294927ab24708ceb6a5712fc7591643baac878ff0f30217e898f3f21e740fa8f69c4f6b6588dd401821b1d7aa7605fa06004a5d3fe5aa7076959b1c3261009ac13b7d52dce7d787bee71fa865232337bb3ce29ac363ad15887c3fb81e1a1e2737f9b0acc6dc93bdc54e56b156b451a5b0830f1225a356355efe0a918a59c32217785df13432b3ece81a64af4c940385154b5752f195db8155e8cdcc91965c223bd7059be84b01f5982c35ab2264efe31219b861e15e3783d578d9f563efa01eb78591edf96678a2542f9697e8d30c83d22e0d9dc08f1ab881c2c48922a8085b01bf29c676ce960d815a126b266c03e6076cb3c90fac2a0875b06694d2a960c793bae7952c0bd831c6d3b7076cad842a5b698f63203035c4673374b8dbb5a643ee892e40e81b1be48d81728953d98db5f63741b13d7346055eb5aa2f01994501338e1c9a04d8d51a1d55637eeb89a43deaff76aeccfafa5eccf4dc0f39eefcb639cc653ef926d8417ef886b1fd3ae016268ab7361ca3c7f9404fbe44380904bc65dd746ad8b3b47d1d86085d0eda2b8474d652cccc62e045ead2bde56f502042086dba9612097547b46590814c1d8dc5341c51632dbfb61f100f8d84d3003dd56866ef8e80e00853f3cbb2ffa6ce593729bd26801323b8835cdb3e4cabcd9005c2936cf6e4663755aadb4cb096346893e625f7fd9d074851e9dcec1ee6122391597465fef4d631761efcac8c408452665e7c94debbfcf84b1b9636c83332b3c82084ad7e730a1659d503e6e317d3292d7428b4fcd0ff004b0c63df732f227c9bdb71d0bb5493e6910dbd94a088598c190b632d67e87afa0b3a672842fe7934345b8a2f410227465be45275030e7adaec7e6af1ff8585400b3f2e03041495ecb103cbacdb8253f2bddc136e07143283f6bf36f3f67d705e53af9e709f559d88c244f146fb78369c270a62f25a642e316b77dab0b0948a0e8f222c033428b0655e32da9487e4e6a943a57da26bf9813719949f89649df8a78c71ec6b7f014d573dc3e8a04f297cd35fbd0c7226d2ab2e01d75a00b10b7a8adcd2ebd2684900f80ca2e12de25617e290a06bce2e19145144cc159baeab3e0e0f9f93beb3f12778fd12330d3da6abfefe2ea4d31edc144dc4059706288f4b6aae70b9555f10cab66f64d9a8c8d3ae94e2f0e325347a7681dfa186900414d5ebc558536c4f07c8290e9cdfb833ce7dcc5c63e77997b39935b1c31e961316d8a0e5a695b97a8e6a7dcd861c6e13128a2a736dca0a5b385cc31e5a43b32f9db386b9ed4d08f20dfe6901f87644c1a50128709319f817b4f93bd0e29f675","signature":"0xa0e934658dec3f49ca4ddbaefafb83a9f586cd5dede7799e7cc519ac377e643f5b4ec39ae20e07791cd77db16c589a6e021f583045d4f3c138a74ddcaeb3d4f5ce00956564ce004d4ea8312c3a5c113a6a8b94d69eab678c24c6d539221fde01","withdrawalCredentials":"0x010000000000000000000000ff2e89ad7c57dd5b39db208a0b34a222654376f9"}]} \ No newline at end of file +{"0x728474D29c2F81eb17a669a7582A2C17f1042b57":[{"depositDataRoot":"0xfde8f933f30035970f82a822b3dcea3e35d2258603a74dc0ea688b779e3315dd","publicKey":"0xa983956ba0220cd93b1a0786add8407fd772fb8a317b69f1a8863364db9379b9a1eabd0b3eb80170b25c35b348bf645b","operatorIds":[208,209,210,211],"shares":"0x83ee3fa81ab826b782f7644e564c1f36582c7e80855926e390f3be9fcb55adbdf2e4573824f84850438e6e5c308a9be606b629df68cbb849b4ca329b6994626327af00a804af4ca4897215ba41e948a455b92feceeb327ad8e35f5d23ca7c647b727f1d866de8e3cabd9091cc0d645dd80b371f41062dc43ca09daa9f4921995eaf502add9f9e1fafd5489799acbf33da03f326e61dc707019e44f54c199cb08a40810be6da6a89360065433c0ea6d631d0ac95fa92b4dea2c68757e3bebf72bac797b1f567e488a715487a865b481c4c2295267f57cba84f117ac85fc15576d1c136e49c6bb9bba92bb0c18f5eb69fab9491fdc0929d0f82ae99cc4b2b712056098f468901cf26915750ef164ab4c5b78f6006d33b7d0b34ee9b725f743594ea321b514bc30b66690c755bda6fd74717b6ae1568f1e16fb3f4482f1699facb093a92839e8aeaf61c58dbd51024757c8f8e379bc96efca2bd466b5a679ba1a259c11836684b6ab96f9fb1dae236563032e5ef142c31e2151d0c5f3d4266622b3db7145762403db842e80de63164f979f7aa9c219441883eb2f504c57750937931d2568f7407eac080a91372ed279ce2777f06ad6e2192ea9714b7261de0347d5eb31f53cc243ddde1a8e8e941ee8221204a940ac4de4cb950ead5e2f10a85b4bbf43992c86e5f2b0ec0353b4bb9d000fba25d54680affa39afd238213faa1d5879163b2995d654638715ffdc63730fc197b5cee4dbef3f24f2d70e5446587da44a5200747b5c129d45ec0536ebd6bc5df884e5427ac93827c877909bac480b44b511761c23d1f0377d5dd21f1473a06d84f6b2729421efa7da4edd4149f81a1adfc6009726c8d3c328795dde3c038a2b2b4b26266f52a82c44eba677e10bebe3898e070bf759fc8026cb3f060c92ec70c8de7ac6db0b82a9e3850240f3eee19a3d2a6f55c583c589325d5f9f328fa08853dfcb6ec87f6e5d599df3b936a3f40b979c2b69f8410660b44914a6e04a5e2876116d63e5d6d971b287536762b1380cd3718ab9a49ffe03773e6f789d7302d3803eaf5f309af7fe902448d89b4a6d03a71a9c8bd1ebfe1185be1850a2a13ab6aaccc6bf6fe8f403bab6f338a53d453b720019590022c7bbd085bf08321b3d05130f65f536c95a29851c4f538dc40a3f0b46061783bccaae5beda61fbad576b9f52a906220d25c97a32f1e092b569256520519badb6825673c88501cd1394b0ae4a83a8521eb8617d307cd8f9008e36c364d5fe44ccd3676793b9ce1b1277a55ead908aeae67099c2f258cd49b70456b896c3ed95c9978527935d775d89f37c2e44d1e752026469a27c1d4a0033f8d19b1a7e01bebd319f00f03ec13c43ea5deef687aa22edd1c306e9a785b364d33fa6c5c20f39b4ab556f29e64ab568a83a8f967aafccd46f0adffc24c22d4c1591b3ba4567c251d93c386948656b68526e0cfd729411eb1da68b205958c5ef6904d886dd80bd5764b621a9840566dad150a63dcf5178634f6e97fb394d1889284758d365870baa206535f52813524508d617b49e2fc967fa5ef359fc50c5fb593a1fa91a9bd63eea3c269217c19ec459be4f61caa5d7eb99c386bb87cdb9e422085bcea50999b09ac6d18f302a41725c2519ed35101beda3dc01d35a4ca4e4feac7a32d43e94e78696df8299f767021150e6e7f882cc135a11e537ac8eb926a2b88e6f30e9bffde7decd853f56389d4dff33c0849ef9065a84b0c69a71677cf2438321a44c2e356115c18ed7ffc1b9c3a35dcbf1515983973d99c61174cf7ac639e743fbaeafc9be258566f50b10fa9c6351868c2999f414a868582bfec29ab25f3","signature":"0x8e18b9489cd59cdd9745763c00ed23bd557d298e70588040a8c67789642be1c20de10cd04a77d58f1e0df1c036a16191169b3aecc601d61ddf6329b0766ed3d02d46005f7a5760932929d3dc9807c0628d97911888cd019e449410ac79c39be4","withdrawalCredentials":"0x01000000000000000000000095591055f06a1b7a2186482118cebca5b24bc5cf"},{"depositDataRoot":"0x7771af0578a9b05eb2b2b9fbae27e39d0c4cf6ca96b26b5e1742cf450bd4d218","publicKey":"0xa8ce0a783d5a7f72ce5cebe6e5381b7c4159c13c85a8c93e030175181364a29d7d007ba4d8d6a07ef6c308488ee1b9f6","operatorIds":[208,209,210,211],"shares":"0x9310a42a72a6e822c30f2bc963526e82dbc6db82385aff0a8a5f99566fdf1fb21bcee293a29b1ce9a5d2ee4b7b6480b0012af34f1a11cef5a834cd7ee5b9012d9a80de0900adb9e3844379b45e0932cf5d9c06fe1eee0ed348d13bfb2fe86270a0c9e6165624e6d8831c627273f8aee2fbd1d5d911f0e0eb12b136c4d92b78d84e32c536503e6a236b2d9ae7ffad149d85d9e5f51529935e6fdb8d921672da78448d29a801cd33c42a208d5607a7f64abc3813d1deb57160a1f2d3ddca0dc5b7b1ca3664ce08f013686cdc212affeebf821a383952e5fff1ff1e1fb204bcf39197f8305eb685203258f6834a1919ef8dacd0f123b2f753f48afe296aa5f3c0e77b437af8e7d64ce1a2c871eb43a85e781634f1ae2d5311e4bd960df7b83f60cead25a6d0796b7a5bf0a239741163ca3a327fe62335201731c46ea5799aa8505c3217a1eb0720c0bd2a6a4a7e1423d1fa7b52e037d905ac59fe1104d09d4801cf2b4cb4628c5008003fd981de10b4bed2e3ec0f5d7e609147195237e5dcd4d6cbe0a277e8de2c6dbb3a373f97c3445e8f6c648a07c36dc82dfc10da9e0e26703672a1b7ca0169eb396a62014ad2543a868941eac12786810d072f0612f89a9cb4f6c392fd6542e144ac8ef4ea2364d51e5ef940de2806aeddf8ee53766ef4c1f6160594a63b301179541522abb31f0079375bdc34a244c8657a3955cce5748c494949c9c8dab996b002be97024057c214aed5708ee2bae41aca29fd4c9de7edb50e77e7ee75697d7436c6b5f8e78bac6f5e2466f3e4d774222769bfa14de50aa382b9f6b4e3ce78a2545883f3c996939c2ec9613d9c16c9e99711d3dd52893810dcd414af6ae640c3caaed9793f87323afead2f11d8c0450ca472610d7e07af19f5ce720f576c53f46feed63829e22e4720befdbba8da6641aa40484778569c49f0349675a42dcd188c7f50c353224070c57085218cba64e224a78aaab45f92e3c026ede5b4cea047027d3d26aadf5016f775d5797a3017098525a5b7b9aeabda80e0660bfc4db904ee5ff114f7e4710245bf75e3d14bca8f208075eec4b969f799b046d9bd74d05ed711f4684d8939ad0433d4db1f822fae40c285f6c5b82ba4062f98117069f29d89cc498dc5e2f4478be90670e0b077ab7e366681790e62bc05d1ebcd0061c0d41f0f59c0164c074ea93b3f8405854e6bdc3cbd7f09b595e2df4efb46dba367c916cdb39b5aec2bccf7891d91d29ff9034e08d07f19a56fc37d291f850bfc26c8ed9cbf02a652455b62012cc7d1b909d7c78dbe3419caac146a309afbb2f5b36fb1f5614ee83edeb2dc2d2ad75b5c857d3fabe06e6e31676b1002f22eae52d2f4c8b3171f99f1c12c48def43159d96dc3073efe6f4cbdaed2ccab2917468fbc80efe1ba0a873892ac06f94583850ba0d020d534264c40f5082b0738629f081cadb15b53b08db908031d48029187b3c1cf644e2a340ff58ff79177f291e01e179642b3c9dd4ea56c4ad58cb23fa0f9178e9ed68b2fcda06641b2c4ab6d7c10adf03d0a43750a50376feb57599444f1d7a2ca3820b5af4643b883a9bd507f1c26387ba41e932d9d8d600b1ef6c14f5ffd4ca291329e867dec7316a7f66c2536b6065d96d942094754ef9b6fca46d0fcdd93bf2ee4ac4e2eb6efe0001f51fac1dd1db7e7257114ef0c68979ec50ed05f692caa783007fe848550a86014a8f1324c1cc312011fa14dc12456c4d5018e36be89fd1f9c3a5db425e35f470b1d641b3f5ec477c7b3955a1417af9328ec6773a9df9259c9e110329bf1d71c616516e6dc63f45b33a20ffc62e414201cba45fa0f286eaec7d752bb2935","signature":"0x93be2ca6f455ddab1b77a3f22ded1dfdf05c7b819159f46d7721f5109c2fb311123e74673f339349e31cdafd306a9db503cd698c3c3f9969343d0371f0c9941aa9e378a7277b8a4199a66315e86be0f4829e85c21c1a858aa0bae98dddef3b66","withdrawalCredentials":"0x0100000000000000000000000363c74c5c8feb4e716389b5d213c39508a7dde5"},{"depositDataRoot":"0x794bbbd87ea6d4f13b0ed703f4e6bc948c772b0a1c045b0c9d9034a17b27f88f","publicKey":"0xa23b9086eede27f60db3801a8a00ea3ddd1eeebb00e9e8a4d97b15e629d69c6ba1ceb2cb8426d4f4bb238b6ab1cccc10","operatorIds":[208,209,210,211],"shares":"0x93a870990c8d251b237018bc56dc0d17067b2a51d7eaeccf8f90588aaf5be3b60c928bdbfafe7ce32e6915097a57f00e01384e25ca527cf2164eaaa81851367c0d86a8c9aac7bc2dc75ba8622e79889a0a88d14e58698bb08f3909cd6d732c34ac1ea7e850f0efc25c8c1cafbafd8524f91eb2626bf6bf40c154764505180082972c29ecacae2a4688bfd18aba97322e88a3852735acdbb529bf5b47ff8c53fdb9aeeb34e6cc4af4f966a621ee806abddfa43a54925592ae7525393abc2b61c8a641c838d99e201b5a5b2b2833febad8d8c70cf19fd5eeee38f4869386a3f273456af00826fbbeb51c7012fd7a1c9e69825a25e32d4e3f19bcfc2badf3aeaa79137ed633aaf7deb2e8e1abb01d992f599e1004396a7f2bdf34c4750fc6e0602f561e7a522e4ef8021e143cd83c00bcb2ca119e6f94aa02189cc5cc231543cbc92e63d8785e4292976e079c4cc3bbdb1998ff0b9565bd9f934855da48c398a210a8e7cf5675048a5f1c7cde283f5199f690a3e3e375b08ab3cbacbe63e0240a2f856af531e78368d1331ef32344653c9185a4a7e2d1575c18083b6699f879f86f98bc2a066387e601d6507647e3ca8fd527b73fb605386f30ea9d156983646a21f7f0cafdd302e5ee976daed7bde089622f3057e70ae4450f62af51c1c1aa1919ccf296a221105518abc9a25c369c8372cd63a2570130e257e68efcdff3777589aa1cec35be2490176601f2443a42344663736dbe46e07b742d0c163155cde8f641c9893a4d28f1e7223d251d5a75a2254b40cc28660cc8e2c953b20c47590ea022c4abcdfe4f4a981d474e1bcca640e239144bd9c5fe641c71fcf8c2594f5944feff0b0b1aaf28f7f79be23850ca837f0ab084c046a39814549de4fbf4b4eb97a27dc4fffee14f56af8074002be6813145a42403504d77815836fed2a8c6920197cedecd8d9d6446c97f973c7bbe80d9e0f85d98f549158cfc49b8c11a0e4c2344141b9a78ed570ba35dea0efe6529b19c2f948dee0395aa1f114c3b87b4c8da318256d158a4aeb853157827d13a21fde87a284034a08e55e3ce1a714cb7ebee14f5fa86f020c36c8d1b3e34cf3daf6caffc8176f3e18a27c68345ce79105e008a910478c54015dd7e6e6c814f58b27bc7b29b73781f2f79b549b53ad4094044fe99b3c11efc979461643e71185729bd586443a5e630d8157de46450c957c2f2b21f4e331a76c51fcdb46181860f5715b5c569d60dc188a5998329ad2dbef2e828cfdd0a4e1fc7dff1a72474dc3654706cfc3798dc1ff881f09dd9741995d51b57f31912405c67e8e74f98196e03e687b23fe2fe4adecd208bb34a76cd7eed1acf3d0a9667df307447b317196586e412f558f24906b8adef468cef00c8eb6b39e3e432ddb82da4330e7ba37fc0885125e9c5c78302e7f973b52cdb69b74f62b4b42913eca89affb71918248ce9f74ba0f1f87c11c4c5b8bddb89203c6514b0a912df247408a6094dc21b4143e099eeefda7d922279175aa585b2057d1fa948166a57608044437c5ea64e4c3ae3baba9c513a345fffbfcebcc47ef1053f7e90c1d46d64fbe8655e35c54364e4ca6bdab358bcb8dd5da3e8379e1cff7ae9c4e1bdb9ef3bd28f120e1b8e3f28563d7fa79494be7de51086390da37c1b72517fc2de0d865b25d47fe7b36a0314a1579ea09fc1e755a5eb6e5fee5ceea79e96cf83abb1212db5e22ec3a0afb9fcbcb2e7e3663ce3367d6f8de4190d109f32d6c3e902af20c315ab3dddac50da73861c4a3af80f97ed823e51d38dfffca3653035960ae9719db98c8aa3e01cd4a5fa3aa477833ef1d0f438286f4d95a6b2445f277006","signature":"0x86492c4a9f599e89eba1e7c11127d71513939044527ab11d366021b3858cca8ba8c4a36866b985f30ac259a407b91d931776b8540d9503af86fe68d5e55601f9e2114f5b64ede36bcb9d0854a09d09eb91dac2868c34c655610ca2f20f1108db","withdrawalCredentials":"0x010000000000000000000000fc3a50f089f9fbe77528c7a183878de4392d869c"},{"depositDataRoot":"0xe2dfa4d889021338471c82e795459987fcbedeb7692a46f10ea4f751a5b17040","publicKey":"0x8687ff9d5c22e616d250bc7a1439c74129596d1b2bc4978623bf5a183b1fe7a95dd03ad56f33a6ff42ddb70d730580ad","operatorIds":[208,209,210,211],"shares":"0xaade4e0502a4d8d8a88afccc3edd2548e3bf79b2d28a23711f17956ef6407d221bd0545c0cb402b1248fb4d9ff790d70191c10bdbc12f360bd28521950e7219e9a1c4161040bbae6da3faa58849d179a4c5ac758a4618fb720268b309859709297e31cc615368919601fa5bd9a5410b34cc86a57accee2080bfb1f361a912ae3dfea81f430cba23ebfcd95bc028057d08a871de3b9b6346b7ac997321e3c02b1cb5ed1bf9d726c813f1c1370a8651912e559b9e8b228f18ab3b9bc7bbb42f5e983895e7b101bfd9f5c636bee76260c8d9add1cc29a51bb6f7fdd6d31ce298a06a29473ca558b3dcaeb37fc0d84617ac18f085e5ae62bee31a08aad086a63fc05d78531a799bfee88c90d65742e7373d7956bfa53272c8fc5e068ba337544d92f3e05a14c0d6d9407e783b3daba8890398a73a94b3b5045297e021e37239e7a24134226315b5fc6ed83536962eedc333caa993491d98d80a0dd0f2b78c27250d53650be4bc7e2ab36b425b4d1d122f69fb09efe0f95584b00b5eb717aea08a4b71999e239c3e5505091e09fb9ef175e550c1698d89161d411e04e3c2a17caac3f2719244d1f4d953b17e829d46d93f3f368b245911df6f13998e770a1062fb805e55ddea971a0229b8a884b9c2cc8b46216c9d558517190a89e1e78c1bbe8e9517099314b87ca9f0814e02cc5218ed13d14c231db1c8352538b92fa119706bedb16b01eb46a028efa5ad63342ce3d826f092fc54fe6d4ee73a688c834d402ace972041022bfe4bfaa814846721b49ae3bc3054d0b03f108691961d4cc125adf5e000dac0a1d9c4c95ff71a90a3428c43699ae6ee567db881c3b0bda0c07804b5f82be247e6435036c00f253d7e091a9c4ed8679bfbe69e6db1fcf75b00171d8f801b5571bdedf5fecbeec1a6c37b5ea233975f16f4daffdf2eece6d5fdef48f3918fc9a1b772cf704abc22cffb1026ee1dd71a8a6a12172d52f7aa37ffe664b6d88db2e1c25cb911d1c22623805f776b06fc0455d8e4ea6fd46602a54ee67dece5c9f2a4df85ca88eedc63c7a544607cdd59c3d7314a2aa54bf3beb7c2b9c206eed94338d92a15302fc0f4d6962fbea6015a92765dc42ef62250b4596e855bd6341afd686636dc2f5249b721dd946869e00b6d11716f175668d20702a01141d79edd890ceb167f1b5e4d0f19fe1b37bbdebfe6e597e97a8c5f914a0befc95940fa9b601133a41a87da81e6a5a93612d881151e92b8da739d89d3fc1aa654546fa0efa492a7c664b52a625a1f9ae6a7cb6386c95bcd3a2c0d285800566f786936c1ba0754b1b5dd8aca90907f52dfe1611b987d121a3dc73981ab0299eff7a8158157e9651c2212ecf584728192b78467ea332de954d0fae20ffdaa7ca51f12617cfcc6b1635ded32260ac873f076a5b56f01df19519696d97d495a72ec215382282716cde80ec73269a2d385bfa79f6811b9ad999a0585a2396f27ee4d7f110f79fac5caa85259273bd854333bac93fa18aef67bf08904c0b5c2ce78d7f609945d094dea87be22ae50d4e1eb1fd5ba50e8008892a7e7468d422f7d5112d19ee00867aa9deb42549e45a83bc211e417ea2d28bd136d5c546f2bc0f971ce8354c116797f1cd75dec5de559a7a37b26507cb1e07a3e219f1fbcd4b9ecbce2615f12be302886060d0ac3e8232398e42a9ccc703523a7ab5c135d5007a500e611d069f1cfa664cec0d2fc9254c995a569aedb51bd945a1eca8110a5fb748c45a0addae704e19ab6ac42ae91bd4828eca8cab2716ab31fc2ee39ec00399d11c7789975e1b7457c51b0abb14388051d15c9006b4b4489cd0cc34bc279f569d4b43d1eb0d","signature":"0x8c9b0820d2f5d4b3fa428f8b08523e317f5c9958fa3f1b134cad1cb2380bff8fd01b0a7cf36082070bcea9941beb104207de9a5588df1587bc13c005c865f0d8c9126eb14fbd745a97dfa545100577c2761584aae7964b85535407c5867cb5a5","withdrawalCredentials":"0x010000000000000000000000eb70dd2728aa1af365380cb496afdcabed077752"}]} \ No newline at end of file diff --git a/contracts/ethereum/.gitignore b/contracts/ethereum/.gitignore index c795b054e..aed436c35 100644 --- a/contracts/ethereum/.gitignore +++ b/contracts/ethereum/.gitignore @@ -1 +1,2 @@ -build \ No newline at end of file +build +debug \ No newline at end of file diff --git a/contracts/ethereum/.openzeppelin/goerli.json b/contracts/ethereum/.openzeppelin/goerli.json index 690f4aa09..5ced339d9 100644 --- a/contracts/ethereum/.openzeppelin/goerli.json +++ b/contracts/ethereum/.openzeppelin/goerli.json @@ -1275,7 +1275,7 @@ "label": "manager", "offset": 2, "slot": "0", - "type": "t_contract(ICasimirManager)16657", + "type": "t_contract(ICasimirManager)22635", "contract": "CasimirViews", "src": "src/v1/CasimirViews.sol:18" }, @@ -1297,7 +1297,7 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(ICasimirManager)16657": { + "t_contract(ICasimirManager)22635": { "label": "contract ICasimirManager", "numberOfBytes": "20" }, @@ -6114,7 +6114,7 @@ "label": "factory", "offset": 1, "slot": "153", - "type": "t_contract(ICasimirFactory)16179", + "type": "t_contract(ICasimirFactory)12223", "contract": "CasimirUpkeep", "src": "src/v1/CasimirUpkeep.sol:28" }, @@ -6122,7 +6122,7 @@ "label": "manager", "offset": 0, "slot": "154", - "type": "t_contract(ICasimirManager)16657", + "type": "t_contract(ICasimirManager)12729", "contract": "CasimirUpkeep", "src": "src/v1/CasimirUpkeep.sol:30" }, @@ -6138,7 +6138,7 @@ "label": "reportStatus", "offset": 0, "slot": "156", - "type": "t_enum(ReportStatus)16911", + "type": "t_enum(ReportStatus)12983", "contract": "CasimirUpkeep", "src": "src/v1/CasimirUpkeep.sol:34" }, @@ -6234,7 +6234,7 @@ "label": "reportRequests", "offset": 0, "slot": "167", - "type": "t_mapping(t_bytes32,t_enum(RequestType)16907)", + "type": "t_mapping(t_bytes32,t_enum(RequestType)12979)", "contract": "CasimirUpkeep", "src": "src/v1/CasimirUpkeep.sol:58" }, @@ -6344,15 +6344,15 @@ "label": "contract FunctionsOracleInterface", "numberOfBytes": "20" }, - "t_contract(ICasimirFactory)16179": { + "t_contract(ICasimirFactory)12223": { "label": "contract ICasimirFactory", "numberOfBytes": "20" }, - "t_contract(ICasimirManager)16657": { + "t_contract(ICasimirManager)12729": { "label": "contract ICasimirManager", "numberOfBytes": "20" }, - "t_enum(ReportStatus)16911": { + "t_enum(ReportStatus)12983": { "label": "enum ICasimirUpkeep.ReportStatus", "members": [ "FINALIZED", @@ -6361,7 +6361,7 @@ ], "numberOfBytes": "1" }, - "t_enum(RequestType)16907": { + "t_enum(RequestType)12979": { "label": "enum ICasimirUpkeep.RequestType", "members": [ "NONE", @@ -6374,7 +6374,7 @@ "label": "mapping(bytes32 => address)", "numberOfBytes": "32" }, - "t_mapping(t_bytes32,t_enum(RequestType)16907)": { + "t_mapping(t_bytes32,t_enum(RequestType)12979)": { "label": "mapping(bytes32 => enum ICasimirUpkeep.RequestType)", "numberOfBytes": "32" }, @@ -6864,6 +6864,1871 @@ }, "namespaces": {} } + }, + "3401f0602778fcba1960c0284886643d79822086071add7fe10cf46186dedae4": { + "address": "0x8b3be522F926C14B2332cFB7fCbA7279BCbEa415", + "txHash": "0x49b25693c8f004910340502c9bbe5fe6786df816b95280214ddf679f25d8d6a2", + "layout": { + "solcVersion": "0.8.18", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_status", + "offset": 0, + "slot": "101", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + }, + { + "label": "lockPeriod", + "offset": 0, + "slot": "151", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:42" + }, + { + "label": "userFee", + "offset": 0, + "slot": "152", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:44" + }, + { + "label": "eigenStake", + "offset": 4, + "slot": "152", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:46" + }, + { + "label": "liquidStake", + "offset": 5, + "slot": "152", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:48" + }, + { + "label": "reportPeriod", + "offset": 6, + "slot": "152", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:50" + }, + { + "label": "functionsId", + "offset": 10, + "slot": "152", + "type": "t_uint64", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:52" + }, + { + "label": "upkeepId", + "offset": 0, + "slot": "153", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:54" + }, + { + "label": "latestBeaconBalance", + "offset": 0, + "slot": "154", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:56" + }, + { + "label": "finalizableActivations", + "offset": 0, + "slot": "155", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:58" + }, + { + "label": "finalizableCompletedExits", + "offset": 0, + "slot": "156", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:60" + }, + { + "label": "requestedWithdrawalBalance", + "offset": 0, + "slot": "157", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:62" + }, + { + "label": "reservedFeeBalance", + "offset": 0, + "slot": "158", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:64" + }, + { + "label": "requestedExits", + "offset": 0, + "slot": "159", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:66" + }, + { + "label": "daoOracleAddress", + "offset": 0, + "slot": "160", + "type": "t_address", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:121" + }, + { + "label": "factory", + "offset": 0, + "slot": "161", + "type": "t_contract(ICasimirFactory)16328", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:123" + }, + { + "label": "registry", + "offset": 0, + "slot": "162", + "type": "t_contract(ICasimirRegistry)17052", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:125" + }, + { + "label": "upkeep", + "offset": 0, + "slot": "163", + "type": "t_contract(ICasimirUpkeep)17182", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:127" + }, + { + "label": "lastPoolId", + "offset": 20, + "slot": "163", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:129" + }, + { + "label": "latestBeaconBalanceAfterFees", + "offset": 0, + "slot": "164", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:131" + }, + { + "label": "latestActiveRewardBalance", + "offset": 0, + "slot": "165", + "type": "t_int256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:133" + }, + { + "label": "finalizableExitedBalance", + "offset": 0, + "slot": "166", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:135" + }, + { + "label": "finalizableRecoveredBalance", + "offset": 0, + "slot": "167", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:137" + }, + { + "label": "users", + "offset": 0, + "slot": "168", + "type": "t_mapping(t_address,t_struct(User)16203_storage)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:139" + }, + { + "label": "stakeRatioSum", + "offset": 0, + "slot": "169", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:141" + }, + { + "label": "requestedWithdrawals", + "offset": 0, + "slot": "170", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:143" + }, + { + "label": "requestedWithdrawalQueue", + "offset": 0, + "slot": "171", + "type": "t_array(t_struct(Withdrawal)16210_storage)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:145" + }, + { + "label": "poolAddresses", + "offset": 0, + "slot": "172", + "type": "t_mapping(t_uint32,t_address)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:147" + }, + { + "label": "tipBalance", + "offset": 0, + "slot": "173", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:149" + }, + { + "label": "recoveredBalances", + "offset": 0, + "slot": "174", + "type": "t_mapping(t_uint32,t_uint256)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:151" + }, + { + "label": "prepoolBalance", + "offset": 0, + "slot": "175", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:153" + }, + { + "label": "exitedBalance", + "offset": 0, + "slot": "176", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:155" + }, + { + "label": "readyPoolIds", + "offset": 0, + "slot": "177", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:157" + }, + { + "label": "pendingPoolIds", + "offset": 0, + "slot": "178", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:159" + }, + { + "label": "stakedPoolIds", + "offset": 0, + "slot": "179", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:161" + }, + { + "label": "forcedExits", + "offset": 0, + "slot": "180", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:163" + }, + { + "label": "paused", + "offset": 0, + "slot": "181", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:165" + }, + { + "label": "__gap", + "offset": 0, + "slot": "182", + "type": "t_array(t_uint256)49_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:167" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Withdrawal)16210_storage)dyn_storage": { + "label": "struct ICasimirCore.Withdrawal[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint32)dyn_storage": { + "label": "uint32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(ICasimirFactory)16328": { + "label": "contract ICasimirFactory", + "numberOfBytes": "20" + }, + "t_contract(ICasimirRegistry)17052": { + "label": "contract ICasimirRegistry", + "numberOfBytes": "20" + }, + "t_contract(ICasimirUpkeep)17182": { + "label": "contract ICasimirUpkeep", + "numberOfBytes": "20" + }, + "t_int256": { + "label": "int256", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(User)16203_storage)": { + "label": "mapping(address => struct ICasimirCore.User)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_address)": { + "label": "mapping(uint32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_uint256)": { + "label": "mapping(uint32 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(User)16203_storage": { + "label": "struct ICasimirCore.User", + "members": [ + { + "label": "stake0", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "stakeRatioSum0", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Withdrawal)16210_storage": { + "label": "struct ICasimirCore.Withdrawal", + "members": [ + { + "label": "userAddress", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "amount", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "period", + "type": "t_uint256", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "ec000484aeb2c69a39f3000189b983dba3da867ec409f775c36dd0e18b3a436e": { + "address": "0x24CFF5A23f99DC960FA0e8880b5a8aD4ED1D4Cc9", + "txHash": "0x86eb7e822a8cbbc0370dfc9fe2d98172c99a07dd0477559b5ae6a2ce9a66184e", + "layout": { + "solcVersion": "0.8.18", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_status", + "offset": 0, + "slot": "101", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + }, + { + "label": "lockPeriod", + "offset": 0, + "slot": "151", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:42" + }, + { + "label": "userFee", + "offset": 0, + "slot": "152", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:44" + }, + { + "label": "eigenStake", + "offset": 4, + "slot": "152", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:46" + }, + { + "label": "liquidStake", + "offset": 5, + "slot": "152", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:48" + }, + { + "label": "reportPeriod", + "offset": 6, + "slot": "152", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:50" + }, + { + "label": "functionsId", + "offset": 10, + "slot": "152", + "type": "t_uint64", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:52" + }, + { + "label": "upkeepId", + "offset": 0, + "slot": "153", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:54" + }, + { + "label": "latestBeaconBalance", + "offset": 0, + "slot": "154", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:56" + }, + { + "label": "finalizableActivations", + "offset": 0, + "slot": "155", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:58" + }, + { + "label": "finalizableCompletedExits", + "offset": 0, + "slot": "156", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:60" + }, + { + "label": "requestedWithdrawalBalance", + "offset": 0, + "slot": "157", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:62" + }, + { + "label": "reservedFeeBalance", + "offset": 0, + "slot": "158", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:64" + }, + { + "label": "requestedExits", + "offset": 0, + "slot": "159", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:66" + }, + { + "label": "daoOracleAddress", + "offset": 0, + "slot": "160", + "type": "t_address", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:121" + }, + { + "label": "factory", + "offset": 0, + "slot": "161", + "type": "t_contract(ICasimirFactory)15318", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:123" + }, + { + "label": "registry", + "offset": 0, + "slot": "162", + "type": "t_contract(ICasimirRegistry)16042", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:125" + }, + { + "label": "upkeep", + "offset": 0, + "slot": "163", + "type": "t_contract(ICasimirUpkeep)16172", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:127" + }, + { + "label": "lastPoolId", + "offset": 20, + "slot": "163", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:129" + }, + { + "label": "latestBeaconBalanceAfterFees", + "offset": 0, + "slot": "164", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:131" + }, + { + "label": "latestActiveRewardBalance", + "offset": 0, + "slot": "165", + "type": "t_int256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:133" + }, + { + "label": "finalizableExitedBalance", + "offset": 0, + "slot": "166", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:135" + }, + { + "label": "finalizableRecoveredBalance", + "offset": 0, + "slot": "167", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:137" + }, + { + "label": "users", + "offset": 0, + "slot": "168", + "type": "t_mapping(t_address,t_struct(User)15193_storage)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:139" + }, + { + "label": "stakeRatioSum", + "offset": 0, + "slot": "169", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:141" + }, + { + "label": "requestedWithdrawals", + "offset": 0, + "slot": "170", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:143" + }, + { + "label": "requestedWithdrawalQueue", + "offset": 0, + "slot": "171", + "type": "t_array(t_struct(Withdrawal)15200_storage)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:145" + }, + { + "label": "poolAddresses", + "offset": 0, + "slot": "172", + "type": "t_mapping(t_uint32,t_address)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:147" + }, + { + "label": "tipBalance", + "offset": 0, + "slot": "173", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:149" + }, + { + "label": "recoveredBalances", + "offset": 0, + "slot": "174", + "type": "t_mapping(t_uint32,t_uint256)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:151" + }, + { + "label": "prepoolBalance", + "offset": 0, + "slot": "175", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:153" + }, + { + "label": "exitedBalance", + "offset": 0, + "slot": "176", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:155" + }, + { + "label": "readyPoolIds", + "offset": 0, + "slot": "177", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:157" + }, + { + "label": "pendingPoolIds", + "offset": 0, + "slot": "178", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:159" + }, + { + "label": "stakedPoolIds", + "offset": 0, + "slot": "179", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:161" + }, + { + "label": "forcedExits", + "offset": 0, + "slot": "180", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:163" + }, + { + "label": "paused", + "offset": 0, + "slot": "181", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:165" + }, + { + "label": "__gap", + "offset": 0, + "slot": "182", + "type": "t_array(t_uint256)49_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:167" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Withdrawal)15200_storage)dyn_storage": { + "label": "struct ICasimirCore.Withdrawal[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint32)dyn_storage": { + "label": "uint32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(ICasimirFactory)15318": { + "label": "contract ICasimirFactory", + "numberOfBytes": "20" + }, + "t_contract(ICasimirRegistry)16042": { + "label": "contract ICasimirRegistry", + "numberOfBytes": "20" + }, + "t_contract(ICasimirUpkeep)16172": { + "label": "contract ICasimirUpkeep", + "numberOfBytes": "20" + }, + "t_int256": { + "label": "int256", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(User)15193_storage)": { + "label": "mapping(address => struct ICasimirCore.User)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_address)": { + "label": "mapping(uint32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_uint256)": { + "label": "mapping(uint32 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(User)15193_storage": { + "label": "struct ICasimirCore.User", + "members": [ + { + "label": "stake0", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "stakeRatioSum0", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Withdrawal)15200_storage": { + "label": "struct ICasimirCore.Withdrawal", + "members": [ + { + "label": "userAddress", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "amount", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "period", + "type": "t_uint256", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "ddd4fcd8824ef9c077575b6da5106acb40a786fb6e924ae55fae1d8e88121b7d": { + "address": "0x1E3Fc4dccD0cC9237EC850852aD9CEa0C623B3e2", + "txHash": "0x0ee2566bcf99a6527b15ebed3f38e5036f448b68ae4c740278bed9275637473c", + "layout": { + "solcVersion": "0.8.18", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_status", + "offset": 0, + "slot": "101", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + }, + { + "label": "lockPeriod", + "offset": 0, + "slot": "151", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:42" + }, + { + "label": "userFee", + "offset": 0, + "slot": "152", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:44" + }, + { + "label": "eigenStake", + "offset": 4, + "slot": "152", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:46" + }, + { + "label": "liquidStake", + "offset": 5, + "slot": "152", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:48" + }, + { + "label": "reportPeriod", + "offset": 6, + "slot": "152", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:50" + }, + { + "label": "functionsId", + "offset": 10, + "slot": "152", + "type": "t_uint64", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:52" + }, + { + "label": "upkeepId", + "offset": 0, + "slot": "153", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:54" + }, + { + "label": "latestBeaconBalance", + "offset": 0, + "slot": "154", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:56" + }, + { + "label": "finalizableActivations", + "offset": 0, + "slot": "155", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:58" + }, + { + "label": "finalizableCompletedExits", + "offset": 0, + "slot": "156", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:60" + }, + { + "label": "requestedWithdrawalBalance", + "offset": 0, + "slot": "157", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:62" + }, + { + "label": "reservedFeeBalance", + "offset": 0, + "slot": "158", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:64" + }, + { + "label": "requestedExits", + "offset": 0, + "slot": "159", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:66" + }, + { + "label": "daoOracleAddress", + "offset": 0, + "slot": "160", + "type": "t_address", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:121" + }, + { + "label": "factory", + "offset": 0, + "slot": "161", + "type": "t_contract(ICasimirFactory)16466", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:123" + }, + { + "label": "registry", + "offset": 0, + "slot": "162", + "type": "t_contract(ICasimirRegistry)17210", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:125" + }, + { + "label": "upkeep", + "offset": 0, + "slot": "163", + "type": "t_contract(ICasimirUpkeep)17340", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:127" + }, + { + "label": "lastPoolId", + "offset": 20, + "slot": "163", + "type": "t_uint32", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:129" + }, + { + "label": "latestBeaconBalanceAfterFees", + "offset": 0, + "slot": "164", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:131" + }, + { + "label": "latestActiveRewardBalance", + "offset": 0, + "slot": "165", + "type": "t_int256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:133" + }, + { + "label": "finalizableExitedBalance", + "offset": 0, + "slot": "166", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:135" + }, + { + "label": "finalizableRecoveredBalance", + "offset": 0, + "slot": "167", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:137" + }, + { + "label": "users", + "offset": 0, + "slot": "168", + "type": "t_mapping(t_address,t_struct(User)16341_storage)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:139" + }, + { + "label": "stakeRatioSum", + "offset": 0, + "slot": "169", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:141" + }, + { + "label": "requestedWithdrawals", + "offset": 0, + "slot": "170", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:143" + }, + { + "label": "requestedWithdrawalQueue", + "offset": 0, + "slot": "171", + "type": "t_array(t_struct(Withdrawal)16348_storage)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:145" + }, + { + "label": "poolAddresses", + "offset": 0, + "slot": "172", + "type": "t_mapping(t_uint32,t_address)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:147" + }, + { + "label": "tipBalance", + "offset": 0, + "slot": "173", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:149" + }, + { + "label": "recoveredBalances", + "offset": 0, + "slot": "174", + "type": "t_mapping(t_uint32,t_uint256)", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:151" + }, + { + "label": "prepoolBalance", + "offset": 0, + "slot": "175", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:153" + }, + { + "label": "exitedBalance", + "offset": 0, + "slot": "176", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:155" + }, + { + "label": "readyPoolIds", + "offset": 0, + "slot": "177", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:157" + }, + { + "label": "pendingPoolIds", + "offset": 0, + "slot": "178", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:159" + }, + { + "label": "stakedPoolIds", + "offset": 0, + "slot": "179", + "type": "t_array(t_uint32)dyn_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:161" + }, + { + "label": "forcedExits", + "offset": 0, + "slot": "180", + "type": "t_uint256", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:163" + }, + { + "label": "paused", + "offset": 0, + "slot": "181", + "type": "t_bool", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:165" + }, + { + "label": "__gap", + "offset": 0, + "slot": "182", + "type": "t_array(t_uint256)49_storage", + "contract": "CasimirManager", + "src": "src/v1/CasimirManager.sol:167" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Withdrawal)16348_storage)dyn_storage": { + "label": "struct ICasimirCore.Withdrawal[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint32)dyn_storage": { + "label": "uint32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(ICasimirFactory)16466": { + "label": "contract ICasimirFactory", + "numberOfBytes": "20" + }, + "t_contract(ICasimirRegistry)17210": { + "label": "contract ICasimirRegistry", + "numberOfBytes": "20" + }, + "t_contract(ICasimirUpkeep)17340": { + "label": "contract ICasimirUpkeep", + "numberOfBytes": "20" + }, + "t_int256": { + "label": "int256", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(User)16341_storage)": { + "label": "mapping(address => struct ICasimirCore.User)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_address)": { + "label": "mapping(uint32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint32,t_uint256)": { + "label": "mapping(uint32 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(User)16341_storage": { + "label": "struct ICasimirCore.User", + "members": [ + { + "label": "stake0", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "stakeRatioSum0", + "type": "t_uint256", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Withdrawal)16348_storage": { + "label": "struct ICasimirCore.Withdrawal", + "members": [ + { + "label": "userAddress", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "amount", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "period", + "type": "t_uint256", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "eb4880bb9ef9766f3f92e53554ae4e8340410d8f0f48b16c4be8e53caebc3d42": { + "address": "0xc19f2AAAea6ae570c68DC8E038a97F5aC8584cb5", + "txHash": "0xe7ea5bee82dad1e7f9f858d0613addf3aa5be6188113577673214d0d7cbe8a68", + "layout": { + "solcVersion": "0.8.18", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_status", + "offset": 0, + "slot": "101", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:88" + }, + { + "label": "s_oracle", + "offset": 0, + "slot": "151", + "type": "t_contract(FunctionsOracleInterface)548", + "contract": "FunctionsClient", + "src": "src/v1/vendor/FunctionsClient.sol:13" + }, + { + "label": "s_pendingRequests", + "offset": 0, + "slot": "152", + "type": "t_mapping(t_bytes32,t_address)", + "contract": "FunctionsClient", + "src": "src/v1/vendor/FunctionsClient.sol:14" + }, + { + "label": "compoundStake", + "offset": 0, + "slot": "153", + "type": "t_bool", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:24" + }, + { + "label": "factory", + "offset": 1, + "slot": "153", + "type": "t_contract(ICasimirFactory)16502", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:28" + }, + { + "label": "manager", + "offset": 0, + "slot": "154", + "type": "t_contract(ICasimirManager)17008", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:30" + }, + { + "label": "previousReportTimestamp", + "offset": 0, + "slot": "155", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:32" + }, + { + "label": "reportStatus", + "offset": 0, + "slot": "156", + "type": "t_enum(ReportStatus)17262", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:34" + }, + { + "label": "reportPeriod", + "offset": 1, + "slot": "156", + "type": "t_uint32", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:36" + }, + { + "label": "reportRemainingRequests", + "offset": 0, + "slot": "157", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:38" + }, + { + "label": "reportRequestBlock", + "offset": 0, + "slot": "158", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:40" + }, + { + "label": "reportTimestamp", + "offset": 0, + "slot": "159", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:42" + }, + { + "label": "reportSweptBalance", + "offset": 0, + "slot": "160", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:44" + }, + { + "label": "reportBeaconBalance", + "offset": 0, + "slot": "161", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:46" + }, + { + "label": "reportActivatedDeposits", + "offset": 0, + "slot": "162", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:48" + }, + { + "label": "reportForcedExits", + "offset": 0, + "slot": "163", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:50" + }, + { + "label": "reportCompletedExits", + "offset": 0, + "slot": "164", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:52" + }, + { + "label": "reportCompoundablePoolIds", + "offset": 0, + "slot": "165", + "type": "t_array(t_uint32)5_storage", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:54" + }, + { + "label": "finalizableCompoundablePoolIds", + "offset": 0, + "slot": "166", + "type": "t_array(t_uint32)5_storage", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:56" + }, + { + "label": "reportRequests", + "offset": 0, + "slot": "167", + "type": "t_mapping(t_bytes32,t_enum(RequestType)17258)", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:58" + }, + { + "label": "reportResponseError", + "offset": 0, + "slot": "168", + "type": "t_bytes_storage", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:60" + }, + { + "label": "requestSource", + "offset": 0, + "slot": "169", + "type": "t_string_storage", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:62" + }, + { + "label": "defaultRequestArgs", + "offset": 0, + "slot": "170", + "type": "t_array(t_string_storage)dyn_storage", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:64" + }, + { + "label": "fulfillGasLimit", + "offset": 0, + "slot": "171", + "type": "t_uint32", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:66" + }, + { + "label": "reportRequested", + "offset": 4, + "slot": "171", + "type": "t_bool", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:68" + }, + { + "label": "previousReportBlock", + "offset": 0, + "slot": "172", + "type": "t_uint256", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:70" + }, + { + "label": "transmitterAddress", + "offset": 0, + "slot": "173", + "type": "t_address", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:72" + }, + { + "label": "__gap", + "offset": 0, + "slot": "174", + "type": "t_array(t_uint256)48_storage", + "contract": "CasimirUpkeep", + "src": "src/v1/CasimirUpkeep.sol:74" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_string_storage)dyn_storage": { + "label": "string[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_array(t_uint32)5_storage": { + "label": "uint32[5]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(FunctionsOracleInterface)548": { + "label": "contract FunctionsOracleInterface", + "numberOfBytes": "20" + }, + "t_contract(ICasimirFactory)16502": { + "label": "contract ICasimirFactory", + "numberOfBytes": "20" + }, + "t_contract(ICasimirManager)17008": { + "label": "contract ICasimirManager", + "numberOfBytes": "20" + }, + "t_enum(ReportStatus)17262": { + "label": "enum ICasimirUpkeep.ReportStatus", + "members": [ + "FINALIZED", + "REQUESTING", + "PROCESSING" + ], + "numberOfBytes": "1" + }, + "t_enum(RequestType)17258": { + "label": "enum ICasimirUpkeep.RequestType", + "members": [ + "NONE", + "BALANCES", + "DETAILS" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_bytes32,t_address)": { + "label": "mapping(bytes32 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_enum(RequestType)17258)": { + "label": "mapping(bytes32 => enum ICasimirUpkeep.RequestType)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } + }, + "6868a6a004c4a8969dacefe322261ee2840474d89ff2ddbaf9c639ca47e9930e": { + "address": "0x3EC4AE0ce514C8CCbF4244B2584a500DDD9773b0", + "txHash": "0x3447d7b6e51d8514c263747a69e1e1f3a403eb6dbee36e2aa4e6ea72c3e603db", + "layout": { + "solcVersion": "0.8.18", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "manager", + "offset": 2, + "slot": "0", + "type": "t_contract(ICasimirManager)17008", + "contract": "CasimirViews", + "src": "src/v1/CasimirViews.sol:18" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "CasimirViews", + "src": "src/v1/CasimirViews.sol:20" + } + ], + "types": { + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(ICasimirManager)17008": { + "label": "contract ICasimirManager", + "numberOfBytes": "20" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 2473d1982..88c3b25c2 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -9,7 +9,7 @@ import 'hardhat-abi-exporter' import 'hardhat-contract-sizer' import 'solidity-docgen' // import '@tenderly/hardhat-tenderly' -import { ETHEREUM_CONTRACTS, ETHEREUM_RPC_URL, ETHEREUM_SIGNERS, HARDHAT_NETWORK_KEY } from '@casimir/env' +import { ETHEREUM_CONTRACTS, ETHEREUM_RPC_URL, HARDHAT_NETWORK_KEY } from '@casimir/env' // Seed is provided const mnemonic = process.env.BIP39_SEED as string @@ -30,6 +30,16 @@ const forkConfig = { url: forkUrl, blockNumber: parseInt(process.env.ETHEREUM_FO const hardhatKey = hardhatNetwork?.toUpperCase() as keyof typeof HARDHAT_NETWORK_KEY const networkKey = HARDHAT_NETWORK_KEY[hardhatKey] || 'TESTNET' +process.env.ETHEREUM_RPC_URL = process.env.ETHEREUM_RPC_URL || ETHEREUM_RPC_URL[networkKey] +process.env.FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].FACTORY_ADDRESS +process.env.BEACON_LIBRARY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].BEACON_LIBRARY_ADDRESS +process.env.MANAGER_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].MANAGER_BEACON_ADDRESS +process.env.POOL_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].POOL_BEACON_ADDRESS +process.env.REGISTRY_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].REGISTRY_BEACON_ADDRESS +process.env.UPKEEP_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].UPKEEP_BEACON_ADDRESS +process.env.VIEWS_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].VIEWS_BEACON_ADDRESS +process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].FUNCTIONS_BILLING_REGISTRY_ADDRESS +process.env.FUNCTIONS_ORACLE_ADDRESS = ETHEREUM_CONTRACTS[networkKey].FUNCTIONS_ORACLE_ADDRESS process.env.DEPOSIT_CONTRACT_ADDRESS = ETHEREUM_CONTRACTS[networkKey].DEPOSIT_CONTRACT_ADDRESS process.env.KEEPER_REGISTRAR_ADDRESS = ETHEREUM_CONTRACTS[networkKey].KEEPER_REGISTRAR_ADDRESS process.env.KEEPER_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].KEEPER_REGISTRY_ADDRESS @@ -42,21 +52,6 @@ process.env.SWAP_FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].SWAP_FACTORY_A process.env.SWAP_ROUTER_ADDRESS = ETHEREUM_CONTRACTS[networkKey].SWAP_ROUTER_ADDRESS process.env.WETH_TOKEN_ADDRESS = ETHEREUM_CONTRACTS[networkKey].WETH_TOKEN_ADDRESS -if (hardhatNetwork !== 'localhost') { - process.env.ETHEREUM_RPC_URL = process.env.ETHEREUM_RPC_URL || ETHEREUM_RPC_URL[networkKey] - process.env.OWNER_ADDRESS = ETHEREUM_SIGNERS[networkKey].OWNER_ADDRESS - process.env.DAO_ORACLE_ADDRESS = ETHEREUM_SIGNERS[networkKey].DAO_ORACLE_ADDRESS - process.env.BEACON_LIBRARY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].BEACON_LIBRARY_ADDRESS - process.env.MANAGER_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].MANAGER_BEACON_ADDRESS - process.env.POOL_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].POOL_BEACON_ADDRESS - process.env.REGISTRY_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].REGISTRY_BEACON_ADDRESS - process.env.UPKEEP_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].UPKEEP_BEACON_ADDRESS - process.env.VIEWS_BEACON_ADDRESS = ETHEREUM_CONTRACTS[networkKey].VIEWS_BEACON_ADDRESS - process.env.FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].FACTORY_ADDRESS - process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS[networkKey].FUNCTIONS_BILLING_REGISTRY_ADDRESS - process.env.FUNCTIONS_ORACLE_ADDRESS = ETHEREUM_CONTRACTS[networkKey].FUNCTIONS_ORACLE_ADDRESS -} - const compilerSettings = { viaIR: true, optimizer: { diff --git a/contracts/ethereum/helpers/network.ts b/contracts/ethereum/helpers/network.ts new file mode 100644 index 000000000..a618ff4bf --- /dev/null +++ b/contracts/ethereum/helpers/network.ts @@ -0,0 +1,14 @@ +import { ethers } from 'ethers' + +export async function waitForNetwork(provider: ethers.providers.JsonRpcProvider) { + let networkReady = false + while (!networkReady) { + try { + await provider.getBlockNumber() + networkReady = true + } catch (error) { + console.log('Waiting for network to start...') + await new Promise(resolve => setTimeout(resolve, 1000)) + } + } +} \ No newline at end of file diff --git a/contracts/ethereum/helpers/upkeep.ts b/contracts/ethereum/helpers/upkeep.ts index 3ac76ff69..61e2d89d7 100644 --- a/contracts/ethereum/helpers/upkeep.ts +++ b/contracts/ethereum/helpers/upkeep.ts @@ -9,11 +9,11 @@ export async function runUpkeep({ upkeep: CasimirUpkeep, }) { let ranUpkeep = false - const checkData = ethers.utils.toUtf8Bytes('') + const checkData = ethers.utils.toUtf8Bytes('0x') const { ...check } = await upkeep.connect(donTransmitter).checkUpkeep(checkData) const { upkeepNeeded } = check if (upkeepNeeded) { - const performData = ethers.utils.toUtf8Bytes('') + const performData = ethers.utils.toUtf8Bytes('0x') const performUpkeep = await upkeep.connect(donTransmitter).performUpkeep(performData) await performUpkeep.wait() ranUpkeep = true @@ -43,7 +43,7 @@ export async function fulfillReport({ }) { const { beaconBalance, sweptBalance, activatedDeposits, forcedExits, completedExits, compoundablePoolIds } = values - const requestIds = (await upkeep.queryFilter(upkeep.filters.RequestSent())).slice(-2).map((event) => event.args.id) + const requestIds = (await upkeep.queryFilter(upkeep.filters.ReportRequestSent(), -2)).map((event) => event.args.requestId) const balancesRequestId = requestIds[0] diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index b545e3fef..a517009e4 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -7,10 +7,10 @@ "deploy": "npx hardhat run scripts/deploy.ts", "dev": "npx hardhat run scripts/dev.ts", "docgen": "npx hardhat docgen", - "node": "npx hardhat node", + "predev": "npx hardhat node", "report": "npx hardhat run scripts/report.ts", "size": "npx hardhat size-contracts", - "test": "npx hardhat test", + "test": "npx esno -r dotenv/config -r scripts/test.ts", "upgrade:all": "npx hardhat run scripts/upgrade-all.ts", "upgrade:proxies": "npx hardhat run scripts/upgrade-proxies.ts", "verify": "npx hardhat verify" diff --git a/contracts/ethereum/scripts/deploy.ts b/contracts/ethereum/scripts/deploy.ts index 2b681dd47..8604fa545 100644 --- a/contracts/ethereum/scripts/deploy.ts +++ b/contracts/ethereum/scripts/deploy.ts @@ -136,7 +136,7 @@ void async function () { await factory.deployed() console.log(`CasimirFactory contract deployed at ${factory.address}`) - const baseStrategy = { + const simpleStrategy = { minCollateral: ethers.utils.parseEther('1.0'), lockPeriod: 0, userFee: 5, @@ -146,18 +146,18 @@ void async function () { privateOperators: false, verifiedOperators: false } - const deployBaseManager = await factory.deployManager( + const deploySimpleManager = await factory.deployManager( daoOracle.address, functionsOracle.address, - baseStrategy + simpleStrategy ) - await deployBaseManager.wait() + await deploySimpleManager.wait() const [managerId] = await factory.getManagerIds() const managerConfig = await factory.getManagerConfig(managerId) - console.log(`Base CasimirManager contract deployed to ${managerConfig.managerAddress}`) - console.log(`Base CasimirRegistry contract deployed to ${managerConfig.registryAddress}`) - console.log(`Base CasimirUpkeep contract deployed to ${managerConfig.upkeepAddress}`) - console.log(`Base CasimirViews contract deployed to ${managerConfig.viewsAddress}`) + console.log(`Simple CasimirManager contract deployed to ${managerConfig.managerAddress}`) + console.log(`Simple CasimirRegistry contract deployed to ${managerConfig.registryAddress}`) + console.log(`Simple CasimirUpkeep contract deployed to ${managerConfig.upkeepAddress}`) + console.log(`Simple CasimirViews contract deployed to ${managerConfig.viewsAddress}`) const upkeep = await ethers.getContractAt('CasimirUpkeep', managerConfig.upkeepAddress) as CasimirUpkeep requestConfig.args[1] = managerConfig.viewsAddress diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 7e3f32b9b..7a0a95c21 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -1,20 +1,31 @@ -import { CasimirManager, CasimirRegistry, ISSVViews, CasimirViews, CasimirUpkeep, FunctionsOracleFactory, FunctionsBillingRegistry, CasimirFactory } from '../build/@types' -import { ethers, network, upgrades } from 'hardhat' -import { fulfillReport, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { round } from '@casimir/ethereum/helpers/math' +import { CasimirFactoryDev, CasimirManagerDev, CasimirRegistryDev, CasimirUpkeepDev, CasimirViewsDev, FunctionsOracle, FunctionsBillingRegistry } from '../build/@types' +import { ethers, upgrades } from 'hardhat' import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' -import ISSVViewsAbi from '../build/abi/ISSVViews.json' -import { run } from '@casimir/shell' import { PoolStatus } from '@casimir/types' import requestConfig from '@casimir/functions/Functions-request-config' +import { run } from '@casimir/shell' +import { round } from '../helpers/math' +import { waitForNetwork } from '../helpers/network' import { activatePoolsHandler } from '../helpers/oracle' - -upgrades.silenceWarnings() +import { fulfillReport, runUpkeep } from '../helpers/upkeep' /** - * Deploy contracts to local network and run local events and oracle handling + * Fork contracts to local network and run local events and oracle handling + * You can override the following configuration environment variables: + * - SIMULATE_UPGRADES: true | false + * - SIMULATE_EIGEN: true | false + * - SIMULATE_REWARDS: true | false */ -void async function () { +async function dev() { + if (!process.env.FACTORY_ADDRESS) throw new Error('No factory address provided') + if (!process.env.MANAGER_BEACON_ADDRESS) throw new Error('No manager beacon address provided') + if (!process.env.POOL_BEACON_ADDRESS) throw new Error('No pool beacon address provided') + if (!process.env.REGISTRY_BEACON_ADDRESS) throw new Error('No registry beacon address provided') + if (!process.env.UPKEEP_BEACON_ADDRESS) throw new Error('No upkeep beacon address provided') + if (!process.env.VIEWS_BEACON_ADDRESS) throw new Error('No views beacon address provided') + if (!process.env.BEACON_LIBRARY_ADDRESS) throw new Error('No beacon library address provided') + if (!process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS) throw new Error('No functions billing registry address provided') + if (!process.env.FUNCTIONS_ORACLE_ADDRESS) throw new Error('No functions oracle address provided') if (!process.env.DEPOSIT_CONTRACT_ADDRESS) throw new Error('No deposit contract address provided') if (!process.env.KEEPER_REGISTRAR_ADDRESS) throw new Error('No keeper registrar address provided') if (!process.env.KEEPER_REGISTRY_ADDRESS) throw new Error('No keeper registry address provided') @@ -26,228 +37,143 @@ void async function () { if (!process.env.SWAP_ROUTER_ADDRESS) throw new Error('No swap router address provided') if (!process.env.WETH_TOKEN_ADDRESS) throw new Error('No weth token address provided') - const [, daoOracle, donTransmitter, firstUser] = await ethers.getSigners() - - const functionsOracleFactoryFactory = await ethers.getContractFactory('FunctionsOracleFactory') - const functionsOracleFactory = await functionsOracleFactoryFactory.deploy() as FunctionsOracleFactory - await functionsOracleFactory.deployed() - console.log(`FunctionsOracleFactory contract deployed to ${functionsOracleFactory.address}`) - - const deployNewOracle = await functionsOracleFactory.deployNewOracle() - const deployNewOracleReceipt = await deployNewOracle.wait() - if (!deployNewOracleReceipt.events) throw new Error('Functions oracle deployment failed') - const functionsOracleAddress = deployNewOracleReceipt.events[1].args?.don as string - const functionsOracle = await ethers.getContractAt('FunctionsOracle', functionsOracleAddress) - const acceptOwnership = await functionsOracle.acceptOwnership() - await acceptOwnership.wait() - console.log(`FunctionsOracle contract deployed to ${functionsOracle.address}`) - - const functionsBillingRegistryArgs = { - linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, - linkEthFeedAddress: process.env.LINK_ETH_FEED_ADDRESS, - functionsOracleAddress: functionsOracle.address - } - const functionsBillingRegistryFactory = await ethers.getContractFactory('FunctionsBillingRegistry') - const functionsBillingRegistry = await functionsBillingRegistryFactory.deploy(...Object.values(functionsBillingRegistryArgs)) as FunctionsBillingRegistry - await functionsBillingRegistry.deployed() - console.log(`FunctionsBillingRegistry contract deployed to ${functionsBillingRegistry.address}`) - - const functionsBillingRegistryConfig = { - maxGasLimit: 400_000, - stalenessSeconds: 86_400, - gasAfterPaymentCalculation: - 21_000 + 5_000 + 2_100 + 20_000 + 2 * 2_100 - 15_000 + 7_315, - weiPerUnitLink: ethers.BigNumber.from('5000000000000000'), - gasOverhead: 100_000, - requestTimeoutSeconds: 300, - } - - await functionsBillingRegistry.setConfig( - functionsBillingRegistryConfig.maxGasLimit, - functionsBillingRegistryConfig.stalenessSeconds, - functionsBillingRegistryConfig.gasAfterPaymentCalculation, - functionsBillingRegistryConfig.weiPerUnitLink, - functionsBillingRegistryConfig.gasOverhead, - functionsBillingRegistryConfig.requestTimeoutSeconds - ) + await waitForNetwork(ethers.provider) - const beaconLibraryFactory = await ethers.getContractFactory('CasimirBeacon') - const beaconLibrary = await beaconLibraryFactory.deploy() - console.log(`CasimirBeacon library deployed to ${beaconLibrary.address}`) + const [owner, daoOracle, donTransmitter] = await ethers.getSigners() - const managerBeaconFactory = await ethers.getContractFactory('CasimirManager', { - libraries: { - CasimirBeacon: beaconLibrary.address - } - }) - const managerBeacon = await upgrades.deployBeacon(managerBeaconFactory, { - constructorArgs: [ - functionsBillingRegistry.address, - process.env.KEEPER_REGISTRAR_ADDRESS as string, - process.env.KEEPER_REGISTRY_ADDRESS as string, - process.env.LINK_TOKEN_ADDRESS as string, - process.env.SSV_NETWORK_ADDRESS as string, - process.env.SSV_TOKEN_ADDRESS as string, - process.env.SWAP_FACTORY_ADDRESS as string, - process.env.SWAP_ROUTER_ADDRESS as string, - process.env.WETH_TOKEN_ADDRESS as string - ], - unsafeAllow: ['external-library-linking'] - }) - await managerBeacon.deployed() - console.log(`CasimirManager beacon deployed at ${managerBeacon.address}`) + const functionsOracle = await ethers.getContractAt('FunctionsOracle', process.env.FUNCTIONS_ORACLE_ADDRESS) as FunctionsOracle + const functionsBillingRegistry = await ethers.getContractAt('FunctionsBillingRegistry', process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS) as FunctionsBillingRegistry - const poolBeaconFactory = await ethers.getContractFactory('CasimirPool') - const poolBeacon = await upgrades.deployBeacon(poolBeaconFactory, { - constructorArgs: [ - process.env.DEPOSIT_CONTRACT_ADDRESS as string - ] - }) - await poolBeacon.deployed() - console.log(`CasimirPool beacon deployed at ${poolBeacon.address}`) + /** + * Deploy in-development contract upgrades + * Helpful also for adding hardhat/console to debug existing methods + */ + if (process.env.SIMULATE_UPGRADES === 'true') { + upgrades.silenceWarnings() - const registryBeaconFactory = await ethers.getContractFactory('CasimirRegistry') - const registryBeacon = await upgrades.deployBeacon(registryBeaconFactory, { - constructorArgs: [ - process.env.SSV_VIEWS_ADDRESS as string - ] - }) - await registryBeacon.deployed() - console.log(`CasimirRegistry beacon deployed at ${registryBeacon.address}`) + const factoryProxyFactory = await ethers.getContractFactory('CasimirFactoryDev', { + libraries: { + CasimirBeacon: process.env.BEACON_LIBRARY_ADDRESS + } + }) + const factoryProxy = await upgrades.upgradeProxy(process.env.FACTORY_ADDRESS, factoryProxyFactory, { + constructorArgs: [ + process.env.MANAGER_BEACON_ADDRESS, + process.env.POOL_BEACON_ADDRESS, + process.env.REGISTRY_BEACON_ADDRESS, + process.env.UPKEEP_BEACON_ADDRESS, + process.env.VIEWS_BEACON_ADDRESS + ], + unsafeAllow: ['external-library-linking'] + }) + await factoryProxy.deployed() - const upkeepBeaconFactory = await ethers.getContractFactory('CasimirUpkeep') - const upkeepBeacon = await upgrades.deployBeacon(upkeepBeaconFactory) - await upkeepBeacon.deployed() - console.log(`CasimirUpkeep beacon deployed at ${upkeepBeacon.address}`) + const managerBeaconFactory = await ethers.getContractFactory('CasimirManagerDev', { + libraries: { + CasimirBeacon: process.env.BEACON_LIBRARY_ADDRESS + } + }) + const managerBeacon = await upgrades.upgradeBeacon(process.env.MANAGER_BEACON_ADDRESS, managerBeaconFactory, { + constructorArgs: [ + process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS, + process.env.KEEPER_REGISTRAR_ADDRESS, + process.env.KEEPER_REGISTRY_ADDRESS, + process.env.LINK_TOKEN_ADDRESS, + process.env.SSV_NETWORK_ADDRESS, + process.env.SSV_TOKEN_ADDRESS, + process.env.SWAP_FACTORY_ADDRESS, + process.env.SWAP_ROUTER_ADDRESS, + process.env.WETH_TOKEN_ADDRESS + ], + unsafeAllow: ['external-library-linking'] + }) + await managerBeacon.deployed() - const viewsBeaconFactory = await ethers.getContractFactory('CasimirViews') - const viewsBeacon = await upgrades.deployBeacon(viewsBeaconFactory) - await viewsBeacon.deployed() - console.log(`CasimirViews beacon deployed at ${viewsBeacon.address}`) + const registryBeaconFactory = await ethers.getContractFactory('CasimirRegistryDev') + const registryBeacon = await upgrades.upgradeBeacon(process.env.REGISTRY_BEACON_ADDRESS, registryBeaconFactory, { + constructorArgs: [ + process.env.SSV_VIEWS_ADDRESS + ] + }) + await registryBeacon.deployed() - const factoryFactory = await ethers.getContractFactory('CasimirFactory', { - libraries: { - CasimirBeacon: beaconLibrary.address - } - }) - const factory = await upgrades.deployProxy(factoryFactory, undefined, { - constructorArgs: [ - managerBeacon.address, - poolBeacon.address, - registryBeacon.address, - upkeepBeacon.address, - viewsBeacon.address - ], - unsafeAllow: ['external-library-linking'] - }) as CasimirFactory - await factory.deployed() - console.log(`CasimirFactory contract deployed at ${factory.address}`) + const upkeepBeaconFactory = await ethers.getContractFactory('CasimirUpkeepDev') + const upkeepBeacon = await upgrades.upgradeBeacon(process.env.UPKEEP_BEACON_ADDRESS, upkeepBeaconFactory) + await upkeepBeacon.deployed() - const defaultStrategy = { - minCollateral: ethers.utils.parseEther('1.0'), - lockPeriod: 0, - userFee: 5, - compoundStake: true, - eigenStake: false, - liquidStake: false, - privateOperators: false, - verifiedOperators: false + const viewsBeaconFactory = await ethers.getContractFactory('CasimirViewsDev') + const viewsBeacon = await upgrades.upgradeBeacon(process.env.VIEWS_BEACON_ADDRESS, viewsBeaconFactory) + await viewsBeacon.deployed() } - const deployBaseManager = await factory.deployManager( - daoOracle.address, - functionsOracle.address, - defaultStrategy - ) - await deployBaseManager.wait() - const [baseManagerId] = await factory.getManagerIds() - const baseManagerConfig = await factory.getManagerConfig(baseManagerId) - const manager = await ethers.getContractAt('CasimirManager', baseManagerConfig.managerAddress) as CasimirManager - const registry = await ethers.getContractAt('CasimirRegistry', baseManagerConfig.registryAddress) as CasimirRegistry - const upkeep = await ethers.getContractAt('CasimirUpkeep', baseManagerConfig.upkeepAddress) as CasimirUpkeep - const views = await ethers.getContractAt('CasimirViews', baseManagerConfig.viewsAddress) as CasimirViews - console.log(`Base manager contract deployed to ${manager.address}`) - console.log(`Base registry contract deployed to ${registry.address}`) - console.log(`Base upkeep contract deployed to ${upkeep.address}`) - console.log(`Base views contract deployed to ${views.address}`) + const factory = await ethers.getContractAt('CasimirFactoryDev', process.env.FACTORY_ADDRESS) as CasimirFactoryDev + console.log(`Casimir factory ${factory.address}`) - requestConfig.args[1] = views.address - await (await upkeep.setFunctionsRequest( - requestConfig.source, requestConfig.args, 300000 - )).wait() + const [managerId] = await factory.getManagerIds() + const managerConfig = await factory.getManagerConfig(managerId) - await functionsBillingRegistry.setAuthorizedSenders([donTransmitter.address, functionsOracle.address]) - await functionsOracle.setRegistry(functionsBillingRegistry.address) - await functionsOracle.addAuthorizedSenders([donTransmitter.address, manager.address]) + const manager = await ethers.getContractAt('CasimirManagerDev', managerConfig.managerAddress) as CasimirManagerDev + console.log(`Casimir simple manager ${manager.address}`) - const ssvViews = await ethers.getContractAt(ISSVViewsAbi, process.env.SSV_VIEWS_ADDRESS as string) as ISSVViews - const preregisteredOperatorIds = process.env.PREREGISTERED_OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [208, 209, 210, 211/*, 212, 213, 214, 215*/] - if (preregisteredOperatorIds.length < 4) throw new Error('Not enough operator ids provided') - const preregisteredBalance = ethers.utils.parseEther('10') - for (const operatorId of preregisteredOperatorIds) { - const [operatorOwnerAddress] = await ssvViews.getOperatorById(operatorId) - const currentBalance = await ethers.provider.getBalance(operatorOwnerAddress) - const nextBalance = currentBalance.add(preregisteredBalance) - await setBalance(operatorOwnerAddress, nextBalance) - await network.provider.request({ - method: 'hardhat_impersonateAccount', - params: [operatorOwnerAddress] - }) - const operatorSigner = ethers.provider.getSigner(operatorOwnerAddress) - const result = await registry.connect(operatorSigner).registerOperator(operatorId, { value: preregisteredBalance }) - await result.wait() - } + const registry = await ethers.getContractAt('CasimirRegistryDev', managerConfig.registryAddress) as CasimirRegistryDev + console.log(`Casimir simple registry ${registry.address}`) + const upkeep = await ethers.getContractAt('CasimirUpkeepDev', managerConfig.upkeepAddress) as CasimirUpkeepDev + console.log(`Casimir simple upkeep ${upkeep.address}`) + + const views = await ethers.getContractAt('CasimirViewsDev', managerConfig.viewsAddress) as CasimirViewsDev + console.log(`Casimir simple views ${views.address}`) + /** - * Deploy a second manager with Eigen stake enabled - * Note, this manager is not functional - * It is only deployed to test a list of multiple managers + * Deploy a second operator groups with Casimir Eigen stake enabled + * Note, this operator group is not functional it only deployed for testing purposes */ - const eigenStrategy = { - minCollateral: ethers.utils.parseEther('1.0'), - lockPeriod: 0, - userFee: 5, - compoundStake: true, - eigenStake: true, - liquidStake: false, - privateOperators: false, - verifiedOperators: false + if (process.env.SIMULATE_EIGEN === 'true') { + const deployEigenManager = await factory.connect(owner).deployManager( + daoOracle.address, + functionsOracle.address, + { + minCollateral: ethers.utils.parseEther('1.0'), + lockPeriod: ethers.BigNumber.from('0'), + userFee: ethers.BigNumber.from('5'), + compoundStake: true, + eigenStake: true, + liquidStake: false, + privateOperators: false, + verifiedOperators: false + } + ) + await deployEigenManager.wait() + const [, eigenManagerId] = await factory.getManagerIds() + const eigenManagerConfig = await factory.getManagerConfig(eigenManagerId) + + const eigenManager = await ethers.getContractAt('CasimirManagerDev', eigenManagerConfig.managerAddress) as CasimirManagerDev + console.log(`Casimir Eigen manager ${eigenManager.address}`) + const eigenRegistry = await ethers.getContractAt('CasimirRegistryDev', eigenManagerConfig.registryAddress) as CasimirRegistryDev + console.log(`Casimir Eigen registry ${eigenRegistry.address}`) + const eigenUpkeep = await ethers.getContractAt('CasimirUpkeepDev', eigenManagerConfig.upkeepAddress) as CasimirUpkeepDev + console.log(`Casimir Eigen upkeep ${eigenUpkeep.address}`) + const eigenViews = await ethers.getContractAt('CasimirViewsDev', eigenManagerConfig.viewsAddress) as CasimirViewsDev + console.log(`Casimir Eigen views ${eigenViews.address}`) + + requestConfig.args[1] = eigenViews.address + await (await eigenUpkeep.connect(owner).setFunctionsRequest( + requestConfig.source, requestConfig.args, 300000 + )).wait() + + const functionsOracleSenders = await functionsOracle.getAuthorizedSenders() + const newFunctionsOracleSenders = [...functionsOracleSenders, eigenManager.address, eigenUpkeep.address] + await functionsOracle.connect(owner).setAuthorizedSenders(newFunctionsOracleSenders) } - const deployEigenManager = await factory.deployManager( - daoOracle.address, - functionsOracle.address, - eigenStrategy - ) - await deployEigenManager.wait() - const [, eigenManagerId] = await factory.getManagerIds() - const eigenManagerConfig = await factory.getManagerConfig(eigenManagerId) - const eigenManager = await ethers.getContractAt('CasimirManager', eigenManagerConfig.managerAddress) as CasimirManager - const eigenRegistry = await ethers.getContractAt('CasimirRegistry', eigenManagerConfig.registryAddress) as CasimirRegistry - const eigenUpkeep = await ethers.getContractAt('CasimirUpkeep', eigenManagerConfig.upkeepAddress) as CasimirUpkeep - const eigenViews = await ethers.getContractAt('CasimirViews', eigenManagerConfig.viewsAddress) as CasimirViews - console.log(`Eigen manager contract deployed to ${eigenManager.address}`) - console.log(`Eigen registry contract deployed to ${eigenRegistry.address}`) - console.log(`Eigen upkeep contract deployed to ${eigenUpkeep.address}`) - console.log(`Eigen views contract deployed to ${eigenViews.address}`) - - requestConfig.args[1] = eigenViews.address - await (await eigenUpkeep.setFunctionsRequest( - requestConfig.source, requestConfig.args, 300000 - )).wait() - - await functionsBillingRegistry.setAuthorizedSenders([donTransmitter.address, functionsOracle.address]) - await functionsOracle.setRegistry(functionsBillingRegistry.address) - await functionsOracle.addAuthorizedSenders([donTransmitter.address, eigenManager.address]) /** - * We are simulating the oracle reporting on a more frequent basis - * We also do not sweep or compound the rewards in this script + * Simulate oracle reporting on a higher than average rate * Exit balances are swept as needed */ - const blocksPerReport = 10 - const rewardPerValidator = 0.105 - let lastReportBlock = await ethers.provider.getBlockNumber() - let lastStakedPoolIds: number[] = [] - void function () { + if (process.env.SIMULATE_REWARDS === 'true') { + const blocksPerReport = 10 + const rewardPerValidator = 0.105 + let lastReportBlock = await ethers.provider.getBlockNumber() + let lastStakedPoolIds: number[] = [] ethers.provider.on('block', async (block) => { if (block - blocksPerReport >= lastReportBlock) { await time.increase(time.duration.days(1)) @@ -318,16 +244,12 @@ void async function () { lastStakedPoolIds = stakedPoolIds } }) - }() - - setTimeout(async () => { - const depositAmount = 32 * ((100 + await manager.userFee()) / 100) - const depositStake = await manager.connect(firstUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) - await depositStake.wait() - }, 2500) + } - process.env.FACTORY_ADDRESS = factory.address - process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = functionsBillingRegistry.address - process.env.FUNCTIONS_ORACLE_ADDRESS = functionsOracle.address run('npm run dev --workspace @casimir/oracle') -}() +} + +dev().catch(error => { + console.error(error) + process.exit(1) +}) diff --git a/contracts/ethereum/scripts/rebalance-bug-1.ts b/contracts/ethereum/scripts/rebalance-bug-1.ts new file mode 100644 index 000000000..b52668c69 --- /dev/null +++ b/contracts/ethereum/scripts/rebalance-bug-1.ts @@ -0,0 +1,51 @@ +import { ethers } from 'hardhat' +import { CasimirFactory, CasimirManager } from '../build/@types' +import ICasimirFactoryAbi from '../build/abi/ICasimirFactory.json' +import ICasimirManagerAbi from '../build/abi/ICasimirManager.json' +import { ETHEREUM_CONTRACTS, ETHEREUM_RPC_URL } from '@casimir/env' + +// V1 testnet rebalance bug 1 +// Undo stake ratio sum change 1 -409.082737011318350061 from block 9968492 +// Redo stake ratio sum change 1 0.035209244538409142 from block 9968492 +// Undo stake ratio sum change 2 617.841429400917953927 from block 9968796 +// Redo stake ratio sum change 2 -0.000323535550800035 from block 9968796 +// Set latest beacon balance after fees 2 63.998872616 at block 9974789 + +void async function() { + + const doNotRun = true + if (doNotRun) { + throw new Error('Do not run this script. It is archived for internal documentation only.') + } + + process.env.ETHEREUM_RPC_URL = ETHEREUM_RPC_URL['TESTNET'] + process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS['TESTNET'].FUNCTIONS_BILLING_REGISTRY_ADDRESS + process.env.FUNCTIONS_ORACLE_ADDRESS = ETHEREUM_CONTRACTS['TESTNET'].FUNCTIONS_ORACLE_ADDRESS + const [owner] = await ethers.getSigners() + const provider = new ethers.providers.JsonRpcProvider(ETHEREUM_RPC_URL['TESTNET']) + const factory = new ethers.Contract(ETHEREUM_CONTRACTS['TESTNET'].FACTORY_ADDRESS, ICasimirFactoryAbi, provider) as CasimirFactory + const [managerId] = await factory.getManagerIds() + const managerConfig = await factory.getManagerConfig(managerId) + const manager = new ethers.Contract(managerConfig.managerAddress, ICasimirManagerAbi, provider) as CasimirManager + + const wrongStakeRatioSumChange1 = ethers.utils.parseEther('-409.082737011318350061') + const undoStakeRatioSumChange1 = await manager.connect(owner).unbalanceStake(wrongStakeRatioSumChange1) + await undoStakeRatioSumChange1.wait() + + const correctStakeRatioSumChange1 = ethers.utils.parseEther('0.035209244538409142') + const redoStakeRatioSumChange1 = await manager.connect(owner).unbalanceStake(correctStakeRatioSumChange1) + await redoStakeRatioSumChange1.wait() + + const wrongStakeRatioSumChange2 = ethers.utils.parseEther('617.841429400917953927') + const undoStakeRatioSumChange2 = await manager.connect(owner).unbalanceStake(wrongStakeRatioSumChange2) + await undoStakeRatioSumChange2.wait() + + const correctStakeRatioSumChange2 = ethers.utils.parseEther('-0.000323535550800035') + const redoStakeRatioSumChange2 = await manager.connect(owner).unbalanceStake(correctStakeRatioSumChange2) + await redoStakeRatioSumChange2.wait() + + const latestBeaconBalanceAfterFees = ethers.utils.parseEther('63.998872616') + const setLatestBeaconBalanceAfterFees = await manager.connect(owner).setLatestBeaconBalanceAfterFees(latestBeaconBalanceAfterFees) + await setLatestBeaconBalanceAfterFees.wait() + +}() \ No newline at end of file diff --git a/contracts/ethereum/scripts/report.ts b/contracts/ethereum/scripts/report.ts index 176f1c7db..b09d1cfd9 100644 --- a/contracts/ethereum/scripts/report.ts +++ b/contracts/ethereum/scripts/report.ts @@ -1,27 +1,45 @@ import { ethers } from 'hardhat' -import { CasimirFactory, CasimirManager, CasimirRegistry, CasimirUpkeep, CasimirViews } from '../build/@types' -import ICasimirFactoryAbi from '../build/abi/ICasimirFactory.json' -import ICasimirManagerAbi from '../build/abi/ICasimirManager.json' -import ICasimirRegistryAbi from '../build/abi/ICasimirRegistry.json' -import ICasimirUpkeepAbi from '../build/abi/ICasimirUpkeep.json' -import ICasimirViewsAbi from '../build/abi/ICasimirViews.json' -import { ETHEREUM_CONTRACTS, ETHEREUM_RPC_URL } from '@casimir/env' +import { CasimirFactory, CasimirManager, CasimirPool, CasimirRegistry, CasimirUpkeep, CasimirViews } from '../build/@types' +import { waitForNetwork } from '../helpers/network' +import { runUpkeep } from '../helpers/upkeep' +import e from 'cors' void async function() { - process.env.ETHEREUM_RPC_URL = ETHEREUM_RPC_URL['TESTNET'] - process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS['TESTNET'].FUNCTIONS_BILLING_REGISTRY_ADDRESS - process.env.FUNCTIONS_ORACLE_ADDRESS = ETHEREUM_CONTRACTS['TESTNET'].FUNCTIONS_ORACLE_ADDRESS - const [owner] = await ethers.getSigners() - const provider = new ethers.providers.JsonRpcProvider(ETHEREUM_RPC_URL['TESTNET']) - const factory = new ethers.Contract(ETHEREUM_CONTRACTS['TESTNET'].FACTORY_ADDRESS, ICasimirFactoryAbi, provider) as CasimirFactory + if (!process.env.FACTORY_ADDRESS) throw new Error('No factory address provided') + + await waitForNetwork(ethers.provider) + + const [owner, , donTransmitter] = await ethers.getSigners() + const factory = await ethers.getContractAt('CasimirFactory', process.env.FACTORY_ADDRESS) as CasimirFactory const [managerId] = await factory.getManagerIds() const managerConfig = await factory.getManagerConfig(managerId) - // const manager = new ethers.Contract(managerConfig.managerAddress, ICasimirManagerAbi, provider) as CasimirManager - // const registry = new ethers.Contract(managerConfig.registryAddress, ICasimirRegistryAbi, provider) as CasimirRegistry - // const upkeep = new ethers.Contract(managerConfig.upkeepAddress, ICasimirUpkeepAbi, provider) as CasimirUpkeep - // const views = new ethers.Contract(managerConfig.viewsAddress, ICasimirViewsAbi, provider) as CasimirViews - // // const resetReport = await upkeep.connect(owner).resetReport(0, 0, 0, 0, 0) - // // await resetReport.wait() - // const requestReport = await upkeep.connect(owner).requestReport() - // await requestReport.wait() + const manager = await ethers.getContractAt('CasimirManager', managerConfig.managerAddress) as CasimirManager + const registry = await ethers.getContractAt('CasimirRegistry', managerConfig.registryAddress) as CasimirRegistry + const upkeep = await ethers.getContractAt('CasimirUpkeep', managerConfig.upkeepAddress) as CasimirUpkeep + const views = await ethers.getContractAt('CasimirViews', managerConfig.viewsAddress) as CasimirViews + + // const pause = await manager.connect(owner).setPaused(false) + // await pause.wait() + const requestReport = await upkeep.connect(owner).requestReport() + await requestReport.wait() + + if (process.env.SIMULATE_UPKEEP === 'true') { + await runUpkeep({ donTransmitter, upkeep }) + let finalizedReport = false + while (!finalizedReport) { + finalizedReport = await runUpkeep({ donTransmitter, upkeep }) + await new Promise(resolve => setTimeout(resolve, 2500)) + } + const poolIds = await manager.getStakedPoolIds() + const sweptBalance = await views.getSweptBalance(0, poolIds.length) + console.log('Swept balance', ethers.utils.formatEther(sweptBalance)) + let totalBalance = ethers.BigNumber.from(0) + for (const poolId of poolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolBalance = await ethers.provider.getBalance(poolAddress) + totalBalance = totalBalance.add(poolBalance) + console.log('Pool', poolId, ethers.utils.formatEther(poolBalance)) + } + console.log('Total balance', ethers.utils.formatEther(totalBalance)) + } }() \ No newline at end of file diff --git a/contracts/ethereum/scripts/test.ts b/contracts/ethereum/scripts/test.ts new file mode 100644 index 000000000..25355e492 --- /dev/null +++ b/contracts/ethereum/scripts/test.ts @@ -0,0 +1,49 @@ +import { ethers } from 'ethers' +import { loadCredentials, getSecret } from '@casimir/aws' +import { ETHEREUM_CONTRACTS, ETHEREUM_NETWORK_NAME, ETHEREUM_RPC_URL } from '@casimir/env' +import { run } from '@casimir/shell' + +/** + * Test ethereum contracts and services + */ +async function test() { + if (process.env.USE_SECRETS !== 'false') { + await loadCredentials() + process.env.BIP39_SEED = process.env.BIP39_SEED || await getSecret('consensus-networks-bip39-seed') as string + } else { + process.env.BIP39_SEED = process.env.BIP39_SEED || 'inflict ball claim confirm cereal cost note dad mix donate traffic patient' + } + console.log(`Your mnemonic is ${process.env.BIP39_SEED}`) + + process.env.FORK = process.env.FORK || 'testnet' + + const networkKey = process.env.FORK.toUpperCase() as keyof typeof ETHEREUM_RPC_URL + process.env.ETHEREUM_FORK_RPC_URL = ETHEREUM_RPC_URL[networkKey] + + const networkName = ETHEREUM_NETWORK_NAME[networkKey] + console.log(`Using ${networkName} fork from ${process.env.ETHEREUM_FORK_RPC_URL}`) + + const provider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_FORK_RPC_URL) + const wallet = ethers.Wallet.fromMnemonic(process.env.BIP39_SEED) + + // Account for the mock, beacon, and library deployments + const walletNonce = await provider.getTransactionCount(wallet.address) + 14 + + process.env.FACTORY_ADDRESS = ethers.utils.getContractAddress({ + from: wallet.address, + nonce: walletNonce + }) + console.log(`Expecting factory at ${process.env.FACTORY_ADDRESS}`) + + process.env.SSV_NETWORK_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.SSV_NETWORK_ADDRESS + process.env.SSV_VIEWS_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.SSV_VIEWS_ADDRESS + process.env.SWAP_FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.SWAP_FACTORY_ADDRESS + + await run('npm run generate --workspace @casimir/oracle') + run('npm hardhat test') +} + +test().catch(error => { + console.error(error) + process.exit(1) +}) \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 5dd144b20..f607b685d 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -137,7 +137,7 @@ contract CasimirManager is uint256 private finalizableRecoveredBalance; /// @dev All users mapping(address => User) private users; - /// @dev Sum of scaled rewards to balance ratios + /// @dev Sum of rewards to stake ratios uint256 private stakeRatioSum; /// @dev Total pending withdrawals count uint256 private requestedWithdrawals; @@ -161,8 +161,10 @@ contract CasimirManager is uint32[] private stakedPoolIds; /// @dev Slashed pool count uint256 private forcedExits; + /// @dev Whether the contract is paused + bool private paused; /// @dev Storage gap - uint256[50] private __gap; + uint256[49] private __gap; /** * @dev Constructor @@ -256,6 +258,7 @@ contract CasimirManager is /// @inheritdoc ICasimirManager function depositStake() external payable nonReentrant { + onlyUnpaused(); User storage user = users[msg.sender]; uint256 depositAfterFees = subtractFees(msg.value); reservedFeeBalance += msg.value - depositAfterFees; @@ -391,6 +394,10 @@ contract CasimirManager is int256 rewards = int256(beaconBalance + sweptBalance + finalizableRecoveredBalance) - int256(expectedEffectiveBalance + expectedExitedBalance); int256 change = rewards - latestActiveRewardBalance; + uint256 absoluteChange = change > 0 ? uint256(change) : uint256(-change); + if (absoluteChange > (stakedPoolIds.length * POOL_CAPACITY) / 2) { + revert InvalidRebalance(); + } if (latestBeaconBalanceAfterFees > 0) { if (change > 0) { uint256 gain = uint256(change); @@ -425,6 +432,22 @@ contract CasimirManager is finalizableCompletedExits = 0; } + /// @inheritdoc ICasimirManager + function unbalanceStake(int256 rebalance) external { + onlyFactoryOwner(); + if (rebalance > 0) { + stakeRatioSum += uint256(rebalance); + } else if (rebalance < 0) { + stakeRatioSum -= uint256(-rebalance); + } + } + + /// @inheritdoc ICasimirManager + function setLatestBeaconBalanceAfterFees(uint256 newLatestBeaconBalanceAfterFees) external { + onlyFactoryOwner(); + latestBeaconBalanceAfterFees = newLatestBeaconBalanceAfterFees; + } + /// @inheritdoc ICasimirManager function compoundRewards(uint32[5] memory poolIds) external { onlyUpkeep(); @@ -440,6 +463,7 @@ contract CasimirManager is /// @inheritdoc ICasimirManager function requestWithdrawal(uint256 amount) external nonReentrant { + onlyUnpaused(); User storage user = users[msg.sender]; user.stake0 = getUserStake(msg.sender); if (user.stake0 < amount) { @@ -658,6 +682,12 @@ contract CasimirManager is functionsId = 0; } + /// @inheritdoc ICasimirManager + function setPaused(bool paused_) external { + onlyFactoryOwner(); + paused = paused_; + } + /// @inheritdoc ICasimirManager function withdrawClusterBalance( uint64[] memory operatorIds, @@ -755,6 +785,11 @@ contract CasimirManager is withdrawableBalance = prepoolBalance + exitedBalance; } + /// @inheritdoc ICasimirManager + function getStakeRatioSum() external view returns (uint256) { + return stakeRatioSum; + } + /// @notice Deposit the current tip balance function depositTips() private { uint256 tipsAfterFees = subtractFees(tipBalance); @@ -885,6 +920,13 @@ contract CasimirManager is } } + /// @dev Validate the contract is unpaused + function onlyUnpaused() private view { + if (paused) { + revert Paused(); + } + } + /// @dev Validate the caller is the upkeep function onlyUpkeep() private view { if (msg.sender != address(upkeep)) { diff --git a/contracts/ethereum/src/v1/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol index ddf57a120..ed7c14838 100644 --- a/contracts/ethereum/src/v1/CasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/CasimirUpkeep.sol @@ -52,7 +52,7 @@ contract CasimirUpkeep is uint256 private reportCompletedExits; /// @dev Current report compoundable pools uint32[5] private reportCompoundablePoolIds; - /// @dev Finalizable compoundable pools (not used, will be removed in future version) + /// @dev Finalizable compoundable pools (will be removed in the next release) uint32[5] private finalizableCompoundablePoolIds; /// @dev Current report request mapping(bytes32 => RequestType) private reportRequests; @@ -68,7 +68,7 @@ contract CasimirUpkeep is bool private reportRequested; /// @dev Previous report block uint256 private previousReportBlock; - /// @dev DON transmitter address (not used, will be removed in future version) + /// @dev DON transmitter address (will be removed in the next release) address private transmitterAddress; /// @dev Storage gap uint256[48] private __gap; @@ -121,13 +121,6 @@ contract CasimirUpkeep is requestArgs[9] = StringsUpgradeable.toString(reportRequestBlock); sendFunctionsRequest(request, requestArgs, RequestType.BALANCES); sendFunctionsRequest(request, requestArgs, RequestType.DETAILS); - emit ReportRequestsSent( - reportPeriod, - reportRequestBlock, - reportTimestamp, - previousReportBlock, - previousReportTimestamp - ); } else { if ( manager.requestedWithdrawalBalance() > 0 && @@ -162,7 +155,7 @@ contract CasimirUpkeep is function requestReport() external { onlyFactoryOwner(); reportRequested = true; - emit ReportRequested(); + emit NewReportRequested(); } /// @inheritdoc ICasimirUpkeep @@ -297,6 +290,7 @@ contract CasimirUpkeep is bytes32 requestId = sendRequest(request, manager.functionsId(), fulfillGasLimit); reportRequests[requestId] = requestType; reportRemainingRequests++; + emit ReportRequestSent(requestId, requestArgs); } /// @dev Validate the caller is the factory owner diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index 9c5f19d20..a060e52d1 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -141,7 +141,7 @@ contract CasimirViews is ICasimirViews, Initializable { function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint128 sweptBalance) { uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); - for (uint256 i = startIndex; i <= endIndex; i++) { + for (uint256 i = startIndex; i < endIndex; i++) { uint32 poolId; if (i < pendingPoolIds.length) { poolId = pendingPoolIds[i]; diff --git a/contracts/ethereum/src/v1/dev/CasimirFactoryDev.sol b/contracts/ethereum/src/v1/dev/CasimirFactoryDev.sol new file mode 100644 index 000000000..703b01da2 --- /dev/null +++ b/contracts/ethereum/src/v1/dev/CasimirFactoryDev.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "../CasimirCore.sol"; +import "./interfaces/ICasimirFactoryDev.sol"; +import "../interfaces/ICasimirManager.sol"; +import "../interfaces/ICasimirRegistry.sol"; +import "../interfaces/ICasimirUpkeep.sol"; +import "../libraries/CasimirBeacon.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; + +/// @title Factory that deploys and configures managers +contract CasimirFactoryDev is ICasimirFactoryDev, CasimirCore, Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable { + /** + * @inheritdoc ICasimirFactoryDev + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ + address public immutable managerBeaconAddress; + /** + * @inheritdoc ICasimirFactoryDev + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ + address public immutable poolBeaconAddress; + /** + * @inheritdoc ICasimirFactoryDev + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ + address public immutable registryBeaconAddress; + /** + * @inheritdoc ICasimirFactoryDev + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ + address public immutable upkeepBeaconAddress; + /** + * @inheritdoc ICasimirFactoryDev + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ + address public immutable viewsBeaconAddress; + /// @dev Deployed manager addresses + mapping(uint32 => address) private managerAddresses; + /// @dev Deployed views addresses + mapping(uint32 => address) private viewsAddresses; + /// @dev Last manager ID + uint32 private lastManagerId; + /// @dev Storage gap + uint256[50] private __gap; + + /** + * @dev Constructor + * @param managerBeaconAddress_ Manager beacon address + * @param poolBeaconAddress_ Pool beacon address + * @param registryBeaconAddress_ Registry beacon address + * @param upkeepBeaconAddress_ Upkeep beacon address + * @param viewsBeaconAddress_ Views beacon address + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor( + address managerBeaconAddress_, + address poolBeaconAddress_, + address registryBeaconAddress_, + address upkeepBeaconAddress_, + address viewsBeaconAddress_ + ) { + onlyAddress(managerBeaconAddress_); + onlyAddress(poolBeaconAddress_); + onlyAddress(registryBeaconAddress_); + onlyAddress(upkeepBeaconAddress_); + onlyAddress(viewsBeaconAddress_); + managerBeaconAddress = managerBeaconAddress_; + poolBeaconAddress = poolBeaconAddress_; + registryBeaconAddress = registryBeaconAddress_; + upkeepBeaconAddress = upkeepBeaconAddress_; + viewsBeaconAddress = viewsBeaconAddress_; + _disableInitializers(); + } + + /** + * @notice Initialize the contract + */ + function initialize() public initializer { + __Ownable_init(); + __ReentrancyGuard_init(); + } + + /// @inheritdoc ICasimirFactoryDev + function deployManager( + address daoOracleAddress, + address functionsOracleAddress, + Strategy memory strategy + ) external onlyOwner { + onlyAddress(daoOracleAddress); + onlyAddress(functionsOracleAddress); + managerAddresses[++lastManagerId] = CasimirBeacon.createManager( + managerBeaconAddress, + daoOracleAddress, + functionsOracleAddress, + strategy + ); + ICasimirManager manager = ICasimirManager(managerAddresses[lastManagerId]); + viewsAddresses[lastManagerId] = CasimirBeacon.createViews(viewsBeaconAddress, address(manager)); + emit ManagerDeployed(lastManagerId); + } + + /// @inheritdoc ICasimirFactoryDev + function getManagerConfig(uint32 managerId) external view returns (ManagerConfig memory) { + ICasimirManager manager = ICasimirManager(managerAddresses[managerId]); + ICasimirRegistry registry = ICasimirRegistry(manager.getRegistryAddress()); + ICasimirUpkeep upkeep = ICasimirUpkeep(manager.getUpkeepAddress()); + return + ManagerConfig({ + managerAddress: managerAddresses[managerId], + registryAddress: address(registry), + upkeepAddress: address(upkeep), + viewsAddress: viewsAddresses[managerId], + strategy: Strategy({ + minCollateral: registry.minCollateral(), + lockPeriod: manager.lockPeriod(), + userFee: manager.userFee(), + compoundStake: upkeep.compoundStake(), + eigenStake: manager.eigenStake(), + liquidStake: manager.liquidStake(), + privateOperators: registry.privateOperators(), + verifiedOperators: registry.verifiedOperators() + }) + }); + } + + /// @inheritdoc ICasimirFactoryDev + function getManagerIds() external view returns (uint32[] memory) { + uint32[] memory managerIds = new uint32[](lastManagerId); + for (uint32 i; i < lastManagerId; i++) { + managerIds[i] = i + 1; + } + return managerIds; + } + + /// @inheritdoc ICasimirFactoryDev + function getOwner() external view returns (address) { + return owner(); + } +} diff --git a/contracts/ethereum/src/v1/dev/CasimirManagerDev.sol b/contracts/ethereum/src/v1/dev/CasimirManagerDev.sol index 57ef1f1ed..1780a706c 100644 --- a/contracts/ethereum/src/v1/dev/CasimirManagerDev.sol +++ b/contracts/ethereum/src/v1/dev/CasimirManagerDev.sol @@ -161,8 +161,10 @@ contract CasimirManagerDev is uint32[] private stakedPoolIds; /// @dev Slashed pool count uint256 private forcedExits; + /// @dev Whether the contract is paused + bool private paused; /// @dev Storage gap - uint256[50] private __gap; + uint256[49] private __gap; /** * @dev Constructor @@ -254,8 +256,15 @@ contract CasimirManagerDev is } } + /// @inheritdoc ICasimirManagerDev + function setPaused(bool paused_) external { + onlyFactoryOwner(); + paused = paused_; + } + /// @inheritdoc ICasimirManagerDev function depositStake() external payable nonReentrant { + onlyUnpaused(); User storage user = users[msg.sender]; uint256 depositAfterFees = subtractFees(msg.value); reservedFeeBalance += msg.value - depositAfterFees; @@ -391,6 +400,10 @@ contract CasimirManagerDev is int256 rewards = int256(beaconBalance + sweptBalance + finalizableRecoveredBalance) - int256(expectedEffectiveBalance + expectedExitedBalance); int256 change = rewards - latestActiveRewardBalance; + uint256 absoluteChange = change > 0 ? uint256(change) : uint256(-change); + if (absoluteChange > (stakedPoolIds.length * POOL_CAPACITY) / 2) { + revert InvalidRebalance(); + } if (latestBeaconBalanceAfterFees > 0) { if (change > 0) { uint256 gain = uint256(change); @@ -425,6 +438,22 @@ contract CasimirManagerDev is finalizableCompletedExits = 0; } + /// @inheritdoc ICasimirManagerDev + function unbalanceStake(int256 rebalance) external { + onlyFactoryOwner(); + if (rebalance > 0) { + stakeRatioSum += uint256(rebalance); + } else if (rebalance < 0) { + stakeRatioSum -= uint256(-rebalance); + } + } + + /// @inheritdoc ICasimirManagerDev + function setLatestBeaconBalanceAfterFees(uint256 latestBeaconBalanceAfterFees_) external { + onlyFactoryOwner(); + latestBeaconBalanceAfterFees = latestBeaconBalanceAfterFees_; + } + /// @inheritdoc ICasimirManagerDev function compoundRewards(uint32[5] memory poolIds) external { onlyUpkeep(); @@ -440,6 +469,7 @@ contract CasimirManagerDev is /// @inheritdoc ICasimirManagerDev function requestWithdrawal(uint256 amount) external nonReentrant { + onlyUnpaused(); User storage user = users[msg.sender]; user.stake0 = getUserStake(msg.sender); if (user.stake0 < amount) { @@ -750,6 +780,16 @@ contract CasimirManagerDev is requestedWithdrawalBalance; } + /// @inheritdoc ICasimirManagerDev + function getLatestActiveRewardBalance() external view returns (int256) { + return latestActiveRewardBalance; + } + + /// @inheritdoc ICasimirManagerDev + function getStakeRatioSum() external view returns (uint256) { + return stakeRatioSum; + } + /// @inheritdoc ICasimirManagerDev function getWithdrawableBalance() public view returns (uint256 withdrawableBalance) { withdrawableBalance = prepoolBalance + exitedBalance; @@ -885,6 +925,13 @@ contract CasimirManagerDev is } } + /// @dev Validate the contract is unpaused + function onlyUnpaused() private view { + if (paused) { + revert Paused(); + } + } + /// @dev Validate the caller is the upkeep function onlyUpkeep() private view { if (msg.sender != address(upkeep)) { diff --git a/contracts/ethereum/src/v1/dev/CasimirRegistryDev.sol b/contracts/ethereum/src/v1/dev/CasimirRegistryDev.sol new file mode 100644 index 000000000..03b7f07f6 --- /dev/null +++ b/contracts/ethereum/src/v1/dev/CasimirRegistryDev.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "../CasimirCore.sol"; +import "./interfaces/ICasimirRegistryDev.sol"; +import "../interfaces/ICasimirManager.sol"; +import "../vendor/interfaces/ISSVViews.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; + +/** + * @title Registry for pool operators + */ +contract CasimirRegistryDev is + ICasimirRegistryDev, + CasimirCore, + Initializable, + OwnableUpgradeable, + ReentrancyGuardUpgradeable +{ + /// @inheritdoc ICasimirRegistryDev + uint256 public minCollateral; + /// @inheritdoc ICasimirRegistryDev + bool public privateOperators; + /// @inheritdoc ICasimirRegistryDev + bool public verifiedOperators; + /** + * @dev SSV views contract + * @custom:oz-upgrades-unsafe-allow state-variable-immutable + */ + ISSVViews private immutable ssvViews; + /// @dev Manager contract + ICasimirManager private manager; + /// @dev Previously registered operator IDs + uint64[] private operatorIds; + /// @dev Operators by ID + mapping(uint64 => Operator) private operators; + /// @dev Operator pools by operator ID and pool ID + mapping(uint64 => mapping(uint32 => bool)) private operatorPools; + /// @dev Storage gap + uint256[50] private __gap; + + /** + * @dev Constructor + * @param ssvViews_ SSV views contract + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor(ISSVViews ssvViews_) { + onlyAddress(address(ssvViews_)); + ssvViews = ssvViews_; + _disableInitializers(); + } + + /** + * @notice Initialize the contract + * @param minCollateral_ Minimum collateral per operator per pool + * @param privateOperators_ Whether private operators are enabled + * @param verifiedOperators_ Whether verified operators are enabled + */ + function initialize(uint256 minCollateral_, bool privateOperators_, bool verifiedOperators_) public initializer { + __Ownable_init(); + __ReentrancyGuard_init(); + manager = ICasimirManager(msg.sender); + minCollateral = minCollateral_; + privateOperators = privateOperators_; + verifiedOperators = verifiedOperators_; + } + + /// @inheritdoc ICasimirRegistryDev + function registerOperator(uint64 operatorId) external payable { + onlyOperatorOwner(operatorId); + Operator storage operator = operators[operatorId]; + if (operator.id != 0) { + revert OperatorAlreadyRegistered(); + } + operatorIds.push(operatorId); + operator.id = operatorId; + operator.active = true; + operator.collateral = msg.value; + emit OperatorRegistered(operatorId); + } + + /// @inheritdoc ICasimirRegistryDev + function depositCollateral(uint64 operatorId) external payable { + onlyOperatorOwner(operatorId); + Operator storage operator = operators[operatorId]; + operator.collateral += msg.value; + operator.active = true; + emit CollateralDeposited(operatorId, msg.value); + } + + /// @inheritdoc ICasimirRegistryDev + function requestWithdrawal(uint64 operatorId, uint256 amount) external { + onlyOperatorOwner(operatorId); + Operator storage operator = operators[operatorId]; + if (operator.active || operator.resharing) { + revert CollateralInUse(); + } + if (operator.collateral < amount) { + revert InvalidAmount(); + } + operator.collateral -= amount; + (bool success, ) = msg.sender.call{value: amount}(""); + if (!success) { + revert TransferFailed(); + } + emit WithdrawalFulfilled(operatorId, amount); + } + + /// @inheritdoc ICasimirRegistryDev + function requestDeactivation(uint64 operatorId) external { + onlyOperatorOwner(operatorId); + Operator storage operator = operators[operatorId]; + if (!operator.active) { + revert OperatorNotActive(); + } + if (operator.resharing) { + revert OperatorResharing(); + } + if (operator.poolCount == 0) { + operator.active = false; + emit DeactivationCompleted(operatorId); + } else { + operator.resharing = true; + emit DeactivationRequested(operatorId); + } + } + + /// @inheritdoc ICasimirRegistryDev + function addOperatorPool(uint64 operatorId, uint32 poolId) external onlyOwner { + Operator storage operator = operators[operatorId]; + if (!operator.active) { + revert OperatorNotActive(); + } + if (operator.resharing) { + revert OperatorResharing(); + } + if (operatorPools[operatorId][poolId]) { + revert PoolAlreadyExists(); + } + uint256 eligiblePools = (operator.collateral / minCollateral) - operator.poolCount; + if (eligiblePools == 0) { + revert InsufficientCollateral(); + } + operatorPools[operatorId][poolId] = true; + operator.poolCount += 1; + emit OperatorPoolAdded(operatorId, poolId); + } + + /// @inheritdoc ICasimirRegistryDev + function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external { + onlyOwnerOrPool(poolId); + Operator storage operator = operators[operatorId]; + if (!operatorPools[operatorId][poolId]) { + revert PoolDoesNotExist(); + } + if (blameAmount > minCollateral) { + revert InvalidAmount(); + } + operatorPools[operatorId][poolId] = false; + operator.poolCount -= 1; + if (operator.poolCount == 0 && operator.resharing) { + operator.active = false; + operator.resharing = false; + emit DeactivationCompleted(operatorId); + } + if (blameAmount > 0) { + operator.collateral -= blameAmount; + manager.depositRecoveredBalance{value: blameAmount}(poolId); + } + emit OperatorPoolRemoved(operatorId, poolId, blameAmount); + } + + /// @inheritdoc ICasimirRegistryDev + function getOperator(uint64 operatorId) external view returns (Operator memory operator) { + operator = operators[operatorId]; + } + + /// @inheritdoc ICasimirRegistryDev + function getOperatorIds() external view returns (uint64[] memory) { + return operatorIds; + } + + /// @dev Validate the caller is the owner of the operator + function onlyOperatorOwner(uint64 operatorId) private view { + (address operatorOwner, , , , , ) = ssvViews.getOperatorById(operatorId); + if (msg.sender != operatorOwner) { + revert Unauthorized(); + } + } + + /// @dev Validate the caller is the owner or the authorized pool + function onlyOwnerOrPool(uint32 poolId) private view { + if (msg.sender != owner() && msg.sender != manager.getPoolAddress(poolId)) { + revert Unauthorized(); + } + } +} diff --git a/contracts/ethereum/src/v1/dev/CasimirUpkeepDev.sol b/contracts/ethereum/src/v1/dev/CasimirUpkeepDev.sol index 8f253b409..f4ae9a7be 100644 --- a/contracts/ethereum/src/v1/dev/CasimirUpkeepDev.sol +++ b/contracts/ethereum/src/v1/dev/CasimirUpkeepDev.sol @@ -52,7 +52,7 @@ contract CasimirUpkeepDev is uint256 private reportCompletedExits; /// @dev Current report compoundable pools uint32[5] private reportCompoundablePoolIds; - /// @dev Finalizable compoundable pools (not used, will be removed in future version) + /// @dev Finalizable compoundable pools (will be removed in the next release) uint32[5] private finalizableCompoundablePoolIds; /// @dev Current report request mapping(bytes32 => RequestType) private reportRequests; @@ -68,7 +68,7 @@ contract CasimirUpkeepDev is bool private reportRequested; /// @dev Previous report block uint256 private previousReportBlock; - /// @dev DON transmitter address (not used, will be removed in future version) + /// @dev DON transmitter address (will be removed in the next release) address private transmitterAddress; /// @dev Storage gap uint256[48] private __gap; @@ -121,13 +121,6 @@ contract CasimirUpkeepDev is requestArgs[9] = StringsUpgradeable.toString(reportRequestBlock); sendFunctionsRequest(request, requestArgs, RequestType.BALANCES); sendFunctionsRequest(request, requestArgs, RequestType.DETAILS); - emit ReportRequestsSent( - reportPeriod, - reportRequestBlock, - reportTimestamp, - previousReportBlock, - previousReportTimestamp - ); } else { if ( manager.requestedWithdrawalBalance() > 0 && @@ -162,7 +155,7 @@ contract CasimirUpkeepDev is function requestReport() external { onlyFactoryOwner(); reportRequested = true; - emit ReportRequested(); + emit NewReportRequested(); } /// @inheritdoc ICasimirUpkeepDev @@ -307,6 +300,7 @@ contract CasimirUpkeepDev is bytes32 requestId = sendRequest(request, manager.functionsId(), fulfillGasLimit); reportRequests[requestId] = requestType; reportRemainingRequests++; + emit ReportRequestSent(requestId, requestArgs); } /// @dev Validate the caller is the factory owner diff --git a/contracts/ethereum/src/v1/dev/CasimirViewsDev.sol b/contracts/ethereum/src/v1/dev/CasimirViewsDev.sol new file mode 100644 index 000000000..f58d7e1d4 --- /dev/null +++ b/contracts/ethereum/src/v1/dev/CasimirViewsDev.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "../interfaces/ICasimirManager.sol"; +import "../interfaces/ICasimirPool.sol"; +import "../interfaces/ICasimirRegistry.sol"; +import "../interfaces/ICasimirUpkeep.sol"; +import "./interfaces/ICasimirViewsDev.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +/** + * @title Views contract that provides read-only access to the state + */ +contract CasimirViewsDev is ICasimirViewsDev, Initializable { + /// @dev Compound minimum (0.1 ETH) + uint256 private constant COMPOUND_MINIMUM = 100000000 gwei; + /// @dev Manager contract + ICasimirManager private manager; + /// @dev Storage gap + uint256[50] private __gap; + + /** + * @dev Constructor + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize the contract + * @param managerAddress Manager address + */ + function initialize(address managerAddress) public initializer { + manager = ICasimirManager(managerAddress); + } + + /// @inheritdoc ICasimirViewsDev + function getCompoundablePoolIds( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint32[5] memory compoundablePoolIds) { + uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + uint256 count = 0; + for (uint256 i = startIndex; i < endIndex; i++) { + uint32 poolId; + if (i < pendingPoolIds.length) { + poolId = pendingPoolIds[i]; + } else { + poolId = stakedPoolIds[i - pendingPoolIds.length]; + } + if (manager.getPoolAddress(poolId).balance >= COMPOUND_MINIMUM) { + compoundablePoolIds[count] = poolId; + count++; + if (count == 5) { + break; + } + } + } + } + + /// @inheritdoc ICasimirViewsDev + function getDepositedPoolCount() external view returns (uint256 depositedPoolCount) { + depositedPoolCount = manager.getPendingPoolIds().length + manager.getStakedPoolIds().length; + } + + /// @inheritdoc ICasimirViewsDev + function getDepositedPoolPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[] memory) { + bytes[] memory publicKeys = new bytes[](endIndex - startIndex); + uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + uint256 count = 0; + for (uint256 i = startIndex; i < endIndex; i++) { + uint32 poolId; + if (i < pendingPoolIds.length) { + poolId = pendingPoolIds[i]; + } else { + poolId = stakedPoolIds[i - pendingPoolIds.length]; + } + publicKeys[count] = ICasimirPool(manager.getPoolAddress(poolId)).publicKey(); + count++; + } + return publicKeys; + } + + /// @inheritdoc ICasimirViewsDev + function getDepositedPoolStatuses( + uint256 startIndex, + uint256 endIndex + ) external view returns (ICasimirPool.PoolStatus[] memory) { + ICasimirPool.PoolStatus[] memory statuses = new ICasimirPool.PoolStatus[](endIndex - startIndex); + uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + uint256 count = 0; + for (uint256 i = startIndex; i < endIndex; i++) { + uint32 poolId; + if (i < pendingPoolIds.length) { + poolId = pendingPoolIds[i]; + } else { + poolId = stakedPoolIds[i - pendingPoolIds.length]; + } + statuses[count] = ICasimirPool(manager.getPoolAddress(poolId)).status(); + count++; + } + return statuses; + } + + /// @inheritdoc ICasimirViewsDev + function getOperators( + uint256 startIndex, + uint256 endIndex + ) external view returns (ICasimirRegistry.Operator[] memory) { + ICasimirRegistry.Operator[] memory operators = new ICasimirRegistry.Operator[](endIndex - startIndex); + ICasimirRegistry registry = ICasimirRegistry(manager.getRegistryAddress()); + uint64[] memory operatorIds = registry.getOperatorIds(); + uint256 count = 0; + for (uint256 i = startIndex; i < endIndex; i++) { + uint64 operatorId = operatorIds[i]; + operators[count] = registry.getOperator(operatorId); + count++; + } + return operators; + } + + /// @inheritdoc ICasimirViewsDev + function getPoolConfig(uint32 poolId) external view returns (PoolConfig memory poolConfig) { + address poolAddress = manager.getPoolAddress(poolId); + ICasimirPool pool = ICasimirPool(poolAddress); + poolConfig = PoolConfig({ + poolAddress: poolAddress, + balance: poolAddress.balance, + operatorIds: pool.getOperatorIds(), + publicKey: pool.publicKey(), + reshares: pool.reshares(), + status: pool.status() + }); + } + + /// @inheritdoc ICasimirViewsDev + function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint128 sweptBalance) { + uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + for (uint256 i = startIndex; i < endIndex; i++) { + uint32 poolId; + if (i < pendingPoolIds.length) { + poolId = pendingPoolIds[i]; + } else { + poolId = stakedPoolIds[i - pendingPoolIds.length]; + } + sweptBalance += uint128(manager.getPoolAddress(poolId).balance / 1 gwei); + } + } +} diff --git a/contracts/ethereum/src/v1/dev/interfaces/ICasimirFactoryDev.sol b/contracts/ethereum/src/v1/dev/interfaces/ICasimirFactoryDev.sol new file mode 100644 index 000000000..016b62800 --- /dev/null +++ b/contracts/ethereum/src/v1/dev/interfaces/ICasimirFactoryDev.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "../../interfaces/ICasimirCore.sol"; + +/// @title Factory interface +interface ICasimirFactoryDev is ICasimirCore { + event FunctionsRequestSet( + uint32 indexed managerId, + string newRequestSource, + string[] newRequestArgs, + uint32 newFulfillGasLimit + ); + event FunctionsOracleSet(uint32 indexed managerId, address newFunctionsOracleAddress); + event ManagerDeployed(uint32 managerId); + event ReservedFeesWithdrawn(uint32 indexed managerId, uint256 amount); + + /** + * @notice Deploy a new manager + * @param daoOracleAddress DAO oracle address + * @param functionsOracleAddress Chainlink functions oracle address + * @param strategy Staking strategy configuration + */ + function deployManager(address daoOracleAddress, address functionsOracleAddress, Strategy memory strategy) external; + + /// @notice Manager beacon address + function managerBeaconAddress() external view returns (address); + + /// @notice Pool beacon address + function poolBeaconAddress() external view returns (address); + + /// @notice Registry beacon address + function registryBeaconAddress() external view returns (address); + + /// @notice Upkeep beacon address + function upkeepBeaconAddress() external view returns (address); + + /// @notice Views beacon address + function viewsBeaconAddress() external view returns (address); + + /// @notice Get manager config + function getManagerConfig(uint32 managerId) external view returns (ManagerConfig memory); + + /// @notice Get the manager IDs + function getManagerIds() external view returns (uint32[] memory); + + /// @notice Get the owner address + function getOwner() external view returns (address); +} diff --git a/contracts/ethereum/src/v1/dev/interfaces/ICasimirManagerDev.sol b/contracts/ethereum/src/v1/dev/interfaces/ICasimirManagerDev.sol index 9a4e702b3..6b02e0d1e 100644 --- a/contracts/ethereum/src/v1/dev/interfaces/ICasimirManagerDev.sol +++ b/contracts/ethereum/src/v1/dev/interfaces/ICasimirManagerDev.sol @@ -31,6 +31,8 @@ interface ICasimirManagerDev is ICasimirCore { event WithdrawalRequested(address indexed sender, uint256 amount); event WithdrawalInitiated(address indexed sender, uint256 amount); + error Paused(); + error InvalidRebalance(); error ForcedExitAlreadyReported(); error InsufficientLiquidity(); error NoReadyPools(); @@ -105,6 +107,18 @@ interface ICasimirManagerDev is ICasimirCore { uint256 completedExits ) external; + /** + * @notice Undo or redo a rebalance of the rewards to stake ratio (will be removed in the next release) + * @param rebalance Rebalance amount + */ + function unbalanceStake(int256 rebalance) external; + + /** + * @notice Set the latest beacon chain balance after fees (will be removed in the next release) + * @param newLatestBeaconBalanceAfterFees New latest beacon chain balance after fees + */ + function setLatestBeaconBalanceAfterFees(uint256 newLatestBeaconBalanceAfterFees) external; + /** * @notice Compound pool rewards * @param poolIds Pool IDs @@ -212,6 +226,12 @@ interface ICasimirManagerDev is ICasimirCore { */ function resetFunctions() external; + /** + * @notice Pause or unpause the contract + * @param paused Whether the contract is paused + */ + function setPaused(bool paused) external; + /** * @notice Withdraw cluster balance * @param operatorIds Operator IDs @@ -284,12 +304,18 @@ interface ICasimirManagerDev is ICasimirCore { /// @notice Get the total stake (buffered + beacon - requested withdrawals) function getTotalStake() external view returns (uint256); + /// @notice Get the latest active reward balance + function getLatestActiveRewardBalance() external view returns (int256); + /// @notice Get the pending pool IDs function getPendingPoolIds() external view returns (uint32[] memory); /// @notice Get the staked pool IDs function getStakedPoolIds() external view returns (uint32[] memory); + /// @notice Get the stake ratio sum + function getStakeRatioSum() external view returns (uint256); + /** * @notice Get the eligibility of a pending withdrawal * @param index Index of the pending withdrawal diff --git a/contracts/ethereum/src/v1/dev/interfaces/ICasimirRegistryDev.sol b/contracts/ethereum/src/v1/dev/interfaces/ICasimirRegistryDev.sol new file mode 100644 index 000000000..00bb7a83a --- /dev/null +++ b/contracts/ethereum/src/v1/dev/interfaces/ICasimirRegistryDev.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "../../interfaces/ICasimirCore.sol"; + +interface ICasimirRegistryDev is ICasimirCore { + event CollateralDeposited(uint64 indexed operatorId, uint256 amount); + event DeactivationCompleted(uint64 indexed operatorId); + event DeactivationRequested(uint64 indexed operatorId); + event DeregistrationCompleted(uint64 indexed operatorId); + event OperatorPoolAdded(uint64 indexed operatorId, uint32 poolId); + event OperatorPoolRemoved(uint64 operatorId, uint32 poolId, uint256 blameAmount); + event OperatorRegistered(uint64 indexed operatorId); + event WithdrawalFulfilled(uint64 indexed operatorId, uint256 amount); + + error CollateralInUse(); + error InsufficientCollateral(); + error OperatorAlreadyRegistered(); + error OperatorNotActive(); + error OperatorResharing(); + error PoolAlreadyExists(); + error PoolDoesNotExist(); + + /** + * @notice Register an operator + * @param operatorId Operator ID + */ + function registerOperator(uint64 operatorId) external payable; + + /** + * @notice Deposit operator collateral + * @param operatorId Operator ID + */ + function depositCollateral(uint64 operatorId) external payable; + + /** + * @notice Request to withdraw operator collateral + * @param operatorId Operator ID + * @param amount Amount to withdraw + */ + function requestWithdrawal(uint64 operatorId, uint256 amount) external; + + /** + * @notice Request operator deactivation + * @param operatorId Operator ID + */ + function requestDeactivation(uint64 operatorId) external; + + /** + * @notice Add a pool to an operator + * @param operatorId Operator ID + * @param poolId Pool ID + */ + function addOperatorPool(uint64 operatorId, uint32 poolId) external; + + /** + * @notice Remove a pool from an operator + * @param operatorId Operator ID + * @param poolId Pool ID + * @param blameAmount Amount to recover from collateral + */ + function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external; + + /** + * @notice Get an operator + * @param operatorId Operator ID + */ + function getOperator(uint64 operatorId) external view returns (Operator memory); + + /// @notice Get all previously registered operator IDs + function getOperatorIds() external view returns (uint64[] memory); + + /// @notice Minimum collateral per operator per pool + function minCollateral() external view returns (uint256); + + /// @notice Whether private operators are enabled + function privateOperators() external view returns (bool); + + /// @notice Whether verified operators are enabled + function verifiedOperators() external view returns (bool); +} diff --git a/contracts/ethereum/src/v1/dev/interfaces/ICasimirUpkeepDev.sol b/contracts/ethereum/src/v1/dev/interfaces/ICasimirUpkeepDev.sol index fbb74ea15..17dc32157 100644 --- a/contracts/ethereum/src/v1/dev/interfaces/ICasimirUpkeepDev.sol +++ b/contracts/ethereum/src/v1/dev/interfaces/ICasimirUpkeepDev.sol @@ -25,8 +25,8 @@ interface ICasimirUpkeepDev is ICasimirCore, AutomationCompatibleInterface { event FunctionsOracleAddressSet(address newFunctionsOracleAddress); event FunctionsRequestSet(string newRequestSource, string[] newRequestArgs, uint32 newFulfillGasLimit); event OCRResponse(bytes32 indexed requestId, bytes result, bytes err); - event ReportRequested(); - event ReportRequestsSent(uint32, uint256, uint256, uint256, uint256); + event NewReportRequested(); + event ReportRequestSent(bytes32 requestId, string[] requestArgs); event UpkeepPerformed(ReportStatus indexed status); error InvalidRequest(); @@ -41,7 +41,7 @@ interface ICasimirUpkeepDev is ICasimirCore, AutomationCompatibleInterface { /** * @notice Reset the report * @param resetReportPeriod Reset report period - * @param resetReportBlock Reset report block + * @param resetReportBlock Reset report block * @param resetReportTimestamp Reset report timestamp * @param resetPreviousReportBlock Reset previous report block * @param resetPreviousReportTimestamp Reset previous report timestamp diff --git a/contracts/ethereum/src/v1/dev/interfaces/ICasimirViewsDev.sol b/contracts/ethereum/src/v1/dev/interfaces/ICasimirViewsDev.sol new file mode 100644 index 000000000..4a35616da --- /dev/null +++ b/contracts/ethereum/src/v1/dev/interfaces/ICasimirViewsDev.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "../../interfaces/ICasimirCore.sol"; + +interface ICasimirViewsDev is ICasimirCore { + /** + * @notice Get the next five compoundable pool IDs + * @param startIndex Start index + * @param endIndex End index + */ + function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] memory); + + /// @notice Get the deposited pool count + function getDepositedPoolCount() external view returns (uint256); + + /** + * @notice Get the deposited pool public keys + * @param startIndex Start index + * @param endIndex End index + */ + function getDepositedPoolPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[] memory); + + /** + * @notice Get the deposited pool statuses + * @param startIndex Start index + * @param endIndex End index + */ + function getDepositedPoolStatuses(uint256 startIndex, uint256 endIndex) external view returns (PoolStatus[] memory); + + /** + * @notice Get operators + * @param startIndex Start index + * @param endIndex End index + */ + function getOperators(uint256 startIndex, uint256 endIndex) external view returns (Operator[] memory); + + /** + * @notice Get pool config + * @param poolId Pool ID + */ + function getPoolConfig(uint32 poolId) external view returns (PoolConfig memory); + + /** + * @notice Get the swept balance (in gwei) + * @param startIndex Start index + * @param endIndex End index + */ + function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint128); +} diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index 25ec312ac..d7e3cd51b 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -31,6 +31,8 @@ interface ICasimirManager is ICasimirCore { event WithdrawalRequested(address indexed sender, uint256 amount); event WithdrawalInitiated(address indexed sender, uint256 amount); + error Paused(); + error InvalidRebalance(); error ForcedExitAlreadyReported(); error InsufficientLiquidity(); error NoReadyPools(); @@ -105,6 +107,19 @@ interface ICasimirManager is ICasimirCore { uint256 completedExits ) external; + /** + * @notice Undo or redo a rebalance of the rewards to stake ratio (will be removed in the next release) + * @param rebalance Rebalance amount (will be removed in the next release) + */ + function unbalanceStake(int256 rebalance) external; + + /** + * @notice Set the latest beacon chain balance after fees + * @dev Beta-only, will be removed in the next release + * @param newLatestBeaconBalanceAfterFees New latest beacon chain balance after fees + */ + function setLatestBeaconBalanceAfterFees(uint256 newLatestBeaconBalanceAfterFees) external; + /** * @notice Compound pool rewards * @param poolIds Pool IDs @@ -212,6 +227,12 @@ interface ICasimirManager is ICasimirCore { */ function resetFunctions() external; + /** + * @notice Pause or unpause the contract + * @param paused Whether the contract is paused + */ + function setPaused(bool paused) external; + /** * @notice Withdraw cluster balance * @param operatorIds Operator IDs @@ -300,6 +321,9 @@ interface ICasimirManager is ICasimirCore { /// @notice Get the withdrawable balance (prepool + exited) function getWithdrawableBalance() external view returns (uint256); + /// @notice Get the stake ratio sum + function getStakeRatioSum() external view returns (uint256); + /** * @notice Get user stake * @param userAddress User address diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol index 79ea44d59..43d9283ca 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol @@ -25,8 +25,8 @@ interface ICasimirUpkeep is ICasimirCore, AutomationCompatibleInterface { event FunctionsOracleAddressSet(address newFunctionsOracleAddress); event FunctionsRequestSet(string newRequestSource, string[] newRequestArgs, uint32 newFulfillGasLimit); event OCRResponse(bytes32 indexed requestId, bytes result, bytes err); - event ReportRequested(); - event ReportRequestsSent(uint32, uint256, uint256, uint256, uint256); + event NewReportRequested(); + event ReportRequestSent(bytes32 requestId, string[] requestArgs); event UpkeepPerformed(ReportStatus indexed status); error InvalidRequest(); diff --git a/contracts/ethereum/test/debug.ts b/contracts/ethereum/test/debug.ts new file mode 100644 index 000000000..03a86c24f --- /dev/null +++ b/contracts/ethereum/test/debug.ts @@ -0,0 +1,103 @@ +// import { expect } from 'chai' +import fs from 'fs' +import { ethers, upgrades } from 'hardhat' +import { ETHEREUM_CONTRACTS } from '@casimir/env' +import CasimirFactoryAbi from '../build/abi/CasimirFactory.json' +import ICasimirManagerDevAbi from '../build/abi/ICasimirManagerDev.json' +import ICasimirRegistryAbi from '../build/abi/ICasimirRegistry.json' +import ICasimirUpkeepDevAbi from '../build/abi/ICasimirUpkeepDev.json' +import ICasimirViewsAbi from '../build/abi/ICasimirViews.json' +import { CasimirManagerDev, CasimirRegistry, CasimirUpkeepDev, CasimirViews } from '../build/@types' + +describe('Upgrades', async function () { + it('Check values with dev', async function () { + if (process.env.DEBUG) { + const debugBlockNumber = process.env.ETHEREUM_FORK_BLOCK ? parseInt(process.env.ETHEREUM_FORK_BLOCK) : await ethers.provider.getBlockNumber() + const networkKey = (process.env.NETWORK?.toUpperCase() || 'TESTNET') as keyof typeof ETHEREUM_CONTRACTS + const factory = new ethers.Contract(ETHEREUM_CONTRACTS[networkKey].FACTORY_ADDRESS, CasimirFactoryAbi, ethers.provider) + const [managerId] = await factory.getManagerIds() + const managerConfig = await factory.getManagerConfig(managerId) + + const managerDevFactory = await ethers.getContractFactory('CasimirManagerDev', { + libraries: { + CasimirBeacon: ETHEREUM_CONTRACTS[networkKey].BEACON_LIBRARY_ADDRESS + } + }) + const managerBeacon = await upgrades.upgradeBeacon(ETHEREUM_CONTRACTS[networkKey].MANAGER_BEACON_ADDRESS, managerDevFactory, { + constructorArgs: [ + ETHEREUM_CONTRACTS[networkKey].FUNCTIONS_BILLING_REGISTRY_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].KEEPER_REGISTRAR_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].KEEPER_REGISTRY_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].LINK_TOKEN_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].SSV_NETWORK_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].SSV_TOKEN_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].SWAP_FACTORY_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].SWAP_ROUTER_ADDRESS, + ETHEREUM_CONTRACTS[networkKey].WETH_TOKEN_ADDRESS + ], + unsafeAllow: ['external-library-linking'] + }) + await managerBeacon.deployed() + const manager = new ethers.Contract(managerConfig.managerAddress, ICasimirManagerDevAbi, ethers.provider) as CasimirManagerDev + console.log(`CasimirManager beacon upgraded at ${manager.address}`) + + const registry = new ethers.Contract(managerConfig.registryAddress, ICasimirRegistryAbi, ethers.provider) as CasimirRegistry + + const upkeepDevFactory = await ethers.getContractFactory('CasimirUpkeepDev') + const upkeepBeacon = await upgrades.upgradeBeacon(ETHEREUM_CONTRACTS['TESTNET'].UPKEEP_BEACON_ADDRESS, upkeepDevFactory) + await upkeepBeacon.deployed() + const upkeep = new ethers.Contract(managerConfig.upkeepAddress, ICasimirUpkeepDevAbi, ethers.provider) as CasimirUpkeepDev + console.log(`CasimirUpkeep beacon upgraded at ${upkeep.address}`) + + const views = new ethers.Contract(managerConfig.viewsAddress, ICasimirViewsAbi, ethers.provider) as CasimirViews + + const latestActiveRewardBalance = await manager.getLatestActiveRewardBalance() + const latestBeaconBalance = await manager.latestBeaconBalance() + const stakeRatioSum = await manager.getStakeRatioSum() + const totalStake = await manager.getTotalStake() + const deposits = await manager.queryFilter(manager.filters.StakeDeposited(), 0, debugBlockNumber) + const userAddresses = deposits.map(deposit => deposit.args?.sender).filter((value, index, self) => self.indexOf(value) === index) + const userStakes: Record = {} + for (const userAddress of userAddresses) { + const userStake = await manager.getUserStake(userAddress) + userStakes[userAddress] = ethers.utils.formatEther(userStake) + } + + // const depositedPoolCount = await views.getDepositedPoolCount() + // const compoundablePoolIds = await views.getCompoundablePoolIds(0, depositedPoolCount) + // const sweptBalance = await views.getSweptBalance(0, depositedPoolCount) + + const dust = totalStake.sub(Object.values(userStakes).reduce((acc, curr) => { + return acc.add(ethers.utils.parseEther(curr)) + }, ethers.utils.parseEther('0'))) + const values = { + // compoundablePoolIds, + dust: ethers.utils.formatEther(dust), + latestActiveRewardBalance: ethers.utils.formatEther(latestActiveRewardBalance), + latestBeaconBalance: ethers.utils.formatEther(latestBeaconBalance), + stakeRatioSum: ethers.utils.formatEther(stakeRatioSum), + // sweptBalance: ethers.utils.formatEther(sweptBalance), + totalStake: ethers.utils.formatEther(totalStake), + userStakes + } + const debugBlock = { + block: debugBlockNumber, + values + } + const debugBlocksDir = 'debug' + const debugBlocksFile = 'blocks.json' + const debugBlocksPath = `${debugBlocksDir}/${debugBlocksFile}` + if (!fs.existsSync(debugBlocksDir)) { + fs.mkdirSync(debugBlocksDir, { recursive: true }) + } + let existingDebugBlocks: typeof debugBlock[] + try { + existingDebugBlocks = JSON.parse(fs.readFileSync(debugBlocksPath).toString()) + } catch (e) { + existingDebugBlocks = [] + } + existingDebugBlocks.push(debugBlock) + fs.writeFileSync(debugBlocksPath, JSON.stringify(existingDebugBlocks, null, 4)) + } + }) +}) \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index a853c018d..8193fcad9 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -129,7 +129,7 @@ export async function deploymentFixture() { }) as CasimirFactory await factory.deployed() - const defaultStrategy = { + const simpleStrategy = { minCollateral: ethers.utils.parseEther('1.0'), lockPeriod: 0, userFee: 5, @@ -139,12 +139,12 @@ export async function deploymentFixture() { privateOperators: false, verifiedOperators: false } - const deployBaseManager = await factory.deployManager( + const deploySimpleManager = await factory.deployManager( daoOracle.address, functionsOracle.address, - defaultStrategy + simpleStrategy ) - await deployBaseManager.wait() + await deploySimpleManager.wait() const [managerId] = await factory.getManagerIds() const [managerAddress, registryAddress, upkeepAddress, viewsAddress] = await factory.getManagerConfig(managerId) const manager = await ethers.getContractAt('CasimirManager', managerAddress) as CasimirManager diff --git a/contracts/ethereum/test/upgrades.ts b/contracts/ethereum/test/upgrades.ts deleted file mode 100644 index 2a24342e6..000000000 --- a/contracts/ethereum/test/upgrades.ts +++ /dev/null @@ -1,46 +0,0 @@ -// import { expect } from 'chai' -import { ethers, upgrades } from 'hardhat' -import { ETHEREUM_CONTRACTS } from '@casimir/env' -import CasimirFactoryAbi from '../build/abi/CasimirFactory.json' -import CasimirManagerDevAbi from '../build/abi/CasimirManagerDev.json' -import CasimirUpkeepDevAbi from '../build/abi/CasimirUpkeepDev.json' -import { CasimirManagerDev, CasimirUpkeepDev } from '../build/@types' - -describe('Upgrades', async function () { - - it('Upgrade upkeep with dev', async function () { - const factory = new ethers.Contract(ETHEREUM_CONTRACTS['TESTNET'].FACTORY_ADDRESS, CasimirFactoryAbi, ethers.provider) - const [managerId] = await factory.getManagerIds() - const managerConfig = await factory.getManagerConfig(managerId) - - const managerDevFactory = await ethers.getContractFactory('CasimirManagerDev', { - libraries: { - CasimirBeacon: ETHEREUM_CONTRACTS['TESTNET'].BEACON_LIBRARY_ADDRESS - } - }) - const managerBeacon = await upgrades.upgradeBeacon(ETHEREUM_CONTRACTS['TESTNET'].MANAGER_BEACON_ADDRESS, managerDevFactory, { - constructorArgs: [ - ETHEREUM_CONTRACTS['TESTNET'].FUNCTIONS_BILLING_REGISTRY_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].KEEPER_REGISTRAR_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].KEEPER_REGISTRY_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].LINK_TOKEN_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].SSV_NETWORK_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].SSV_TOKEN_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].SWAP_FACTORY_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].SWAP_ROUTER_ADDRESS, - ETHEREUM_CONTRACTS['TESTNET'].WETH_TOKEN_ADDRESS - ], - unsafeAllow: ['external-library-linking'] - }) - await managerBeacon.deployed() - const manager = new ethers.Contract(managerConfig.managerAddress, CasimirManagerDevAbi, ethers.provider) as CasimirManagerDev - console.log(`CasimirManager beacon upgraded at ${manager.address}`) - - const upkeepDevFactory = await ethers.getContractFactory('CasimirUpkeepDev') - const upkeepBeacon = await upgrades.upgradeBeacon(ETHEREUM_CONTRACTS['TESTNET'].UPKEEP_BEACON_ADDRESS, upkeepDevFactory) - await upkeepBeacon.deployed() - const upkeep = new ethers.Contract(managerConfig.upkeepAddress, CasimirUpkeepDevAbi, ethers.provider) as CasimirUpkeepDev - console.log(`CasimirUpkeep beacon upgraded at ${upkeep.address}`) - }) - -}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2dc954a03..65a094038 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "casimir", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "casimir", - "version": "1.0.0-beta.1", + "version": "1.0.0-beta.3", "hasInstallScript": true, "license": "Apache", "workspaces": [ @@ -687,24 +687,24 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-athena": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.437.0.tgz", - "integrity": "sha512-eFk8eh17LmvvoAF4id09/k3+N1+zQ80UWA8elZwImyHfwMXhwicPbxCdK6ugJ41nlA0y5mGPrFRLsfSazVhlkw==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-athena/-/client-athena-3.441.0.tgz", + "integrity": "sha512-QmMAKVV4Yrz+bX7oOOjsELpxYDA00kGp6vb53s6CkQ3ZQLYFqHyENQ/bWtdsv+O/9qeRn6GTn2G86avJdMur3Q==", "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.437.0", - "@aws-sdk/core": "3.436.0", - "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/client-sts": "3.441.0", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", "@aws-sdk/region-config-resolver": "3.433.0", "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@aws-sdk/util-user-agent-browser": "3.433.0", "@aws-sdk/util-user-agent-node": "3.437.0", "@smithy/config-resolver": "^2.0.16", @@ -727,6 +727,7 @@ "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.16", "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0", @@ -737,23 +738,23 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.437.0.tgz", - "integrity": "sha512-7mI0WT21ru2H6T13J5xNHMIE/dXj1tEeObvwAvUcwQl1J1ZKzFFM/fth3AHX+KACJJ/B5WD+xiTuv62/SXE7AA==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.441.0.tgz", + "integrity": "sha512-0BYe2YAoAIF2GdonU6IcrUb/r2pYJHICzqOCi85ixAiGKYokBSl53P7x17DkA7J2mjLWTv+S9nvuVa2RG/L7bA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.437.0", - "@aws-sdk/core": "3.436.0", - "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/client-sts": "3.441.0", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", "@aws-sdk/region-config-resolver": "3.433.0", "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@aws-sdk/util-user-agent-browser": "3.433.0", "@aws-sdk/util-user-agent-node": "3.437.0", "@smithy/config-resolver": "^2.0.16", @@ -776,6 +777,7 @@ "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.16", "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -785,23 +787,23 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.437.0.tgz", - "integrity": "sha512-ZRNdI3yHeAjVA67PpjLSYm0w47fbzy2H5mVT+xfyp/NWGw2HmpA6PP1Ns4p0tU5lMU6AcAUMGABo+MbKae1iDQ==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.441.0.tgz", + "integrity": "sha512-XKXO2qGWA9lRz1jykIfl5Lz5g3IRoa+NBnQDXFnTSzw52oOUAoyYOcpN0JL9/5ga1q9UxJtq2Mk3yKlIeRbxHQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.437.0", - "@aws-sdk/core": "3.436.0", - "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/client-sts": "3.441.0", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", "@aws-sdk/region-config-resolver": "3.433.0", "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@aws-sdk/util-user-agent-browser": "3.433.0", "@aws-sdk/util-user-agent-node": "3.437.0", "@smithy/config-resolver": "^2.0.16", @@ -824,6 +826,7 @@ "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.16", "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0", @@ -834,20 +837,20 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.437.0.tgz", - "integrity": "sha512-AxlLWz9ec3b8Bt+RqRb2Q1ucGQtKrLdKDna+UTjz7AouB/jpoMiegV9NHXVX64N6YFnQnvB0UEGigXiOQE+y/g==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.441.0.tgz", + "integrity": "sha512-gndGymu4cEIN7WWhQ67RO0JMda09EGBlay2L8IKCHBK/65Y34FHUX1tCNbO2qezEzsi6BPW5o2n53Rd9QqpHUw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.436.0", + "@aws-sdk/core": "3.441.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", "@aws-sdk/region-config-resolver": "3.433.0", "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@aws-sdk/util-user-agent-browser": "3.433.0", "@aws-sdk/util-user-agent-node": "3.437.0", "@smithy/config-resolver": "^2.0.16", @@ -870,6 +873,7 @@ "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.16", "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -879,23 +883,23 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.437.0.tgz", - "integrity": "sha512-ilLcrCVwH81UbKNpB9Vax1Fw/mNx2d/bWXkCNXPvrExO+K39VFGS/VijOuSrru2iBq844NlG3uQV8DL/nbiKdA==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.441.0.tgz", + "integrity": "sha512-GL0Cw2v7XL1cn0T+Sk5VHLlgBJoUdMsysXsHa1mFdk0l6XHMAAnwXVXiNnjmoDSPrG0psz7dL2AKzPVRXbIUjA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.436.0", - "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", "@aws-sdk/middleware-sdk-sts": "3.433.0", "@aws-sdk/middleware-signing": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", "@aws-sdk/region-config-resolver": "3.433.0", "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@aws-sdk/util-user-agent-browser": "3.433.0", "@aws-sdk/util-user-agent-node": "3.437.0", "@smithy/config-resolver": "^2.0.16", @@ -918,6 +922,7 @@ "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.16", "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", @@ -928,9 +933,9 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.436.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.436.0.tgz", - "integrity": "sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.441.0.tgz", + "integrity": "sha512-gV0eQwR0VnSPUYAbgDkbBtfXbSpZgl/K6UB13DP1IFFjQYbF/BxYwvcQe4jHoPOBifSgjEbl8MfOOeIyI7k9vg==", "dependencies": { "@smithy/smithy-client": "^2.1.12" }, @@ -939,11 +944,11 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.437.0.tgz", - "integrity": "sha512-XCIb6yfX9YlEc7Hn4dfSkLny31OMpekA7usFsXEnoOn3geCKC1xFvrpa9LhHbxkMqLTVzWPGji2DGlJAb2xxpw==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.441.0.tgz", + "integrity": "sha512-mIs5vI3zcN/iVyUwpVdEhmFsUFX0x95aGErVh1ratX7fHdtENdSt0X5Bn3yQowze1DRUJBahqsPZuxe35gUt8w==", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.437.0", + "@aws-sdk/client-cognito-identity": "3.441.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.4.0", @@ -987,13 +992,13 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.437.0.tgz", - "integrity": "sha512-UybiJxYPvdwok5OcI9LakaHmaWZBdkX0gY8yU2n7TomYgWOwDJ88MpQgjXUJJ249PH+9/+How5H3vnFp0xJ0uQ==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.441.0.tgz", + "integrity": "sha512-SQipQYxYqDUuSOfIhDmaTdwPTcndGQotGZXWJl56mMWqAhU8MkwjK+oMf3VgRt/umJC0QwUCF5HUHIj7gSB1JA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.433.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-sso": "3.441.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -1007,14 +1012,14 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.437.0.tgz", - "integrity": "sha512-FMtgEe/me68xZQsymEpMcw7OuuiHaHx/Tp5EqZP5FC0Yv1yX3qr/ncIWU2zY3a9K0iLERmzQI1g3CMd8r4sy8A==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.441.0.tgz", + "integrity": "sha512-WB9p37yHq6fGJt6Vll29ijHbkh9VDbPM/n5ns73bTAgFD7R0ht5kPmdmHGQA6m3RKjcHLPbymQ3lXykkMwWf/Q==", "dependencies": { "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-ini": "3.437.0", + "@aws-sdk/credential-provider-ini": "3.441.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-sso": "3.441.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -1043,12 +1048,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.437.0.tgz", - "integrity": "sha512-kijtnyyA6/+ipOef4KACsLDUTFWDZ97DSWKU0hJFyGEfelaon6o7NNVufuVOWrBNyklNWZqvPLuwWWQCxb6fuQ==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.441.0.tgz", + "integrity": "sha512-pTg16G+62mWCE8yGKuQnEBqPdpG5g71remf2jUqXaI1c7GCzbnkQDV9eD4DaAGOvzIs0wo9zAQnS2kVDPFlCYA==", "dependencies": { - "@aws-sdk/client-sso": "3.437.0", - "@aws-sdk/token-providers": "3.437.0", + "@aws-sdk/client-sso": "3.441.0", + "@aws-sdk/token-providers": "3.438.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", @@ -1074,20 +1079,20 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.437.0.tgz", - "integrity": "sha512-aLgwo45dTDxAO2Gtx+9y4CfiEhvvGfWz2M+IMS48dQ2gmp1z+GXMiJv1zBhoidL2AvQMOpkgO0bl+qFlC4Cmmw==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.437.0", - "@aws-sdk/client-sso": "3.437.0", - "@aws-sdk/client-sts": "3.437.0", - "@aws-sdk/credential-provider-cognito-identity": "3.437.0", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.441.0.tgz", + "integrity": "sha512-DLx7s9/YR1CwWSjVmDMKLhyWrBXOFY3RtDLXh7AD4CAEGjhNr9mYWILMk4E6RtXl1ZhRKTMlkrUQnxNTwmct1w==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.441.0", + "@aws-sdk/client-sso": "3.441.0", + "@aws-sdk/client-sts": "3.441.0", + "@aws-sdk/credential-provider-cognito-identity": "3.441.0", "@aws-sdk/credential-provider-env": "3.433.0", "@aws-sdk/credential-provider-http": "3.435.0", - "@aws-sdk/credential-provider-ini": "3.437.0", - "@aws-sdk/credential-provider-node": "3.437.0", + "@aws-sdk/credential-provider-ini": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.437.0", + "@aws-sdk/credential-provider-sso": "3.441.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -1172,12 +1177,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.433.0.tgz", - "integrity": "sha512-jMgA1jHfisBK4oSjMKrtKEZf0sl2vzADivkFmyZFzORpSZxBnF6hC21RjaI+70LJLcc9rSCzLgcoz5lHb9LLDg==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", "dependencies": { "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@smithy/protocol-http": "^3.0.8", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" @@ -1202,19 +1207,19 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.437.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.437.0.tgz", - "integrity": "sha512-nV9qIuG0+6XJb7hWpCC+/K7RoY3PZUWndP8BRQv7PQhhpd8tG/I5Kxb0V83h2XFBXyyjnv0aOHO8ehz3Kfcv2Q==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", - "@aws-sdk/middleware-user-agent": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", "@aws-sdk/region-config-resolver": "3.433.0", "@aws-sdk/types": "3.433.0", - "@aws-sdk/util-endpoints": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", "@aws-sdk/util-user-agent-browser": "3.433.0", "@aws-sdk/util-user-agent-node": "3.437.0", "@smithy/config-resolver": "^2.0.16", @@ -1239,6 +1244,7 @@ "@smithy/util-body-length-node": "^2.1.0", "@smithy/util-defaults-mode-browser": "^2.0.16", "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -1260,11 +1266,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.433.0.tgz", - "integrity": "sha512-LFNUh9FH7RMtYjSjPGz9lAJQMzmJ3RcXISzc5X5k2R/9mNwMK7y1k2VAfvx+RbuDbll6xwsXlgv6QHcxVdF2zw==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "dependencies": { "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" }, "engines": { @@ -5107,9 +5114,9 @@ } }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.31.0.tgz", - "integrity": "sha512-E1Cz8lVpo2mnBeFWxiGDLWtuTYMFNTEWwbnhle4dZ+5UHX6xTRO+Q/CaWBHm33HHhuuiUbRwgGNnAR9zOu+fyQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.31.1.tgz", + "integrity": "sha512-BdkTZwvBxgZ9BYYfhOhuivmqZLOZ/bm6mK5eEDZ36I3Fy64a9BDL/NusaDV5XAoGn4La/j9dZSbTtgP/6d8jAQ==", "dev": true, "dependencies": { "cbor": "^9.0.0", @@ -5936,6 +5943,19 @@ "node": ">= 10.0.0" } }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", + "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", @@ -6181,23 +6201,23 @@ } }, "node_modules/@trezor/analytics": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.8.tgz", - "integrity": "sha512-MUCn0ka9PJqG9Sv5QvUr4ZhjPa4PNLjq5bigvzMy7CcWi5WFBF1VzbHAcJcibzsNQfihtQKUXLFKB5PnDKD8Xg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.9.tgz", + "integrity": "sha512-ezssF0dNAF6cyyG8WCpW5lEeIMMe5BmP+CDLhRGXKvL8kWudFYqJm8w1vI4Dh4yzmymWnFT5qrgdtRgDe/INxQ==", "dependencies": { - "@trezor/env-utils": "1.0.7", - "@trezor/utils": "9.0.13" + "@trezor/env-utils": "1.0.8", + "@trezor/utils": "9.0.14" } }, "node_modules/@trezor/blockchain-link": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.17.tgz", - "integrity": "sha512-5HPf+aLpu+wh5H2bXPet5HXKPo7CUcugKIqtcYgPVShUiVGH7PYmHtc575VxFkOIbw0xT+s8sTAyK2bdbPhCOA==", - "dependencies": { - "@trezor/blockchain-link-types": "1.0.6", - "@trezor/blockchain-link-utils": "1.0.7", - "@trezor/utils": "9.0.13", - "@trezor/utxo-lib": "1.0.11", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.18.tgz", + "integrity": "sha512-seqRx7PbPAd8E3cbNfGeNUqvinNfAHx03XxfD+obyYUkKRkVtaSJIXzIxXKt+ZKxLd4Mf1F+PTIsBdFEjlny9A==", + "dependencies": { + "@trezor/blockchain-link-types": "1.0.7", + "@trezor/blockchain-link-utils": "1.0.8", + "@trezor/utils": "9.0.14", + "@trezor/utxo-lib": "1.0.12", "@types/web": "^0.0.100", "bignumber.js": "^9.1.1", "events": "^3.3.0", @@ -6207,16 +6227,16 @@ } }, "node_modules/@trezor/blockchain-link-types": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.6.tgz", - "integrity": "sha512-1mlBoIRACqVehZ4DAv4AkbTkbcQ+vJ9IzV4uTdPpbHvfHYhbLc+7EloyIwGMRZ1ol7hxDJVIyGlH04ajStSMFQ==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.7.tgz", + "integrity": "sha512-/zhNsMatUlTeXhh3qJZysYd2GZLUtFffS5aVRybES4IDoXI+W8I1l5cXKEEIoQu1TbyYqXPjBPJKAO9Gtnpm+w==" }, "node_modules/@trezor/blockchain-link-utils": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.7.tgz", - "integrity": "sha512-3b2W1QIZBYbn2qHZhVDCr9zhURX9vK+FnounYmfCF3Vzi/ltgV1jJsE4M2K51oSOwBAESUx2Gm5ae9drYKqUww==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.8.tgz", + "integrity": "sha512-Mi9QmvUeLQufGgI6VIZFEYVjp8JxsaYn2y6NvagobN+MmAwKi46PwS8c2n+g7qIWwC6AF8TFW3RFp+wzLmZeaw==", "dependencies": { - "@trezor/utils": "9.0.13", + "@trezor/utils": "9.0.14", "bignumber.js": "^9.1.1" } }, @@ -6254,50 +6274,53 @@ } }, "node_modules/@trezor/connect": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.1.4.tgz", - "integrity": "sha512-bJIJxOaoVKNLAWS+/0HBPFx56hd5C7Tg7FxqWAWI9EDeXKvLSwzHOJagpOJ8zsr4UmU6ur3yBLBMVR/ykXlVhw==", - "dependencies": { - "@trezor/blockchain-link": "2.1.17", - "@trezor/blockchain-link-types": "1.0.6", - "@trezor/connect-analytics": "1.0.7", - "@trezor/connect-common": "0.0.21", - "@trezor/protobuf": "1.0.1", - "@trezor/protocol": "1.0.1", - "@trezor/transport": "1.1.16", - "@trezor/utils": "9.0.13", - "@trezor/utxo-lib": "1.0.11", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.1.5.tgz", + "integrity": "sha512-elDxUoR7B2gNZzYHsc2QCendmF641afnRFo0s6dO/u/Q8HACqL4MVZoPD4U+P0Rjp8IRY00q4YFX3GcYnBTUPA==", + "dependencies": { + "@trezor/blockchain-link": "2.1.18", + "@trezor/blockchain-link-types": "1.0.7", + "@trezor/connect-analytics": "1.0.8", + "@trezor/connect-common": "0.0.22", + "@trezor/protobuf": "1.0.2", + "@trezor/protocol": "1.0.2", + "@trezor/transport": "1.1.17", + "@trezor/utils": "9.0.14", + "@trezor/utxo-lib": "1.0.12", "bignumber.js": "^9.1.1", "blakejs": "^1.2.1", "bs58": "^5.0.0", "bs58check": "^3.0.1", "cross-fetch": "^3.1.6", "events": "^3.3.0" + }, + "peerDependencies": { + "tslib": "^2.6.2" } }, "node_modules/@trezor/connect-analytics": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.7.tgz", - "integrity": "sha512-QZGdpB+S5+rn38g3y5UIb8VIrb7f8lL5dQ5ORM/XOAomypixQ3YYjMCL2foP01t4GalfbZgfB5i9n3MhOwiILA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.8.tgz", + "integrity": "sha512-b0zXr4/6ekNgJYzDb/mydgLY00U4DoM53jYkj7Ar5k+Q3QwwUN8dL0ewufoBQdtXWdJTlJ34eMO/x9zaSlTdVg==", "dependencies": { - "@trezor/analytics": "1.0.8" + "@trezor/analytics": "1.0.9" } }, "node_modules/@trezor/connect-common": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.21.tgz", - "integrity": "sha512-rfbWOAcTIvifwl4R+sgs9Ap8h9e6+KI8D3QaF23fIQxmGmb2hPP63NGq1QSa81S+8OYsde2LMEOdMPzuUCEZkA==", + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.22.tgz", + "integrity": "sha512-L44P8dWs0stNAE1q97EoVuVfhNoaC3DS+xDNpR+VouRQUj96XdJhBNKxCM0uvwl87BAdCJtfHV7SFHmjw0KvuA==", "dependencies": { - "@trezor/env-utils": "1.0.7" + "@trezor/env-utils": "1.0.8" } }, "node_modules/@trezor/connect-web": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.1.4.tgz", - "integrity": "sha512-DAhjZiwqE+ckIdLQ/vtFWbFBCTCCJLC1kGaIGRiJwPZfEEq0k/ZPkkOxpiznu6Ol7RQDbgM5CLutLalIC4f4lA==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.1.5.tgz", + "integrity": "sha512-HThzoK9Ya7cR2ckSWL52K85rDrfJwUU5asN7CfKyLJ3wlt3iPwxLkncbn0sOO/W8oKSiz999l0P8kXRUpOXWqg==", "dependencies": { - "@trezor/connect": "9.1.4", - "@trezor/utils": "9.0.13", + "@trezor/connect": "9.1.5", + "@trezor/utils": "9.0.14", "events": "^3.3.0" } }, @@ -6324,9 +6347,9 @@ } }, "node_modules/@trezor/env-utils": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.7.tgz", - "integrity": "sha512-pJHmIyClho42exY8wBfl1nbs1//1IgW06lhM5V/jrjg+aDprUm5BFKsM2hKOtqVyFf2aqEKwLdLg+uQLkn3f8A==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.8.tgz", + "integrity": "sha512-t24rgDx6UDv+ncg7VsWwYwBJv1O9WAQyWg1ZNUjQUTIvR5oglEVZBgyv6CEDasWfvB6A6pshQ5PIYcBBkt5AIg==", "dependencies": { "ua-parser-js": "^1.0.35" }, @@ -6348,9 +6371,9 @@ } }, "node_modules/@trezor/protobuf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.0.1.tgz", - "integrity": "sha512-/72MrbxB+QM5aCdj9ml6upmJIcNfCi1n6Z+5ue2yQaQEQFdWIyUm77i7IU9SRzT4bZgrFFxRaP16tT1vdzfjTw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@trezor/protobuf/-/protobuf-1.0.2.tgz", + "integrity": "sha512-hYU8Kykd2BzxHAtB9OPLzgVjDPxRHhDVJG9nU3l2aKeWGLSjrXBy39PXwzfYd/9+AMnudDB3XsGpte9q2iPxVQ==", "dependencies": { "bytebuffer": "^5.0.1", "long": "^4.0.0", @@ -6358,21 +6381,21 @@ } }, "node_modules/@trezor/protocol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.0.1.tgz", - "integrity": "sha512-jzTrHpE/1AJ3LwNQZ6p++iXJ1DG7YkOU4A/nASy6bI6eRpg/mQIjsj1dkqDwhlfp1rFBbD7xKvDWG4UoMJhlOA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@trezor/protocol/-/protocol-1.0.2.tgz", + "integrity": "sha512-WeUDbiwG/85J4vvzVT6CXYYDzVspivYYhmaiH08IChF5BybD1B/ycrvhJKtq7gKrCoGUk35Z7RKT8oMvWIkHIQ==", "dependencies": { "bytebuffer": "^5.0.1" } }, "node_modules/@trezor/transport": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.16.tgz", - "integrity": "sha512-uSy29VEbcQ6VolGr8mFjYiL6+YTJJ37etsq44vLE/giaI09fCFzP8Dt6iA1xH+cL6fcgGAS3W8ivrbP69lqCOA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.17.tgz", + "integrity": "sha512-5FnS3/6qRO8KK1OWQyKTkMt9dWKjp2WuQXAQgS/LYPRPF53Gkd3MoWS1wKKofbqH+LY1CbLyEpdhwBY1Tz5Yow==", "dependencies": { - "@trezor/protobuf": "1.0.1", - "@trezor/protocol": "1.0.1", - "@trezor/utils": "9.0.13", + "@trezor/protobuf": "1.0.2", + "@trezor/protocol": "1.0.2", + "@trezor/utils": "9.0.14", "bytebuffer": "^5.0.1", "cross-fetch": "^3.1.6", "json-stable-stringify": "^1.0.2", @@ -6382,16 +6405,16 @@ } }, "node_modules/@trezor/utils": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.13.tgz", - "integrity": "sha512-DvUKEC/Pc5/xOJT6UmQgc29AXakB1tftNo1XMMaDlRKnbDsofuSBiGnxK4pf/Emp5eem4D+9bdnrhHMmLBTQTQ==" + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.14.tgz", + "integrity": "sha512-9Q1LtxgAKpNDvvtQttTc/ufYHonnSJ3wmWnxPZsc1H0gn9MLV8WwRMH5+Yl3gJsUKZvcTJ5xwippVWDxPwP8Uw==" }, "node_modules/@trezor/utxo-lib": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.11.tgz", - "integrity": "sha512-21UpKcwLyGGLfACNrg1vrGAmZ8ZSk+h2jtjzCVAOAktSu9fmsLXVBAK9cXfBwWTWjbLacykOvwW/V259vKLGaw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.12.tgz", + "integrity": "sha512-Mtg3bE+Z+8oVfiME2CPZycbpbEyMymF4+YH2eD4aa4adysTimRxwI9+bjrUwMLwUsG1OrrNOVpeail9FrNB+hA==", "dependencies": { - "@trezor/utils": "9.0.13", + "@trezor/utils": "9.0.14", "bchaddrjs": "^0.5.2", "bech32": "^2.0.0", "bip66": "^1.1.5", @@ -6528,9 +6551,9 @@ } }, "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -6542,12 +6565,6 @@ "integrity": "sha512-XSEUB7zqWXTvNb8oWIcyX8CG5bmCR8YuBJucbi5MfVbJOzADqGfI3kEsGcEee/dwOKe60pQrVPjT+r8SQgcniQ==", "dev": true }, - "node_modules/@types/aws-lambda": { - "version": "8.10.125", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.125.tgz", - "integrity": "sha512-Vqw/WMlV4O1fJT6capim01v7VLDZkcX1n6Yhb52E7IfnMqYbNfwHfyDV8rRN42NLBtdDvfaqcCqs2K0fr5ljZw==", - "dev": true - }, "node_modules/@types/babel__core": { "version": "7.20.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", @@ -6700,9 +6717,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, "node_modules/@types/express": { @@ -6811,9 +6828,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", - "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -6933,9 +6950,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", "dependencies": { "undici-types": "~5.26.4" } @@ -7367,30 +7384,30 @@ } }, "node_modules/@volar/language-core": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.7.tgz", - "integrity": "sha512-6+WI7HGqWCsKJ/bms4V45WP7eDeoGxDtLjYPrHB7QkIWVkRLIeGPzzBoonZz9kERM+Kld3W89Y+IlICejVAKhA==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.10.tgz", + "integrity": "sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==", "dev": true, "dependencies": { - "@volar/source-map": "1.10.7" + "@volar/source-map": "1.10.10" } }, "node_modules/@volar/source-map": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.7.tgz", - "integrity": "sha512-anA254XO0lmmeu0p/kvgPOCkrVpqNIHWMvEkPX70PSk4ntg0iBzN/f0Kip6deXvibl6v14Q3Z8RihWrZwdZEEQ==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.10.tgz", + "integrity": "sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==", "dev": true, "dependencies": { "muggle-string": "^0.3.1" } }, "node_modules/@volar/typescript": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.7.tgz", - "integrity": "sha512-2hvA3vjXVUn1vOpsP/nWLnE5DUmY6YKQhvDRoZVfBrnWwIo0ySxdTUP4XieXGGgSk43xJaeU1zqQS/3Wfm7QgA==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.10.tgz", + "integrity": "sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==", "dev": true, "dependencies": { - "@volar/language-core": "1.10.7", + "@volar/language-core": "1.10.10", "path-browserify": "^1.0.1" } }, @@ -8719,8 +8736,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -8826,9 +8841,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.103.1", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.103.1.tgz", - "integrity": "sha512-5DXPlMi8Gf/a6fMqwY6uVwuR21PDDNGkAGkMVTTuaiulc4RsMjQUGq8I4xaPIYQRvR+VHFU+JQ5j5PnI5/gBrA==", + "version": "2.104.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.104.0.tgz", + "integrity": "sha512-JuCafR5D1lnMKA88JUYhvRYeguozAWneC/n6kR1FUG+kXtXxpEqOxP91118dfJZYRw7FMIkHW8ewddvLwaCy5g==", "dev": true, "bin": { "cdk": "bin/cdk" @@ -9322,8 +9337,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { "version": "3.0.9", @@ -9800,7 +9814,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10184,9 +10197,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001555", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001555.tgz", - "integrity": "sha512-NzbUFKUnJ3DTcq6YyZB6+qqhfD112uR3uoEnkmfzm2wVzUNsFkU7AwBjKQ654Sp5cau0JxhFyRSn/tQZ+XfygA==", + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", "dev": true, "funding": [ { @@ -10216,7 +10229,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -10974,8 +10986,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -11124,9 +11135,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", - "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -11357,9 +11368,9 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/cytoscape": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz", - "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.27.0.tgz", + "integrity": "sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==", "dev": true, "dependencies": { "heap": "^0.2.6", @@ -12611,9 +12622,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.569", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz", - "integrity": "sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==", + "version": "1.4.575", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz", + "integrity": "sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==", "dev": true }, "node_modules/elkjs": { @@ -14650,7 +14661,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -15287,9 +15297,9 @@ } }, "node_modules/hardhat": { - "version": "2.18.3", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.3.tgz", - "integrity": "sha512-JuYaTG+4ZHVjEHCW5Hn6jCHH3LpO75dtgznZpM/dLv12RcSlw/xHbeQh3FAsGahQr1epKryZcZEMHvztVZHe0g==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.0.tgz", + "integrity": "sha512-kMpwovOEfrFRQXEopCP+JTcKVwSYVj8rnXE0LynxDqnh06yvyKCQknmXL6IVYTHQL6Csysc/yNbCHQbjSeJGpA==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -16023,7 +16033,6 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, "engines": { "node": ">= 4" } @@ -17613,9 +17622,9 @@ } }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -17771,8 +17780,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "peer": true, "engines": { "node": "*" } @@ -18506,9 +18513,7 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "node_modules/lodash.uniqby": { "version": "4.7.0", @@ -19510,7 +19515,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -21523,9 +21527,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -22459,7 +22463,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -24743,8 +24746,6 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -24793,8 +24794,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -24810,8 +24809,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -24819,16 +24816,12 @@ "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -27771,7 +27764,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, "engines": { "node": ">= 14" } @@ -27898,9 +27890,9 @@ } }, "node_modules/zx/node_modules/@types/node": { - "version": "18.18.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.7.tgz", - "integrity": "sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==", + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -28003,9 +27995,9 @@ } }, "node_modules/zx/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -28099,7 +28091,6 @@ "name": "@casimir/redirect", "devDependencies": { "@types/aws-cloudfront-function": "^1.0.3", - "@types/aws-lambda": "^8.10.125", "@types/node": "^17.0.38", "esbuild": "^0.15.9" } diff --git a/package.json b/package.json index 8fa31ac95..91fa09d86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "casimir", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.3", "description": "Decentralized staking and asset management", "workspaces": [ "apps/*", @@ -11,10 +11,10 @@ ], "scripts": { "clean": "npx esno scripts/root/clean.ts", + "debug:ethereum": "npx esno -r dotenv/config scripts/ethereum/debug.ts", "deploy:cdk": "npx esno -r dotenv/config scripts/cdk/deploy.ts", "deploy:ethereum": "npx esno -r dotenv/config scripts/ethereum/deploy.ts", "dev": "npx esno -r dotenv/config scripts/root/dev.ts", - "dev:ethereum": "npx esno -r dotenv/config scripts/ethereum/dev.ts", "dev:landing": "APP=landing npm run dev", "docgen": "npm run docgen --workspace @casimir/ethereum", "lint": "eslint --ext .vue,.ts ./ --fix", @@ -27,7 +27,6 @@ "test": "echo \"Error: no test specified\" && exit 1", "test:actions": "npx esno -r dotenv/config scripts/actions/test.ts", "test:cdk": "npx esno -r dotenv/config scripts/cdk/test.ts", - "test:ethereum": "npx esno -r dotenv/config scripts/ethereum/test.ts", "upgrade:ethereum": "npx esno -r dotenv/config scripts/ethereum/upgrade.ts" }, "repository": { @@ -85,4 +84,4 @@ } }, "dependencies": {} -} \ No newline at end of file +} diff --git a/scripts/ethereum/test.ts b/scripts/ethereum/debug.ts old mode 100755 new mode 100644 similarity index 62% rename from scripts/ethereum/test.ts rename to scripts/ethereum/debug.ts index e023b4d90..ee50be3d8 --- a/scripts/ethereum/test.ts +++ b/scripts/ethereum/debug.ts @@ -1,4 +1,3 @@ -import { ethers } from 'ethers' import { loadCredentials, getSecret } from '@casimir/aws' import { ETHEREUM_CONTRACTS, ETHEREUM_NETWORK_NAME, ETHEREUM_RPC_URL } from '@casimir/env' import { run } from '@casimir/shell' @@ -17,7 +16,7 @@ void async function () { process.env.FORK = process.env.FORK || 'testnet' - process.env.ETHEREUM_FORK_RPC_URL = ETHEREUM_RPC_URL[process.env.FORK.toUpperCase()] + process.env.ETHEREUM_FORK_RPC_URL = process.env.ETHEREUM_FORK_RPC_URL || ETHEREUM_RPC_URL[process.env.FORK.toUpperCase()] if (!process.env.ETHEREUM_FORK_RPC_URL) { throw new Error(`Ethereum ${process.env.FORK} is not supported`) } @@ -26,26 +25,9 @@ void async function () { console.log(`Using ${networkName} fork from ${process.env.ETHEREUM_FORK_RPC_URL}`) - const provider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_FORK_RPC_URL) - - const wallet = ethers.Wallet.fromMnemonic(process.env.BIP39_SEED) - - // Account for the mock, beacon, and library deployments - const walletNonce = await provider.getTransactionCount(wallet.address) + 13 - - if (!process.env.FACTORY_ADDRESS) { - process.env.FACTORY_ADDRESS = ethers.utils.getContractAddress({ - from: wallet.address, - nonce: walletNonce - }) - } - - console.log(`Using factory address ${process.env.FACTORY_ADDRESS}`) - process.env.SSV_NETWORK_ADDRESS = ETHEREUM_CONTRACTS[process.env.FORK.toUpperCase()]?.SSV_NETWORK_ADDRESS process.env.SSV_VIEWS_ADDRESS = ETHEREUM_CONTRACTS[process.env.FORK.toUpperCase()]?.SSV_VIEWS_ADDRESS process.env.SWAP_FACTORY_ADDRESS = ETHEREUM_CONTRACTS[process.env.FORK.toUpperCase()]?.SWAP_FACTORY_ADDRESS - await run('npm run generate --workspace @casimir/oracle') - run('npm run test --workspace @casimir/ethereum') + run('npm run test:debug --workspace @casimir/ethereum') }() diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts deleted file mode 100644 index 4f81bfc11..000000000 --- a/scripts/ethereum/dev.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { ethers } from 'ethers' -import { loadCredentials, getSecret } from '@casimir/aws' -import { ETHEREUM_CONTRACTS, ETHEREUM_NETWORK_NAME, ETHEREUM_RPC_URL } from '@casimir/env' -import { run } from '@casimir/shell' - -/** - * Run an ethereum development environment - */ -void async function () { - if (process.env.USE_SECRETS !== 'false') { - await loadCredentials() - process.env.BIP39_SEED = process.env.BIP39_SEED || await getSecret('consensus-networks-bip39-seed') as string - } else { - process.env.BIP39_SEED = process.env.BIP39_SEED || 'inflict ball claim confirm cereal cost note dad mix donate traffic patient' - } - console.log(`Your mnemonic seed is ${process.env.BIP39_SEED}`) - - process.env.FORK = process.env.FORK || 'testnet' - process.env.TUNNEL = process.env.TUNNEL || 'false' - process.env.MINING_INTERVAL = '12' - process.env.ETHEREUM_RPC_URL = 'http://127.0.0.1:8545' - - process.env.ETHEREUM_FORK_RPC_URL = ETHEREUM_RPC_URL[process.env.FORK.toUpperCase()] - if (!process.env.ETHEREUM_FORK_RPC_URL) { - throw new Error(`Ethereum ${process.env.FORK} is not supported`) - } - - const networkName = ETHEREUM_NETWORK_NAME[process.env.FORK.toUpperCase()] - - console.log(`Using ${networkName} fork from ${process.env.ETHEREUM_FORK_RPC_URL}`) - console.log(`Serving local fork at ${process.env.ETHEREUM_RPC_URL}`) - - const provider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_FORK_RPC_URL) - process.env.ETHEREUM_FORK_BLOCK = process.env.ETHEREUM_FORK_BLOCK || `${await provider.getBlockNumber() - 5}` - console.log(`πŸ“ Forking started at ${process.env.ETHEREUM_FORK_BLOCK}`) - - const wallet = ethers.Wallet.fromMnemonic(process.env.BIP39_SEED) - - // Account for the mock, beacon, and library deployments - const walletNonce = await provider.getTransactionCount(wallet.address) + 13 - - if (!process.env.FACTORY_ADDRESS) { - process.env.FACTORY_ADDRESS = ethers.utils.getContractAddress({ - from: wallet.address, - nonce: walletNonce - }) - } - - process.env.SSV_NETWORK_ADDRESS = ETHEREUM_CONTRACTS[process.env.FORK.toUpperCase()]?.SSV_NETWORK_ADDRESS - process.env.SSV_VIEWS_ADDRESS = ETHEREUM_CONTRACTS[process.env.FORK.toUpperCase()]?.SSV_VIEWS_ADDRESS - process.env.SWAP_FACTORY_ADDRESS = ETHEREUM_CONTRACTS[process.env.FORK.toUpperCase()]?.SWAP_FACTORY_ADDRESS - - run('npm run node --workspace @casimir/ethereum') - const hardhatWaitTime = 2500 - await new Promise(resolve => setTimeout(resolve, hardhatWaitTime)) - run('npm run dev --workspace @casimir/ethereum -- --network localhost') -}() diff --git a/scripts/root/check.ts b/scripts/root/check.ts index 5b020076c..e2370b0bf 100644 --- a/scripts/root/check.ts +++ b/scripts/root/check.ts @@ -43,7 +43,7 @@ void async function () { const goNumberSplit = goNumber.split('.') const goMajor = parseInt(goNumberSplit[0]) const goMinor = parseInt(goNumberSplit[1]) - if (goMajor < 1 || goMinor < 18) { + if (goMajor < 1 || goMinor < 20) { throw new Error('🚩 Incompatible go version') } } catch (error) { diff --git a/scripts/root/dev.ts b/scripts/root/dev.ts index 8bb37d1ec..80491d918 100644 --- a/scripts/root/dev.ts +++ b/scripts/root/dev.ts @@ -3,12 +3,26 @@ import { loadCredentials, getSecret } from '@casimir/aws' import { ETHEREUM_CONTRACTS, ETHEREUM_NETWORK_NAME, ETHEREUM_RPC_URL } from '@casimir/env' import { run, runSync } from '@casimir/shell' -console.log(ETHEREUM_CONTRACTS['TESTNET'].FUNCTIONS_BILLING_REGISTRY_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].KEEPER_REGISTRAR_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].KEEPER_REGISTRY_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].LINK_TOKEN_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].SSV_NETWORK_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].SSV_TOKEN_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].SWAP_FACTORY_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].SWAP_ROUTER_ADDRESS, ETHEREUM_CONTRACTS['TESTNET'].WETH_TOKEN_ADDRESS) - /** - * Run an integrated development environment + * Root script used to run an integrated development environment + * You can override the following configuration environment variables: + * - PROJECT: casimir + * - STAGE: local | dev | sandbox | prod + * - APP: web | landing + * - NETWORK: mainnet | testnet + * - FORK: mainnet | testnet + * - USE_SECRETS: true | false + * - BUILD_PREVIEW: true | false + * - MOCK_SERVICES: true | false + * - BIP39_SEED: string + * - CRYPTO_COMPARE_API_KEY: string + * - HACKMD_TOKEN: string + * - WALLET_CONNECT_PROJECT_ID: string + * - ETHEREUM_RPC_URL: string + * - ETHEREUM_FORK_RPC_URL: string + * - ETHEREUM_FORK_BLOCK: string */ -void async function () { +async function root() { const apps = { landing: { contracts: false, @@ -76,48 +90,31 @@ void async function () { } const networkKey = process.env.NETWORK?.toUpperCase() || process.env.FORK?.toUpperCase() || 'TESTNET' + process.env.FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.FACTORY_ADDRESS process.env.SSV_NETWORK_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.SSV_NETWORK_ADDRESS process.env.SSV_VIEWS_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.SSV_VIEWS_ADDRESS process.env.SWAP_FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.SWAP_FACTORY_ADDRESS if (apps[app].contracts) { if (process.env.NETWORK) { - process.env.ETHEREUM_RPC_URL = ETHEREUM_RPC_URL[networkKey] const networkName = ETHEREUM_NETWORK_NAME[networkKey] - - console.log(`Using ${networkName} network from ${process.env.ETHEREUM_RPC_URL}`) - - if (!process.env.ETHEREUM_RPC_URL) { - throw new Error(`Ethereum ${process.env.NETWORK} is not supported`) - } - - process.env.FACTORY_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.FACTORY_ADDRESS - if (!process.env.FACTORY_ADDRESS) { - throw new Error(`No factory address provided for ${process.env.NETWORK} ethereum network.`) - } + process.env.ETHEREUM_RPC_URL = ETHEREUM_RPC_URL[networkKey] + console.log(`Connecting to ${networkName} network at ${process.env.ETHEREUM_RPC_URL}`) } else { + const networkName = ETHEREUM_NETWORK_NAME[networkKey] process.env.ETHEREUM_FORK_RPC_URL = ETHEREUM_RPC_URL[networkKey] - if (!process.env.ETHEREUM_FORK_RPC_URL) { - throw new Error(`Ethereum ${process.env.FORK} is not supported`) - } - process.env.ETHEREUM_RPC_URL = 'http://127.0.0.1:8545' - - const provider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_FORK_RPC_URL) - process.env.ETHEREUM_FORK_BLOCK = process.env.ETHEREUM_FORK_BLOCK || `${await provider.getBlockNumber() - 5}` - - const wallet = ethers.Wallet.fromMnemonic(process.env.BIP39_SEED) - - // Account for the mock, beacon, and library deployments - const walletNonce = await provider.getTransactionCount(wallet.address) + 13 - - if (!process.env.FACTORY_ADDRESS) { - process.env.FACTORY_ADDRESS = ethers.utils.getContractAddress({ - from: wallet.address, - nonce: walletNonce - }) - } - - run('npm run dev:ethereum') + console.log(`Connecting to ${networkName} network fork at ${process.env.ETHEREUM_RPC_URL}`) + + const forkProvider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_FORK_RPC_URL) + process.env.ETHEREUM_FORK_BLOCK = process.env.ETHEREUM_FORK_BLOCK || `${await forkProvider.getBlockNumber() - 10}` + console.log(`πŸ“ Forking started at ${process.env.ETHEREUM_FORK_BLOCK}`) + + process.env.TUNNEL = process.env.TUNNEL || 'false' + process.env.MINING_INTERVAL = '12' + process.env.SIMULATE_EIGENS = 'true' + process.env.SIMULATE_REWARDS = 'true' + + run('npm run dev --workspace @casimir/ethereum -- --network localhost') } } @@ -147,4 +144,9 @@ void async function () { process.exit() }) } -}() +} + +root().catch(error => { + console.error(error) + process.exit(1) +}) diff --git a/services/functions/API-request-source.js b/services/functions/API-request-source.js index 59d4e8929..848c6fb8b 100644 --- a/services/functions/API-request-source.js +++ b/services/functions/API-request-source.js @@ -1,4 +1,4 @@ -const [ +const [ genesisTimestamp, viewsAddress, getCompoundablePoolIdsSignature, @@ -31,7 +31,7 @@ async function balancesHandler() { const depositedPoolCount = await getDepositedPoolCount() const startIndex = BigInt(0).toString(16).padStart(64, '0') const endIndex = BigInt(depositedPoolCount).toString(16).padStart(64, '0') - + const depositedPoolPublicKeys = await getDepositedPoolPublicKeys(startIndex, endIndex) const validators = await getValidators(depositedPoolPublicKeys) @@ -57,14 +57,9 @@ async function detailsHandler() { const depositedPoolCount = await getDepositedPoolCount() const startIndex = BigInt(0).toString(16).padStart(64, '0') const endIndex = BigInt(depositedPoolCount).toString(16).padStart(64, '0') - + const depositedPoolPublicKeys = await getDepositedPoolPublicKeys(startIndex, endIndex) - const depositedPoolStatuses = await getDepositedPoolStatuses(startIndex, endIndex) - for (let i = 0; i < depositedPoolCount; i++) { - console.log("* Pool") - console.log("-- Public key", depositedPoolPublicKeys[i]) - console.log("-- Status", depositedPoolStatuses[i]) - } + // const depositedPoolStatuses = await getDepositedPoolStatuses(startIndex, endIndex) // Not used yet const validators = await getValidators(depositedPoolPublicKeys) const activatedDeposits = validators.reduce((accumulator, { validator }) => { @@ -123,19 +118,17 @@ async function getCompoundablePoolIds(startIndex, endIndex) { params: [ { to: viewsAddress, - data: getCompoundablePoolIdsSignature + '0'.repeat(24) + startIndex + endIndex + data: getCompoundablePoolIdsSignature + startIndex + endIndex }, { blockNumber: '0x' + parseInt(reportBlockNumber).toString(16) } ] } }) if (request.error) throw new Error('Failed to get compoundable pool IDs') - const rawPoolIds = request.data.result.slice(2) + const data = request.data.result.slice(2).match(/.{1,64}/g) let poolIds = [] - for (let i = 0; i < 5; i++) { - let start = i * 8 - let end = start + 8 - let poolId = parseInt(rawPoolIds.slice(start, end), 16) + for (const item of data) { + let poolId = parseInt(item, 16) poolIds.push(poolId) } return poolIds @@ -180,16 +173,27 @@ async function getDepositedPoolPublicKeys(startIndex, endIndex) { } }) if (request.error) throw new Error('Failed to get validator public keys') - const rawPublicKeys = request.data.result.slice(2) - const numKeys = parseInt(rawPublicKeys.slice(64, 128), 16) + const data = request.data.result.slice(2).match(/.{1,64}/g) + // '0000000000000000000000000000000000000000000000000000000000000020', // Chunk size? + // '0000000000000000000000000000000000000000000000000000000000000002', // Array size + // '0000000000000000000000000000000000000000000000000000000000000040', // Item size + // '00000000000000000000000000000000000000000000000000000000000000a0', // Array start + // '0000000000000000000000000000000000000000000000000000000000000030', // Item 1 data size + // '8889a628f263c414e256a1295c3f49ac1780e0b9cac8493dd1bd2f17b3b25766', // Item 1 data + // '0a12fb88f65333fa00c9a735c0f8d0e800000000000000000000000000000000', // Item 1 data + // '0000000000000000000000000000000000000000000000000000000000000030', // Item 2 data size + // '853b4caf348bccddbf7e1c25e68676c3b3f857958c93b290a2bf84974ea33c4f', // Item 2 data + // '793f1bbf7e9e9923f16e2237038e7b6900000000000000000000000000000000' // Item 2 data + const itemCount = parseInt(data[1], 16) const publicKeys = [] - for (let i = 0; i < numKeys; i++) { - let offset = 64 * 3 + i * 96 - let length = parseInt(rawPublicKeys.slice(offset, offset + 64), 16) * 2 - let publicKeyStart = offset + 64 - let publicKeyEnd = publicKeyStart + length - let publicKey = '0x' + rawPublicKeys.slice(publicKeyStart, publicKeyEnd) + let itemIndex = 4 + for (let i = 0; i < itemCount; i++) { + const publicKey = '0x'.concat( + data[itemIndex + 1], + data[itemIndex + 2].slice(0, 32) + ) publicKeys.push(publicKey) + itemIndex += 3 } return publicKeys } @@ -205,20 +209,21 @@ async function getDepositedPoolStatuses(startIndex, endIndex) { params: [ { to: viewsAddress, - data: getDepositedPoolStatusesSignature + '0'.repeat(24) + startIndex + endIndex + data: getDepositedPoolStatusesSignature + startIndex + endIndex }, { blockNumber: '0x' + parseInt(reportBlockNumber).toString(16) } ] } }) if (request.error) throw new Error('Failed to get validator statuses') - const rawStatuses = request.data.result.slice(2) + const data = request.data.result.slice(2).match(/.{1,64}/g) + const itemCount = parseInt(data[1], 16) const statuses = [] - for (let i = 0; i < 5; i++) { - let start = i * 8 - let end = start + 8 - let status = parseInt(rawStatuses.slice(start, end), 16) + let itemIndex = 2 + for (let i = 0; i < itemCount; i++) { + let status = parseInt(data[itemIndex], 16) statuses.push(status) + itemIndex += 1 } return statuses } @@ -234,14 +239,15 @@ async function getSweptBalance(startIndex, endIndex) { params: [ { to: viewsAddress, - data: getSweptBalanceSignature + '0'.repeat(24) + startIndex + endIndex + data: getSweptBalanceSignature + startIndex + endIndex }, { blockNumber: '0x' + parseInt(reportBlockNumber).toString(16) } ] } }) if (request.error) throw new Error('Failed to get swept balance') - return parseFloat(request.data.result.slice(0, -9)) + const data = request.data.result.slice(2) + return parseInt(data, 16) } async function getValidators(validatorPublicKeys) { @@ -253,15 +259,15 @@ async function getValidators(validatorPublicKeys) { } function encodeUint32(value) { - const buffer = Buffer.alloc(32) - buffer.writeUInt32BE(value, 28) - return buffer + const buffer = Buffer.alloc(32) + buffer.writeUInt32BE(value, 28) + return buffer } function encodeUint32Array(values) { - const buffer = Buffer.alloc(32 * values.length) - for (let i = 0; i < values.length; i++) { - buffer.writeUInt32BE(values[i], i * 32 + 28) - } - return buffer + const buffer = Buffer.alloc(32 * values.length) + for (let i = 0; i < values.length; i++) { + buffer.writeUInt32BE(values[i], i * 32 + 28) + } + return buffer } \ No newline at end of file diff --git a/services/functions/package.json b/services/functions/package.json index c08de5fc5..2907a0e9a 100644 --- a/services/functions/package.json +++ b/services/functions/package.json @@ -6,7 +6,8 @@ "build": "", "dev": "npx esno -r dotenv/config scripts/dev.ts", "functions-simulate-javascript": "node scripts/simulateFunctionsJavaScript.js", - "functions-gen-keys": "node scripts/generateKeypair.js" + "functions-gen-keys": "node scripts/generateKeypair.js", + "simulate": "npx esno -r dotenv/config scripts/simulate.ts" }, "dependencies": { "@chainlink/env-enc": "^1.0.5", diff --git a/services/functions/scripts/dev.ts b/services/functions/scripts/dev.ts index aa2b4aff2..fdac31d19 100644 --- a/services/functions/scripts/dev.ts +++ b/services/functions/scripts/dev.ts @@ -1,32 +1,34 @@ +import { ethers } from 'ethers' import { loadCredentials, getSecret } from '@casimir/aws' import { ETHEREUM_CONTRACTS, ETHEREUM_RPC_URL } from '@casimir/env' import { run } from '@casimir/shell' +import { waitForNetwork } from '@casimir/ethereum/helpers/network' /** * Start the Chainlink functions service */ -void async function() { - +async function dev() { if (process.env.USE_SECRETS !== 'false') { await loadCredentials() process.env.BIP39_SEED = process.env.BIP39_SEED || await getSecret('consensus-networks-bip39-seed') as string } else { process.env.BIP39_SEED = process.env.BIP39_SEED || 'inflict ball claim confirm cereal cost note dad mix donate traffic patient' } - const networkKey = process.env.NETWORK?.toUpperCase() || process.env.FORK?.toUpperCase() || 'TESTNET' - if (process.env.NETWORK) { - process.env.ETHEREUM_RPC_URL = process.env.ETHEREUM_RPC_URL || ETHEREUM_RPC_URL[networkKey] - process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.FUNCTIONS_BILLING_REGISTRY_ADDRESS - process.env.FUNCTIONS_ORACLE_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.FUNCTIONS_ORACLE_ADDRESS - } - if (!process.env.ETHEREUM_RPC_URL) throw new Error(`No ethereum rpc url provided for ${networkKey}`) - if (!process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS) throw new Error(`No functions billing registry address provided for ${networkKey}`) - if (!process.env.FUNCTIONS_ORACLE_ADDRESS) throw new Error('No functions oracle address provided') - + process.env.ETHEREUM_RPC_URL = process.env.ETHEREUM_RPC_URL || ETHEREUM_RPC_URL[networkKey] process.env.ETHEREUM_BEACON_RPC_URL = process.env.ETHEREUM_BEACON_RPC_URL || 'http://127.0.0.1:5052' - + process.env.FUNCTIONS_BILLING_REGISTRY_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.FUNCTIONS_BILLING_REGISTRY_ADDRESS + process.env.FUNCTIONS_ORACLE_ADDRESS = ETHEREUM_CONTRACTS[networkKey]?.FUNCTIONS_ORACLE_ADDRESS process.env.USE_LOGS = process.env.USE_LOGS || 'false' + + const provider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_RPC_URL) + await waitForNetwork(provider) + run('npx esno -r dotenv/config src/index.ts') console.log('πŸ”— Functions service started') -}() \ No newline at end of file +} + +dev().catch(error => { + console.error(error) + process.exit(1) +}) \ No newline at end of file diff --git a/services/functions/scripts/simulate.ts b/services/functions/scripts/simulate.ts new file mode 100644 index 000000000..b24c566af --- /dev/null +++ b/services/functions/scripts/simulate.ts @@ -0,0 +1,37 @@ +import { ethers } from 'ethers' +import { ETHEREUM_NETWORK_NAME, ETHEREUM_RPC_URL } from '@casimir/env' +import { run } from '@casimir/shell' +import { getSecret, loadCredentials } from '@casimir/aws' +import { waitForNetwork } from '@casimir/ethereum/helpers/network' + +async function simulate() { + if (process.env.USE_SECRETS !== 'false') { + await loadCredentials() + process.env.BIP39_SEED = process.env.BIP39_SEED || await getSecret('consensus-networks-bip39-seed') as string + } else { + process.env.BIP39_SEED = process.env.BIP39_SEED || 'inflict ball claim confirm cereal cost note dad mix donate traffic patient' + } + const networkKey = process.env.FORK?.toUpperCase() || 'TESTNET' + const networkName = ETHEREUM_NETWORK_NAME[networkKey] + process.env.ETHEREUM_FORK_RPC_URL = ETHEREUM_RPC_URL[networkKey] + process.env.ETHEREUM_RPC_URL = 'http://127.0.0.1:8545' + console.log(`Connecting to ${networkName} network fork at ${process.env.ETHEREUM_RPC_URL}`) + + const forkProvider = new ethers.providers.JsonRpcProvider(process.env.ETHEREUM_FORK_RPC_URL) + process.env.ETHEREUM_FORK_BLOCK = process.env.ETHEREUM_FORK_BLOCK || `${await forkProvider.getBlockNumber() - 10}` + console.log(`πŸ“ Forking started at ${process.env.ETHEREUM_FORK_BLOCK}`) + + process.env.TUNNEL = process.env.TUNNEL || 'false' + process.env.MINING_INTERVAL = '12' + process.env.SIMULATE_UPGRADES = 'true' + process.env.SIMULATE_UPKEEP = 'true' + + run('npm run dev --workspace @casimir/ethereum -- --network localhost') + run('npm run report --workspace @casimir/ethereum -- --network localhost') + run('npm run dev --workspace @casimir/functions') +} + +simulate().catch(error => { + console.error(error) + process.exit(1) +}) \ No newline at end of file diff --git a/services/functions/src/index.ts b/services/functions/src/index.ts index b7002a308..669d87b93 100644 --- a/services/functions/src/index.ts +++ b/services/functions/src/index.ts @@ -8,61 +8,61 @@ import FunctionsOracleAbi from '@casimir/ethereum/build/abi/FunctionsOracle.json const config = getConfig() -const contracts = { - FunctionsOracle: { - abi: FunctionsOracleAbi, - addresses: [config.functionsOracleAddress], - events: { - OracleRequest: fulfillRequestHandler +async function run() { + const contracts = { + FunctionsOracle: { + abi: FunctionsOracleAbi, + addresses: [config.functionsOracleAddress], + events: { + OracleRequest: fulfillRequestHandler + } } } -} - -const contractFilters = Object.values(contracts).map((contract) => { - return { - abi: contract.abi, - addresses: contract.addresses, - events: Object.keys(contract.events) + + const contractFilters = Object.values(contracts).map((contract) => { + return { + abi: contract.abi, + addresses: contract.addresses, + events: Object.keys(contract.events) + } + }) + + let startBlock + if (process.env.USE_LOGS === 'true') { + startBlock = getStartBlock('block.log') } -}) - -let startBlock -if (process.env.USE_LOGS === 'true') { - startBlock = getStartBlock('block.log') -} - -const eventsIterable = getEventsIterable({ - contractFilters, - ethereumUrl: config.ethereumUrl, - startBlock -}) - -const handlers: Record Promise> = {} -for (const contract of Object.values(contracts)) { - for (const [event, handler] of Object.entries(contract.events)) { - handlers[event as keyof typeof handlers] = handler + + const eventsIterable = getEventsIterable({ + contractFilters, + ethereumUrl: config.ethereumUrl, + startBlock + }) + + const handlers: Record Promise> = {} + for (const contract of Object.values(contracts)) { + for (const [event, handler] of Object.entries(contract.events)) { + handlers[event as keyof typeof handlers] = handler + } } -} -void async function () { - try { - for await (const event of eventsIterable) { - console.log(`Received ${event.event} event from ${event.address}`) - const args = event.args as ethers.utils.Result - const handler = handlers[event.event as string] - if (!handler) throw new Error(`No handler found for event ${event.event}`) - await handler({ args }) - if (process.env.USE_LOGS === 'true') { - // Todo check if this possibly misses events - updateStartBlock('block.log', event.blockNumber + 1) - } - } - } catch (error) { + for await (const event of eventsIterable) { + console.log(`Received ${event.event} event from ${event.address}`) + const args = event.args as ethers.utils.Result + const handler = handlers[event.event as string] + if (!handler) throw new Error(`No handler found for event ${event.event}`) + await handler({ args }) if (process.env.USE_LOGS === 'true') { - updateErrorLog('error.log', (error as Error).message) - } else { - console.log(error) + // Todo check if this possibly misses events + updateStartBlock('block.log', event.blockNumber + 1) } - process.exit(1) } -}() \ No newline at end of file +} + +run().catch(error => { + if (process.env.USE_LOGS === 'true') { + updateErrorLog('error.log', (error as Error).message) + } else { + console.log(error) + } + process.exit(1) +}) \ No newline at end of file diff --git a/services/oracle/scripts/generate.ts b/services/oracle/scripts/generate.ts index 561cf88ef..e9a90e647 100644 --- a/services/oracle/scripts/generate.ts +++ b/services/oracle/scripts/generate.ts @@ -25,7 +25,8 @@ void async function () { const wallet = ethers.Wallet.fromMnemonic(process.env.BIP39_SEED, accountPath) const validatorCount = 4 - if (!MOCK_VALIDATORS[wallet.address] || Object.keys(MOCK_VALIDATORS[wallet.address]).length < validatorCount) { + const mockValidators = MOCK_VALIDATORS || {} + if (!mockValidators[wallet.address] || Object.keys(mockValidators[wallet.address]).length < validatorCount) { await run('GOWORK=off make -C lib/dkg build') const managerAddress = ethers.utils.getContractAddress({ @@ -85,9 +86,9 @@ void async function () { ownerNonce++ } - MOCK_VALIDATORS[wallet.address] = newValidators + mockValidators[wallet.address] = newValidators - fs.writeFileSync(`${outputPath}/validators.json`, JSON.stringify(MOCK_VALIDATORS)) + fs.writeFileSync(`${outputPath}/validators.json`, JSON.stringify(mockValidators)) // fs.writeFileSync(`${outputPath}/reshares.json`, JSON.stringify(MOCK_RESHARES)) } }() \ No newline at end of file