From 1fa6ac3146624518acb8966a8d8c8f8bb9012620 Mon Sep 17 00:00:00 2001 From: Orland0x <37511817+Orland0x@users.noreply.github.com> Date: Fri, 14 Jul 2023 05:43:29 -0400 Subject: [PATCH] feat: cairo 1 migration (#410) * Initial commit * chore: repo setup with scarb + yarn * feat: space state interface * chore: updated package name * feat: space constructor base * chore: change repo structure * feat: proposal struct * feat: StorageAccess impl for Array * feat: StorageAccess impl for strategy * test: constructor base * refactor: storage impls to not use syscalls directly * fix: array storage impl runtime errors * refactor: split utils and tests into dedicated files * feat: set bit func * feat: is bit set func * feat: add voting strategies * feat: derive option impl on Strategy * chore: add bit packer to import path * refactor: implement bit setter as a trait * feat: add and remove authenticators * refactor: use unwrap when adding voting strategies * feat: updated constructor * feat: StorageAccess impl on Proposal * chore: use native pow func * feat: u8 array to felt array impl * refactor: u64 for typestamps * feat: propose func * feat: vanilla proposal validation strategy * feat: IProposalValidationStrategy * feat: call proposal validation strategy in propose * chore: fixed typos * test: deploy space with vanilla proposal validation * chore: remove deps * feat: space constructor calldata serialization * chore: updated space interface * chore: formatting * chore: propose test * feat: vanilla authenticator * feat: vanilla execution strategy * feat: proposals view func in space * test: check proposal state * feat: vanilla voting strategy * fix: remove integer literals * test: mock always fail proposal validation strategy * chore: generate cairo_project.toml and use it for external deps * chore: added OZ ownable as external lib * feat: use OZ ownable in space * feat: external setters with events * chore formatting * chore: added setters to space interface * chore: fixed tests * feat proposal creation event * chore: cleaned up imports * fix: voting strategy limit check * chore: removed old starknet tooling * chore: delete cairo_project.toml * chore: add cairo_project.toml to gitignore * feat: assert only authenticator * fix: removed dummy values from propose func * feat: IndexedStrategy type def and impl * feat: move zeroable impl to math file and impl for u64 * fix: vanilla voting strategyname and return * refactor: move module interfaces to dedicated files * refactor: make modules implement their interfaces * refactor: make space impl its interface * feat(space): added missing interface implementations * feat(space): transfer ownership * feat(space): renounce ownership * refactor: rename selector * chore: formatting * fix: bit setter * feat: num executed getter in vanilla execution) * fix: interface impls * fix: add voting strategies assert * chore: added propose selector to constants * fix(authenticator): panic and propogate error when call fails * feat: proper space setup in tests * refactor: move constants out of module * feat: vote func (#411) * feat: vote func base * chore: fixed name errors * feat: get cumulative voting power func * feat: choice enum and its LegacyHash impl * feat: vote func with choice enum * chore: test vote --------- Co-authored-by: Orlando * fix: casing * feat: execute function and simple quorum strategy (#413) * chore: added execution payload to execution strategy interface * feat: FinalizationStatus def and PartialEq, Into, TryInto, and StorageAccess impls * feat: space execute function * feat: simple quorum execution strategy and impl in vanilla execution strategy * feat: Proposal Status enum and impls for Into and PartialEq traits * chore: added execute to space interface * feat: execute test and combined propose + vote + execute into single test --------- Co-authored-by: Orlando * feat: update proposal (#414) * feat(space): update proposal * chore: test update proposal: --------- Co-authored-by: Orlando * feat(space): cancel proposal * fix: proposal timestamps * feat: ParialEq for Proposal * test: cancel proposal * refactor: use felt arrays for all arbitrary data arrays (#417) Co-authored-by: Orlando * feat: eth relayer execution strategy (#419) * feat: eth relayer * refactor: eth relayer relays entire proposal state to l1 --------- Co-authored-by: Orlando * feat: L1 avatar execution (#420) * chore: added foundry project for ethereum code * feat: legacy L1 avatar execution strategy * feat: Simple Quorum L1 avatar execution --------- Co-authored-by: Orlando * feat: eth tx authenticator (#423) * feat: starknet commit contract * feat: eth tx authenticator * fix: add selectors to payload hash computation * chore: gas instructions for vote func --------- Co-authored-by: Orlando * feat: storage proof based voting strategy (#425) * feat: single slot proof lib * chore: updated imorts * feat: timestamp to eth block number resolver * feat: eth balance of voting strategy --------- Co-authored-by: Orlando * feat: eth sig authenticator (#412) Co-authored-by: Orlando * chore: removed alexandria dep * chore: Cairo and Solidity contracts CI * refactor: derive copy for Choice (#434) * fix: use type inference (#445) * refactor: reuse into traits (#446) * Feat add set bit false (#441) * feat: add set bit false * feat: implement _remove_voting_strategies * fix: remove typo line * fix: check there is at least one active voting strategy after removal * fix: rename valid to is_valid (#448) * chore: cairo v2 migration (#453) * chore: migrate ownable * chore: migrate simple quorum * chore: migrate vanilla execution * chore: migrate eth relayer * chore: migrate eexecution strategy interface * chore: migrate authenticators * chore: migrate execution strategies * chore: migrate utils * chore: migrate voting strategies * chore: migrate interfaces * chore: migrate proposal validation strategies * chore: migrate space * chore: update tests * chore: allow all lib funcs in config * chore: remove timestamp resolver * chore: formatting * chore: cleaned up CI workflow * feat: PartialEq impl on Strategy * chore: updated tests to cairo v2 * fix: remove voting strats errors * chore: use StorageAccess impl for felt arrays from starknet by example * refactor: use read and write at offset in read and write funcs for StorageAccess impls * chore: formatting * fix: merge error --------- Co-authored-by: Orlando --------- Co-authored-by: Orlando Co-authored-by: pscott <30843220+pscott@users.noreply.github.com> --- .editorconfig | 12 - .env.example | 4 - .eslintrc | 22 - .github/workflows/lint.yml | 48 - .github/workflows/test.yml | 69 + .github/workflows/tests.yml | 59 - .gitignore | 35 +- .gitmodules | 23 +- .prettierrc | 6 - .yarnrc.yml | 1 - LICENSE | 4 +- README.md | 130 - .../ethereum/Interfaces/IStarknetCore.sol | 17 - .../StarkNetCommit/StarkNetCommit.sol | 48 - .../TestContracts/IStarknetMessaging.sol | 49 - .../TestContracts/MockStarknetMessaging.sol | 38 - .../ethereum/TestContracts/NamedStorage.sol | 93 - .../TestContracts/StarknetMessaging.sol | 85 - .../ethereum/ZodiacModule/ProposalRelayer.sol | 79 - .../ZodiacModule/SnapshotXL1Executor.sol | 409 - contracts/ethereum/ZodiacModule/deps.sol | 9 - .../starknet/Authenticators/EthSig.cairo | 64 - .../Authenticators/EthSigSessionKey.cairo | 140 - contracts/starknet/Authenticators/EthTx.cairo | 64 - .../Authenticators/EthTxSessionKey.cairo | 137 - .../starknet/Authenticators/StarkSig.cairo | 55 - .../starknet/Authenticators/StarkTx.cairo | 29 - .../starknet/Authenticators/Vanilla.cairo | 19 - .../ExecutionStrategies/EthRelayer.cairo | 47 - .../ExecutionStrategies/Vanilla.cairo | 18 - .../Interfaces/IExecutionStrategy.cairo | 9 - .../starknet/Interfaces/ISpaceAccount.cairo | 113 - .../starknet/Interfaces/ISpaceFactory.cairo | 27 - .../starknet/Interfaces/IVotingStrategy.cairo | 20 - contracts/starknet/SpaceAccount.cairo | 423 - contracts/starknet/SpaceFactory.cairo | 160 - .../ExecutionStrategies/FailsIfRejected.cairo | 17 - contracts/starknet/TestContracts/README.md | 1 - .../TestContracts/Test_ArrayUtils.cairo | 30 - .../TestContracts/Test_MathUtils.cairo | 29 - .../starknet/TestContracts/Test_Merkle.cairo | 13 - .../VotingStrategies/EthBalanceOf.cairo | 51 - .../VotingStrategies/MerkleWhitelist.cairo | 71 - .../starknet/VotingStrategies/Vanilla.cairo | 25 - .../starknet/VotingStrategies/Whitelist.cairo | 79 - contracts/starknet/fossil | 1 - contracts/starknet/lib/array_utils.cairo | 90 - contracts/starknet/lib/choice.cairo | 7 - contracts/starknet/lib/eip712.cairo | 640 - contracts/starknet/lib/eth_tx.cairo | 68 - contracts/starknet/lib/execute.cairo | 15 - contracts/starknet/lib/general_address.cairo | 6 - contracts/starknet/lib/math_utils.cairo | 96 - contracts/starknet/lib/merkle.cairo | 54 - contracts/starknet/lib/proposal.cairo | 12 - contracts/starknet/lib/proposal_info.cairo | 12 - contracts/starknet/lib/proposal_outcome.cairo | 7 - contracts/starknet/lib/session_key.cairo | 222 - .../starknet/lib/single_slot_proof.cairo | 166 - contracts/starknet/lib/slot_key.cairo | 36 - contracts/starknet/lib/stark_eip191.cairo | 256 - contracts/starknet/lib/timestamp.cairo | 62 - contracts/starknet/lib/vote.cairo | 10 - contracts/starknet/lib/voting.cairo | 1154 -- deployments/goerli1.json | 33 - deployments/goerli2.json | 34 - docs/images/governance_trilemma.png | Bin 183234 -> 0 bytes docs/images/offchain_architecture.png | Bin 124500 -> 0 bytes docs/images/onchain_architecture.png | Bin 885367 -> 0 bytes docs/milestones/1.md | 102 - docs/milestones/2.md | 104 - ethereum/foundry.toml | 7 + ethereum/lib/forge-std | 1 + .../lib/openzeppelin-contracts-upgradeable | 1 + ethereum/lib/safe-contracts | 1 + ethereum/lib/zodiac | 1 + ethereum/remappings.txt | 1 + ethereum/src/StarknetCommit.sol | 32 + .../L1AvatarExecutionStrategy.sol | 184 + .../SimpleQuorumExecutionStrategy.sol | 70 + .../StarknetSpaceManager.sol | 58 + .../src/interfaces/IExecutionStrategy.sol | 26 + ethereum/src/interfaces/IStarknetCore.sol | 13 + ethereum/src/types.sol | 55 + hardhat.config.ts | 79 - package.json | 77 +- requirements.txt | 3 - scripts/chain-l2.sh | 4 - scripts/chain.sh | 4 - scripts/deployModules.ts | 97 - scripts/deployTestSpace.ts | 171 - scripts/test-crosschain.sh | 21 - scripts/test-l2.sh | 13 - starknet/Scarb.toml | 14 + starknet/src/authenticators.cairo | 5 + starknet/src/authenticators/eth_sig.cairo | 155 + starknet/src/authenticators/eth_tx.cairo | 134 + starknet/src/authenticators/vanilla.cairo | 32 + starknet/src/execution_strategies.cairo | 3 + .../execution_strategies/eth_relayer.cairo | 36 + .../execution_strategies/simple_quorum.cairo | 64 + .../src/execution_strategies/vanilla.cairo | 50 + starknet/src/external.cairo | 1 + starknet/src/external/ownable.cairo | 64 + starknet/src/interfaces.cairo | 12 + .../src/interfaces/i_execution_strategy.cairo | 14 + .../i_proposal_validation_strategy.cairo | 11 + .../src/interfaces/i_voting_strategy.cairo | 12 + starknet/src/lib.cairo | 17 + .../src/proposal_validation_strategies.cairo | 1 + .../vanilla.cairo | 20 + starknet/src/space.cairo | 2 + starknet/src/space/space.cairo | 605 + starknet/src/tests.cairo | 3 + starknet/src/tests/mocks.cairo | 1 + .../proposal_validation_always_fail.cairo | 20 + starknet/src/tests/test_space.cairo | 366 + starknet/src/utils.cairo | 12 + starknet/src/utils/bits.cairo | 32 + starknet/src/utils/constants.cairo | 44 + starknet/src/utils/math.cairo | 48 + starknet/src/utils/signatures.cairo | 244 + starknet/src/utils/single_slot_proof.cairo | 106 + starknet/src/utils/types.cairo | 536 + starknet/src/voting_strategies.cairo | 3 + .../voting_strategies/eth_balance_of.cairo | 49 + starknet/src/voting_strategies/vanilla.cairo | 21 + test/crosschain/EthTxAuth.test.ts | 155 - test/crosschain/EthTxSessionKeyAuth.test.ts | 366 - test/crosschain/ZodiacExecution.test.ts | 211 - test/data/block.json | 415 - test/data/proofs.json | 45 - test/ethereum/ZodiacModule.test.ts | 360 - test/shared/constants.ts | 6 - test/shared/ethSigUtils.ts | 20 - test/shared/merkle.ts | 60 - test/shared/safeUtils.ts | 372 - test/shared/setup.ts | 966 -- test/shared/starkTypes.ts | 79 - test/shared/types.ts | 83 - test/starknet/ActiveProposal.test.ts | 84 - test/starknet/ArrayUtils.test.ts | 92 - test/starknet/ControllerActions.test.ts | 637 - test/starknet/EthSigAuth.test.ts | 290 - test/starknet/EthSigSessionKeyAuth.test.ts | 584 - .../ExecutionStrategyWhitelist.test.ts | 162 - test/starknet/MathUtils.test.ts | 77 - test/starknet/MerkleProof.test.ts | 167 - test/starknet/MerkleWhitelist.test.ts | 126 - test/starknet/SingleSlotProof.test.ts | 157 - test/starknet/Space.test.ts | 290 - test/starknet/SpaceFactory.test.ts | 121 - test/starknet/StarkTxAuth.test.ts | 142 - test/starknet/StarknetExecution.test.ts | 178 - test/starknet/StarknetSigAuth.test.ts | 248 - test/starknet/VanillaVotingStrategy.test.ts | 29 - test/starknet/WhitelistVotingStrategy.test.ts | 142 - tsconfig.json | 17 - yarn.lock | 10973 ---------------- 159 files changed, 3292 insertions(+), 24086 deletions(-) delete mode 100755 .editorconfig delete mode 100644 .env.example delete mode 100644 .eslintrc delete mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/tests.yml delete mode 100644 .prettierrc delete mode 100644 .yarnrc.yml mode change 100755 => 100644 LICENSE delete mode 100644 README.md delete mode 100644 contracts/ethereum/Interfaces/IStarknetCore.sol delete mode 100644 contracts/ethereum/StarkNetCommit/StarkNetCommit.sol delete mode 100644 contracts/ethereum/TestContracts/IStarknetMessaging.sol delete mode 100644 contracts/ethereum/TestContracts/MockStarknetMessaging.sol delete mode 100644 contracts/ethereum/TestContracts/NamedStorage.sol delete mode 100644 contracts/ethereum/TestContracts/StarknetMessaging.sol delete mode 100644 contracts/ethereum/ZodiacModule/ProposalRelayer.sol delete mode 100644 contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol delete mode 100644 contracts/ethereum/ZodiacModule/deps.sol delete mode 100644 contracts/starknet/Authenticators/EthSig.cairo delete mode 100644 contracts/starknet/Authenticators/EthSigSessionKey.cairo delete mode 100644 contracts/starknet/Authenticators/EthTx.cairo delete mode 100644 contracts/starknet/Authenticators/EthTxSessionKey.cairo delete mode 100644 contracts/starknet/Authenticators/StarkSig.cairo delete mode 100644 contracts/starknet/Authenticators/StarkTx.cairo delete mode 100644 contracts/starknet/Authenticators/Vanilla.cairo delete mode 100644 contracts/starknet/ExecutionStrategies/EthRelayer.cairo delete mode 100644 contracts/starknet/ExecutionStrategies/Vanilla.cairo delete mode 100644 contracts/starknet/Interfaces/IExecutionStrategy.cairo delete mode 100644 contracts/starknet/Interfaces/ISpaceAccount.cairo delete mode 100644 contracts/starknet/Interfaces/ISpaceFactory.cairo delete mode 100644 contracts/starknet/Interfaces/IVotingStrategy.cairo delete mode 100644 contracts/starknet/SpaceAccount.cairo delete mode 100644 contracts/starknet/SpaceFactory.cairo delete mode 100644 contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo delete mode 100644 contracts/starknet/TestContracts/README.md delete mode 100644 contracts/starknet/TestContracts/Test_ArrayUtils.cairo delete mode 100644 contracts/starknet/TestContracts/Test_MathUtils.cairo delete mode 100644 contracts/starknet/TestContracts/Test_Merkle.cairo delete mode 100644 contracts/starknet/VotingStrategies/EthBalanceOf.cairo delete mode 100644 contracts/starknet/VotingStrategies/MerkleWhitelist.cairo delete mode 100644 contracts/starknet/VotingStrategies/Vanilla.cairo delete mode 100644 contracts/starknet/VotingStrategies/Whitelist.cairo delete mode 160000 contracts/starknet/fossil delete mode 100644 contracts/starknet/lib/array_utils.cairo delete mode 100644 contracts/starknet/lib/choice.cairo delete mode 100644 contracts/starknet/lib/eip712.cairo delete mode 100644 contracts/starknet/lib/eth_tx.cairo delete mode 100644 contracts/starknet/lib/execute.cairo delete mode 100644 contracts/starknet/lib/general_address.cairo delete mode 100644 contracts/starknet/lib/math_utils.cairo delete mode 100644 contracts/starknet/lib/merkle.cairo delete mode 100644 contracts/starknet/lib/proposal.cairo delete mode 100644 contracts/starknet/lib/proposal_info.cairo delete mode 100644 contracts/starknet/lib/proposal_outcome.cairo delete mode 100644 contracts/starknet/lib/session_key.cairo delete mode 100644 contracts/starknet/lib/single_slot_proof.cairo delete mode 100644 contracts/starknet/lib/slot_key.cairo delete mode 100644 contracts/starknet/lib/stark_eip191.cairo delete mode 100644 contracts/starknet/lib/timestamp.cairo delete mode 100644 contracts/starknet/lib/vote.cairo delete mode 100644 contracts/starknet/lib/voting.cairo delete mode 100644 deployments/goerli1.json delete mode 100644 deployments/goerli2.json delete mode 100644 docs/images/governance_trilemma.png delete mode 100644 docs/images/offchain_architecture.png delete mode 100644 docs/images/onchain_architecture.png delete mode 100644 docs/milestones/1.md delete mode 100644 docs/milestones/2.md create mode 100644 ethereum/foundry.toml create mode 160000 ethereum/lib/forge-std create mode 160000 ethereum/lib/openzeppelin-contracts-upgradeable create mode 160000 ethereum/lib/safe-contracts create mode 160000 ethereum/lib/zodiac create mode 100644 ethereum/remappings.txt create mode 100644 ethereum/src/StarknetCommit.sol create mode 100644 ethereum/src/execution-strategies/L1AvatarExecutionStrategy.sol create mode 100644 ethereum/src/execution-strategies/SimpleQuorumExecutionStrategy.sol create mode 100644 ethereum/src/execution-strategies/StarknetSpaceManager.sol create mode 100644 ethereum/src/interfaces/IExecutionStrategy.sol create mode 100644 ethereum/src/interfaces/IStarknetCore.sol create mode 100644 ethereum/src/types.sol delete mode 100644 hardhat.config.ts delete mode 100644 requirements.txt delete mode 100755 scripts/chain-l2.sh delete mode 100755 scripts/chain.sh delete mode 100644 scripts/deployModules.ts delete mode 100644 scripts/deployTestSpace.ts delete mode 100755 scripts/test-crosschain.sh delete mode 100755 scripts/test-l2.sh create mode 100644 starknet/Scarb.toml create mode 100644 starknet/src/authenticators.cairo create mode 100644 starknet/src/authenticators/eth_sig.cairo create mode 100644 starknet/src/authenticators/eth_tx.cairo create mode 100644 starknet/src/authenticators/vanilla.cairo create mode 100644 starknet/src/execution_strategies.cairo create mode 100644 starknet/src/execution_strategies/eth_relayer.cairo create mode 100644 starknet/src/execution_strategies/simple_quorum.cairo create mode 100644 starknet/src/execution_strategies/vanilla.cairo create mode 100644 starknet/src/external.cairo create mode 100644 starknet/src/external/ownable.cairo create mode 100644 starknet/src/interfaces.cairo create mode 100644 starknet/src/interfaces/i_execution_strategy.cairo create mode 100644 starknet/src/interfaces/i_proposal_validation_strategy.cairo create mode 100644 starknet/src/interfaces/i_voting_strategy.cairo create mode 100644 starknet/src/lib.cairo create mode 100644 starknet/src/proposal_validation_strategies.cairo create mode 100644 starknet/src/proposal_validation_strategies/vanilla.cairo create mode 100644 starknet/src/space.cairo create mode 100644 starknet/src/space/space.cairo create mode 100644 starknet/src/tests.cairo create mode 100644 starknet/src/tests/mocks.cairo create mode 100644 starknet/src/tests/mocks/proposal_validation_always_fail.cairo create mode 100644 starknet/src/tests/test_space.cairo create mode 100644 starknet/src/utils.cairo create mode 100644 starknet/src/utils/bits.cairo create mode 100644 starknet/src/utils/constants.cairo create mode 100644 starknet/src/utils/math.cairo create mode 100644 starknet/src/utils/signatures.cairo create mode 100644 starknet/src/utils/single_slot_proof.cairo create mode 100644 starknet/src/utils/types.cairo create mode 100644 starknet/src/voting_strategies.cairo create mode 100644 starknet/src/voting_strategies/eth_balance_of.cairo create mode 100644 starknet/src/voting_strategies/vanilla.cairo delete mode 100644 test/crosschain/EthTxAuth.test.ts delete mode 100644 test/crosschain/EthTxSessionKeyAuth.test.ts delete mode 100644 test/crosschain/ZodiacExecution.test.ts delete mode 100644 test/data/block.json delete mode 100644 test/data/proofs.json delete mode 100644 test/ethereum/ZodiacModule.test.ts delete mode 100644 test/shared/constants.ts delete mode 100644 test/shared/ethSigUtils.ts delete mode 100644 test/shared/merkle.ts delete mode 100644 test/shared/safeUtils.ts delete mode 100644 test/shared/setup.ts delete mode 100644 test/shared/starkTypes.ts delete mode 100644 test/shared/types.ts delete mode 100644 test/starknet/ActiveProposal.test.ts delete mode 100644 test/starknet/ArrayUtils.test.ts delete mode 100644 test/starknet/ControllerActions.test.ts delete mode 100644 test/starknet/EthSigAuth.test.ts delete mode 100644 test/starknet/EthSigSessionKeyAuth.test.ts delete mode 100644 test/starknet/ExecutionStrategyWhitelist.test.ts delete mode 100644 test/starknet/MathUtils.test.ts delete mode 100644 test/starknet/MerkleProof.test.ts delete mode 100644 test/starknet/MerkleWhitelist.test.ts delete mode 100644 test/starknet/SingleSlotProof.test.ts delete mode 100644 test/starknet/Space.test.ts delete mode 100644 test/starknet/SpaceFactory.test.ts delete mode 100644 test/starknet/StarkTxAuth.test.ts delete mode 100644 test/starknet/StarknetExecution.test.ts delete mode 100644 test/starknet/StarknetSigAuth.test.ts delete mode 100644 test/starknet/VanillaVotingStrategy.test.ts delete mode 100644 test/starknet/WhitelistVotingStrategy.test.ts delete mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig deleted file mode 100755 index 48fe40a1..00000000 --- a/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = LF -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false diff --git a/.env.example b/.env.example deleted file mode 100644 index 74c5f05d..00000000 --- a/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -MNEMONIC=test test test test test test test test test test test test -REPORT_GAS=true -INFURA_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -ETHERSCAN_API_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 0187e16d..00000000 --- a/.eslintrc +++ /dev/null @@ -1,22 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": [ - "plugin:@typescript-eslint/recommended" - ], - "plugins": [ - "prettier", - "@typescript-eslint" - ], - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "rules": { - "no-console": "off", - "prettier/prettier": "error", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/camelcase": "off", - "@typescript-eslint/no-explicit-any": "off" - } -} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 0a08d197..00000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Lint -on: - push: - branches: - - develop - pull_request: -jobs: - run-linters: - name: Run Linters - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v2 - - - name: Set up node - uses: actions/setup-node@v1 - with: - node-version: 14 - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - name: Cache yarn dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - yarn- - - - name: Install yarn dependencies - run: yarn install --no-progress --non-interactive - - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - name: Install dependencies - run: | - sudo apt install -y libgmp3-dev - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Run Linters - run: yarn check-format diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..1c03bf27 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,69 @@ +name: SX-Starknet Workflow + +on: + push: + branches: + - develop + pull_request: + +jobs: + solidity: + strategy: + fail-fast: true + + name: Forge tests + runs-on: ubuntu-latest + steps: + - name: Step 1 - Check out main branch + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Step 2 - Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Step 3 - Check formatting + working-directory: ./ethereum + run: forge fmt --check + + - name: Step 4 - Build Solidity contracts + working-directory: ./ethereum + run: | + forge --version + forge build --sizes + id: build + + - name: Step 5 - Run Forge tests + working-directory: ./ethereum + run: | + forge test -vvv + id: test + + cairo: + strategy: + fail-fast: true + + name: Cairo tests + runs-on: ubuntu-latest + steps: + - name: Step 1 - Check out main branch + uses: actions/checkout@v3 + + - name: Step 2 - Install Scarb + uses: software-mansion/setup-scarb@v1 + with: + scarb-version: 0.5.1 + + - name: Step 3 - Check formatting + working-directory: ./starknet + run: scarb fmt --check + + - name: Step 4 - Build Cairo contracts + working-directory: ./starknet + run: scarb build --verbose + + - name: Step 4 - Running Cairo tests + working-directory: ./starknet + run: scarb test --verbose \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 7f1c1ff3..00000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Tests -on: - push: - branches: - - develop - pull_request: -jobs: - unit-tests: - name: Unit Tests - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v2 - -# - name: Install Fossil submodule -# run: git submodule update --init --recursive - - - name: Set up node - uses: actions/setup-node@v1 - with: - node-version: 14 - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - name: Cache yarn dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - yarn- - - name: Install yarn dependencies - run: yarn install --no-progress --non-interactive - - - name: Set up Python 3.9 - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - - name: Install dependencies - run: | - sudo apt install -y libgmp3-dev - python -m pip install --upgrade pip - pip install -r requirements.txt - - - name: Compile Contracts - run: yarn compile - - - name: Run Cross Chain Tests - run: yarn test:crosschain:ci - - - name: Run L1 tests - run: yarn test:l1 - - - name: Run L2 tests - run: yarn test:l2:ci diff --git a/.gitignore b/.gitignore index 74774f91..b4b4cec3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,13 @@ -node_modules -**/__pycache__ - -#Hardhat files -cache -artifacts -starknet-artifacts -factories -typechain -typechain-types -abi -coverage -coverage.json - -.yarn +target +node_modules/ .env +cairo_project.toml -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +cache/ +out/ -# Local deployments -deployed_contracts/local.json +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ -*.DS_Store +docs/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 042de970..6cd1da66 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,20 @@ -[submodule "contracts/starknet/fossil"] - path = contracts/starknet/fossil - url = https://github.com/OilerNetwork/fossil.git +[submodule "ethereum/lib/forge-std"] + path = ethereum/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "lib/forge-std"] + branch = v1.5.6 +[submodule "ethereum/lib/openzeppelin-contracts-upgradeable"] + path = ethereum/lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "lib/openzeppelin-contracts-upgradeable"] + branch = v4.9.1 +[submodule "ethereum/lib/zodiac"] + path = ethereum/lib/zodiac + url = https://github.com/gnosis/zodiac +[submodule "lib/zodiac"] + branch = v3.3.2 +[submodule "ethereum/lib/safe-contracts"] + path = ethereum/lib/safe-contracts + url = https://github.com/safe-global/safe-contracts +[submodule "lib/safe-contracts"] + branch = v1.4.0 diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index bc0ebee2..00000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "printWidth": 100, - "tabWidth": 2 -} diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index 3186f3f0..00000000 --- a/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 index a0bb1250..2dc061d8 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ -The MIT License (MIT) +MIT License -Copyright (c) Snapshot Labs +Copyright (c) 2023 Snapshot Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md deleted file mode 100644 index 9017cd76..00000000 --- a/README.md +++ /dev/null @@ -1,130 +0,0 @@ -[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/snapshot-labs/sx-core/master/LICENSE) - -# Snapshot X - -Programmable governance on StarkNet. Refer to the [documentation](https://docs.snapshotx.xyz) for more information. - -## Contracts Blueprint -```ml -contracts -├─ starknet -│ ├─ Authenticators -│ │ ├─ EthTx.cairo — "Authenticate user via an Ethereum transaction" -│ │ ├─ EthSig.cairo — "Authenticate user via an Ethereum signature" -│ │ ├─ EthSigSessionKey.cairo — "Authenticate user via a Session key which has been authorized with an Ethereum signature" -│ │ ├─ EthTxSessionKey.cairo — "Authenticate user via a Session key which has been authorized with an Ethereum transaction" -│ │ ├─ StarkTx.cairo — "Authenticate user via a StarkNet transaction" -│ │ ├─ StarkSig.cairo — "Authenticate user via a Starknet signature" -│ │ └─ Vanilla.cairo — "Dummy authentication" -│ ├─ VotingStrategies -│ │ ├─ EthBalanceOf.cairo — "Voting power found from Ethereum token balances" -│ │ ├─ Vanilla.cairo — "Voting power of 1 for every user" -│ │ └─ Whitelist.cairo — "Predetermined voting power for members in a whitelist, otherwise zero" -│ ├─ ExecutionStrategies -│ │ ├─ Vanilla.cairo — "Dummy execution" -│ │ └─ EthRelayer.cairo — "Strategy to execute proposal transactions on Ethereum" -│ ├─ Interfaces -│ │ ├─ IExecutionStrategy.cairo — "Interface for all execution strategies" -│ │ ├─ IVotingStrategy.cairo — "Interface for all voting strategies" -│ │ ├─ ISpaceAccount.cairo — "Interface for the space contract" -│ │ └─ ISpaceFactory.cairo — "Interface for the space factory" -│ ├─ lib -│ │ ├─ array_utils.cairo — "A library containing various array utilities" -│ │ ├─ choice.cairo — "The set of choices one can make for a vote" -│ │ ├─ eip712.cairo — "Library for Ethereum typed data signature verification" -│ │ ├─ eth_tx.cairo — "Libary for authenticating users via an Ethereum transaction" -│ │ ├─ execute.cairo — "contract call wrapper" -│ │ ├─ general_address.cairo — "Generic address type" -│ │ ├─ math_utils.cairo — "A library containing various math utilities" -│ │ ├─ proposal.cairo — "Proposal metadata type" -│ │ ├─ proposal_info.cairo — "Proposal vote data type" -│ │ ├─ proposal_outcome.cairo — "The set of proposal outcomes" -│ │ ├─ slot_key.cairo — "Library for finding EVM slot keys" -│ │ ├─ voting.cairo — "Core library that implements the logic for the space contract" -│ │ ├─ vote.cairo — "User vote data type" -│ │ ├─ session_key.cairo — "Library to handle session key logic" -│ │ ├─ stark_eip191.cairo — "Library for Starknet typed data signature verification" -│ │ ├─ single_slot_proof.cairo — "Library to enable values from the Ethereum state to be used for voting power" -│ │ └─ timestamp - "Library to handle timestamp to block number conversions within the single slot proof library" -│ ├─ SpaceAccount.cairo - "The base contract for each Snapshot X space" -│ └─ SpaceFactory.cairo - "Handles the deployment and tracking of Space contracts" -└─ ethereum - ├─ Interfaces - │ └─ IStarknetCore.sol — "Interface of the StarkNet core contract" - ├─ StarkNetCommit - │ └─ StarknetCommit.sol — "Bridge contract to enable Ethereum transaction authentication" - └─ ZodiacModule - ├─ ProposalRelayer.sol — "Provides functionality for recieving proposal data from StarkNet" - └─ SnapshotXL1Executor.sol — "Execute proposal transactions using a Gnosis Safe" -``` - -## Usage - -### Clone repository: - -```bash -git clone https://github.com/snapshot-labs/sx-core.git -git submodule update --init --recursive -``` -Note: The submodule included in the repo is the [Fossil](https://github.com/OilerNetwork/fossil) Storage Verifier - -### Install Python and Yarn requirements: - -```bash -python3.9 -m venv ~/cairo_venv -source ~/cairo_venv/bin/activate -pip3 install -r requirements.txt -yarn -``` - -### Compile all contracts: - -```bash -yarn compile -# You can also use yarn compile:l1 to just compile solidity contracts -# or yarn compile:l2 to just compile cairo contracts -``` - -### Deploy to Alpha Goerli: - -```bash -yarn deploy:goerli -``` -Will deploy an example space contract and a set of authenticators, voting strategies and execution strategies to the alpha goerli testnet. - -### Testing - -Tests are separated into three categories: - -- Ethereum tests in `tests/ethereum`: Tests for our solidity contracts -- Starknet tests in `tests/starknet`: Tests for our cairo contracts -- Cross chain tests in `tests/crosschain`: Tests that will cover interaction between solidity and cairo contracts. - -To run these tests locally: - -#### Install and run [StarkNet Devnet](https://github.com/Shard-Labs/starknet-devnet) (In a separate terminal): -```bash -yarn chain:l2 -``` - -#### Run an ethereum hardhat node (In a separate terminal) - -```bash -yarn chain:l1 -``` - -#### Run tests: -```bash -yarn test:l1 -yarn test:l2 -yarn test:crosschain -``` - -## DISCLAIMER: STILL IN DEVELOPMENT - -This project is still under heavy development. Feel free to contact us on [Discord](https://discord.snapshot.org)! - -## License - -Snapshot X contracts are open-source software licensed under the © [MIT license](LICENSE). - diff --git a/contracts/ethereum/Interfaces/IStarknetCore.sol b/contracts/ethereum/Interfaces/IStarknetCore.sol deleted file mode 100644 index 9beef216..00000000 --- a/contracts/ethereum/Interfaces/IStarknetCore.sol +++ /dev/null @@ -1,17 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.6; - -interface IStarknetCore { - function sendMessageToL2( - uint256 to_address, - uint256 selector, - uint256[] calldata payload - ) external returns (bytes32); - - function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) - external - returns (bytes32); - - function l2ToL1Messages(bytes32 msgHash) external view returns (uint256); -} diff --git a/contracts/ethereum/StarkNetCommit/StarkNetCommit.sol b/contracts/ethereum/StarkNetCommit/StarkNetCommit.sol deleted file mode 100644 index 00c46d77..00000000 --- a/contracts/ethereum/StarkNetCommit/StarkNetCommit.sol +++ /dev/null @@ -1,48 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@openzeppelin/contracts/proxy/utils/Initializable.sol'; -// import '../Interfaces/IStarknetCore.sol'; -// For testing purposes, we use a mock StarkNet messaging contract. -import 'contracts/ethereum/TestContracts/MockStarknetMessaging.sol'; - -/** - * @title StarkNet Commit Contract - * @author @Orland0x - - * @notice Allows StarkNet transactions to be committed via a transaction on L1. The contract works in combination with a corresponding authenticator contract on StarkNet. - * @dev This contract is designed to be a generic standard that that can be used by any StarkNet protocol that wants to allow interactions via an L1 transaction. - */ -contract StarkNetCommit is Initializable { - /// The StarkNet core contract. - // IStarknetCore public immutable starknetCore; - /// Using a mock here for testing purposes - MockStarknetMessaging public immutable starknetCore; - - /** - * @dev Selector for the L1 handler in the authenticator on StarkNet, found via: - * from starkware.starknet.compiler.compile import get_selector_from_name - * print(get_selector_from_name('commit')) - */ - uint256 private constant L1_COMMIT_HANDLER = - 674623595553689999852507866835294387286428733459551884504121875060358224925; - - /** - * @dev Constructor - * @param _starknetCore The StarkNet Core contract. - */ - constructor(MockStarknetMessaging _starknetCore) { - starknetCore = _starknetCore; - } - - /** - * @dev Commit a hash and the sender address to StarkNet. - * @param _hash The hash to commit - */ - function commit(uint256 starknetAuthenticator, uint256 _hash) external { - uint256[] memory payload = new uint256[](2); - payload[0] = uint256(uint160(msg.sender)); - payload[1] = _hash; - starknetCore.sendMessageToL2(starknetAuthenticator, L1_COMMIT_HANDLER, payload); - } -} diff --git a/contracts/ethereum/TestContracts/IStarknetMessaging.sol b/contracts/ethereum/TestContracts/IStarknetMessaging.sol deleted file mode 100644 index 4f72081f..00000000 --- a/contracts/ethereum/TestContracts/IStarknetMessaging.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -interface IStarknetMessaging { - event LogMessageToL1(uint256 indexed from_address, address indexed to_address, uint256[] payload); - - // An event that is raised when a message is sent from L1 to L2. - event LogMessageToL2( - address indexed from_address, - uint256 indexed to_address, - uint256 indexed selector, - uint256[] payload, - uint256 nonce - ); - - // An event that is raised when a message from L2 to L1 is consumed. - event ConsumedMessageToL1( - uint256 indexed from_address, - address indexed to_address, - uint256[] payload - ); - - // An event that is raised when a message from L1 to L2 is consumed. - event ConsumedMessageToL2( - address indexed from_address, - uint256 indexed to_address, - uint256 indexed selector, - uint256[] payload, - uint256 nonce - ); - - /** - Sends a message to an L2 contract. - Returns the hash of the message. - */ - function sendMessageToL2( - uint256 to_address, - uint256 selector, - uint256[] calldata payload - ) external returns (bytes32); - - /** - Consumes a message that was sent from an L2 contract. - Returns the hash of the message. - */ - function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) - external - returns (bytes32); -} diff --git a/contracts/ethereum/TestContracts/MockStarknetMessaging.sol b/contracts/ethereum/TestContracts/MockStarknetMessaging.sol deleted file mode 100644 index 7058db7a..00000000 --- a/contracts/ethereum/TestContracts/MockStarknetMessaging.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -import './StarknetMessaging.sol'; - -contract MockStarknetMessaging is StarknetMessaging { - /** - Mocks a message from L2 to L1. - */ - function mockSendMessageFromL2( - uint256 from_address, - uint256 to_address, - uint256[] calldata payload - ) external { - bytes32 msgHash = keccak256( - abi.encodePacked(from_address, to_address, payload.length, payload) - ); - l2ToL1Messages()[msgHash] += 1; - } - - /** - Mocks consumption of a message from L1 to L2. - */ - function mockConsumeMessageToL2( - uint256 from_address, - uint256 to_address, - uint256 selector, - uint256[] calldata payload, - uint256 nonce - ) external { - bytes32 msgHash = keccak256( - abi.encodePacked(from_address, to_address, nonce, selector, payload.length, payload) - ); - - require(l1ToL2Messages()[msgHash] > 0, 'INVALID_MESSAGE_TO_CONSUME'); - l1ToL2Messages()[msgHash] -= 1; - } -} diff --git a/contracts/ethereum/TestContracts/NamedStorage.sol b/contracts/ethereum/TestContracts/NamedStorage.sol deleted file mode 100644 index eeaaa745..00000000 --- a/contracts/ethereum/TestContracts/NamedStorage.sol +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -/* - Library to provide basic storage, in storage location out of the low linear address space. - New types of storage variables should be added here upon need. -*/ -library NamedStorage { - function bytes32ToUint256Mapping(string memory tag_) - internal - pure - returns (mapping(bytes32 => uint256) storage randomVariable) - { - bytes32 location = keccak256(abi.encodePacked(tag_)); - assembly { - randomVariable.slot := location - } - } - - function bytes32ToAddressMapping(string memory tag_) - internal - pure - returns (mapping(bytes32 => address) storage randomVariable) - { - bytes32 location = keccak256(abi.encodePacked(tag_)); - assembly { - randomVariable.slot := location - } - } - - function addressToBoolMapping(string memory tag_) - internal - pure - returns (mapping(address => bool) storage randomVariable) - { - bytes32 location = keccak256(abi.encodePacked(tag_)); - assembly { - randomVariable.slot := location - } - } - - function getUintValue(string memory tag_) internal view returns (uint256 retVal) { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - retVal := sload(slot) - } - } - - function setUintValue(string memory tag_, uint256 value) internal { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - sstore(slot, value) - } - } - - function setUintValueOnce(string memory tag_, uint256 value) internal { - require(getUintValue(tag_) == 0, 'ALREADY_SET'); - setUintValue(tag_, value); - } - - function getAddressValue(string memory tag_) internal view returns (address retVal) { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - retVal := sload(slot) - } - } - - function setAddressValue(string memory tag_, address value) internal { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - sstore(slot, value) - } - } - - function setAddressValueOnce(string memory tag_, address value) internal { - require(getAddressValue(tag_) == address(0x0), 'ALREADY_SET'); - setAddressValue(tag_, value); - } - - function getBoolValue(string memory tag_) internal view returns (bool retVal) { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - retVal := sload(slot) - } - } - - function setBoolValue(string memory tag_, bool value) internal { - bytes32 slot = keccak256(abi.encodePacked(tag_)); - assembly { - sstore(slot, value) - } - } -} diff --git a/contracts/ethereum/TestContracts/StarknetMessaging.sol b/contracts/ethereum/TestContracts/StarknetMessaging.sol deleted file mode 100644 index b3b58bd0..00000000 --- a/contracts/ethereum/TestContracts/StarknetMessaging.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0. -pragma solidity ^0.8.6; - -import './IStarknetMessaging.sol'; -import './NamedStorage.sol'; - -/** - Implements sending messages to L2 by adding them to a pipe and consuming messages from L2 by - removing them from a different pipe. A deriving contract can handle the former pipe and add items - to the latter pipe while interacting with L2. -*/ -contract StarknetMessaging is IStarknetMessaging { - /** - Random slot storage elements and accessors. - */ - string constant L1L2_MESSAGE_MAP_TAG = 'STARKNET_1.0_MSGING_L1TOL2_MAPPPING_V2'; - string constant L2L1_MESSAGE_MAP_TAG = 'STARKNET_1.0_MSGING_L2TOL1_MAPPPING'; - - string constant L1L2_MESSAGE_NONCE_TAG = 'STARKNET_1.0_MSGING_L1TOL2_NONCE'; - - function l1ToL2Messages(bytes32 msgHash) external view returns (uint256) { - return l1ToL2Messages()[msgHash]; - } - - function l2ToL1Messages(bytes32 msgHash) external view returns (uint256) { - return l2ToL1Messages()[msgHash]; - } - - function l1ToL2Messages() internal pure returns (mapping(bytes32 => uint256) storage) { - return NamedStorage.bytes32ToUint256Mapping(L1L2_MESSAGE_MAP_TAG); - } - - function l2ToL1Messages() internal pure returns (mapping(bytes32 => uint256) storage) { - return NamedStorage.bytes32ToUint256Mapping(L2L1_MESSAGE_MAP_TAG); - } - - function l1ToL2MessageNonce() public view returns (uint256) { - return NamedStorage.getUintValue(L1L2_MESSAGE_NONCE_TAG); - } - - /** - Sends a message to an L2 contract. - */ - function sendMessageToL2( - uint256 to_address, - uint256 selector, - uint256[] calldata payload - ) external override returns (bytes32) { - uint256 nonce = l1ToL2MessageNonce(); - NamedStorage.setUintValue(L1L2_MESSAGE_NONCE_TAG, nonce + 1); - emit LogMessageToL2(msg.sender, to_address, selector, payload, nonce); - bytes32 msgHash = keccak256( - abi.encodePacked( - uint256(uint160(address(msg.sender))), - to_address, - nonce, - selector, - payload.length, - payload - ) - ); - l1ToL2Messages()[msgHash] += 1; - - return msgHash; - } - - /** - Consumes a message that was sent from an L2 contract. - Returns the hash of the message. - */ - function consumeMessageFromL2(uint256 from_address, uint256[] calldata payload) - external - override - returns (bytes32) - { - bytes32 msgHash = keccak256( - abi.encodePacked(from_address, uint256(uint160(address(msg.sender))), payload.length, payload) - ); - - require(l2ToL1Messages()[msgHash] > 0, 'INVALID_MESSAGE_TO_CONSUME'); - emit ConsumedMessageToL1(from_address, msg.sender, payload); - l2ToL1Messages()[msgHash] -= 1; - return msgHash; - } -} diff --git a/contracts/ethereum/ZodiacModule/ProposalRelayer.sol b/contracts/ethereum/ZodiacModule/ProposalRelayer.sol deleted file mode 100644 index ebbb0977..00000000 --- a/contracts/ethereum/ZodiacModule/ProposalRelayer.sol +++ /dev/null @@ -1,79 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@gnosis.pm/zodiac/contracts/guard/Guardable.sol'; -// import '../Interfaces/IStarknetCore.sol'; - -import 'contracts/ethereum/TestContracts/MockStarknetMessaging.sol'; - -/** - * @title Snapshot X L1 Proposal Relayer - * @author @Orland0x - - * @dev Work in progress - */ -contract SnapshotXProposalRelayer is Guardable { - /// The StarkNet Core contract - // IStarknetCore public starknetCore; - - MockStarknetMessaging public starknetCore; - - /// Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message - uint256 public l2ExecutionRelayer; - - /** - * @dev Emitted when the StarkNet execution relayer contract is changed - * @param _l2ExecutionRelayer The new execution relayer contract - */ - event ChangedL2ExecutionRelayer(uint256 _l2ExecutionRelayer); - - // /** - // * @dev Initialization of the functionality. Called internally by the setUp function - // * @param _starknetCore Address of the StarkNet Core contract - // * @param _l2ExecutionRelayer Address of the new execution relayer contract - // */ - // function setUpSnapshotXProposalRelayer(address _starknetCore, uint256 _l2ExecutionRelayer) - // internal - // { - // starknetCore = IStarknetCore(_starknetCore); - // l2ExecutionRelayer = _l2ExecutionRelayer; - // } - - function setUpSnapshotXProposalRelayer(address _starknetCore, uint256 _l2ExecutionRelayer) - internal - { - starknetCore = MockStarknetMessaging(_starknetCore); - l2ExecutionRelayer = _l2ExecutionRelayer; - } - - /** - * @dev Changes the StarkNet execution relayer contract - * @param _l2ExecutionRelayer Address of the new execution relayer contract - */ - function changeL2ExecutionRelayer(uint256 _l2ExecutionRelayer) public onlyOwner { - l2ExecutionRelayer = _l2ExecutionRelayer; - emit ChangedL2ExecutionRelayer(_l2ExecutionRelayer); - } - - /** - * @dev Receives L2 -> L1 message containing proposal execution details - * @param executionHashLow Lowest 128 bits of the hash of all the transactions in the proposal - * @param executionHashHigh Highest 128 bits of the hash of all the transactions in the proposal - * @param proposalOutcome Whether the proposal has been accepted / rejected / cancelled - */ - function _receiveFinalizedProposal( - uint256 callerAddress, - uint256 proposalOutcome, - uint256 executionHashLow, - uint256 executionHashHigh - ) internal { - uint256[] memory payload = new uint256[](4); - payload[0] = callerAddress; - payload[1] = proposalOutcome; - payload[2] = executionHashLow; - payload[3] = executionHashHigh; - - /// Returns the message Hash. If proposal execution message did not exist/not received yet, then this will fail - starknetCore.consumeMessageFromL2(l2ExecutionRelayer, payload); - } -} diff --git a/contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol b/contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol deleted file mode 100644 index a393157d..00000000 --- a/contracts/ethereum/ZodiacModule/SnapshotXL1Executor.sol +++ /dev/null @@ -1,409 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@gnosis.pm/zodiac/contracts/core/Module.sol'; -import './ProposalRelayer.sol'; - -/** - * @title Snapshot X L1 execution Zodiac module - * @author @Orland0x - - * @notice Trustless L1 execution of Snapshot X decisions via a Gnosis Safe - * @dev Work in progress - */ -contract SnapshotXL1Executor is Module, SnapshotXProposalRelayer { - /// @dev keccak256("EIP712Domain(uint256 chainId,address verifyingContract)"); - bytes32 public constant DOMAIN_SEPARATOR_TYPEHASH = - 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218; - - /// @dev keccak256("Transaction(address to,uint256 value,bytes data,uint8 operation,uint256 nonce)"); - bytes32 public constant TRANSACTION_TYPEHASH = - 0x72e9670a7ee00f5fbf1049b8c38e3f22fab7e9b85029e85cf9412f17fdd5c2ad; - - /// Counter that is incremented each time a proposal is received. - uint256 public proposalIndex; - - /// Mapping of whitelisted contracts (addresses should be L2 space contracts) - mapping(uint256 => bool) public whitelistedSpaces; - - /// The state of a proposal index exists in one of the 5 categories. This can be queried using the getProposalState view function - enum ProposalState { - NotReceived, - Executing, - Executed, - Cancelled - } - - /// Stores the execution details and execution progress of each proposal received - struct ProposalExecution { - // array of Transaction Hashes for each transaction in the proposal - bytes32[] txHashes; - // counter which stores the index of the next transaction in the proposal that should be executed - uint256 executionCounter; - // whether the proposal has been cancelled. Required to fully define the proposal state as a function of this struct - bool cancelled; - } - - /// Map of proposal index to the corresponding proposal execution struct - mapping(uint256 => ProposalExecution) public proposalIndexToProposalExecution; - - /* EVENTS */ - - /** - * @dev Emitted when a new module proxy instance has been deployed - * @param initiator Address of contract deployer - * @param _owner Address of the owner of this contract - * @param _avatar Address that will ultimately execute function calls - * @param _target Address that this contract will pass transactions to - * @param _l2ExecutionRelayer Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message - * @param _starknetCore Address of the StarkNet Core contract - */ - event SnapshotXL1ExecutorSetUpComplete( - address indexed initiator, - address indexed _owner, - address indexed _avatar, - address _target, - uint256 _l2ExecutionRelayer, - address _starknetCore - ); - - /** - * @dev Emitted when a new proposal is received from StarkNet - * @param proposalIndex Index of proposal - */ - event ProposalReceived(uint256 proposalIndex); - - /** - * @dev Emitted when a Transaction in a proposal is executed. - * @param proposalIndex Index of proposal - * @param txHash The transaction hash - * @notice Could remove to save some gas and only emit event when all txs are executed - */ - event TransactionExecuted(uint256 proposalIndex, bytes32 txHash); - - /** - * @dev Emitted when all transactions in a proposal have been executed - * @param proposalIndex Index of proposal - */ - event ProposalExecuted(uint256 proposalIndex); - - /** - * @dev Emitted when a proposal get cancelled - * @param proposalIndex Index of proposal - */ - event ProposalCancelled(uint256 proposalIndex); - - /* Constructor */ - - /** - * @dev Constructs the master contract - * @param _owner Address of the owner of this contract - * @param _avatar Address that will ultimately execute function calls - * @param _target Address that this contract will pass transactions to - * @param _starknetCore Address of the StarkNet Core contract - * @param _l2ExecutionRelayer Address of the StarkNet contract that will send execution details to this contract in a L2 -> L1 message - * @param _l2SpacesToWhitelist Array of spaces deployed on L2 that are allowed to interact with this contract - */ - constructor( - address _owner, - address _avatar, - address _target, - address _starknetCore, - uint256 _l2ExecutionRelayer, - uint256[] memory _l2SpacesToWhitelist - ) { - bytes memory initParams = abi.encode( - _owner, - _avatar, - _target, - _starknetCore, - _l2ExecutionRelayer, - _l2SpacesToWhitelist - ); - setUp(initParams); - } - - /** - * @dev Proxy constructor - * @param initParams Initialization parameters - */ - function setUp(bytes memory initParams) public override initializer { - ( - address _owner, - address _avatar, - address _target, - address _starknetCore, - uint256 _l2ExecutionRelayer, - uint256[] memory _l2SpacesToWhitelist - ) = abi.decode(initParams, (address, address, address, address, uint256, uint256[])); - __Ownable_init(); - transferOwnership(_owner); - avatar = _avatar; - target = _target; - setUpSnapshotXProposalRelayer(_starknetCore, _l2ExecutionRelayer); - - for (uint256 i = 0; i < _l2SpacesToWhitelist.length; i++) { - whitelistedSpaces[_l2SpacesToWhitelist[i]] = true; - } - - emit SnapshotXL1ExecutorSetUpComplete( - msg.sender, - _owner, - _avatar, - _target, - _l2ExecutionRelayer, - _starknetCore - ); - } - - /* External */ - - /** - * @dev Updates the list of accepted spaces on l2. Only callable by the `owner`. - * @param toAdd List of addresses to add to the whitelist. - * @param toRemove List of addressess to remove from the whitelist. - */ - function editWhitelist(uint256[] memory toAdd, uint256[] calldata toRemove) external onlyOwner { - // Add the requested entries - for (uint256 i = 0; i < toAdd.length; i++) { - whitelistedSpaces[toAdd[i]] = true; - } - - // Remove the requested entries - for (uint256 i = 0; i < toRemove.length; i++) { - whitelistedSpaces[toRemove[i]] = false; - } - } - - /** - * @dev Initializes a new proposal execution struct on the receival of a completed proposal from StarkNet - * @param callerAddress The StarkNet space address which contained the proposal - * @param proposalOutcome Whether the proposal was accepted / rejected / cancelled - * @param executionHashLow Lowest 128 bits of the hash of all the transactions in the proposal - * @param executionHashHigh Highest 128 bits of the hash of all the transactions in the proposal - * @param _txHashes Array of transaction hashes in proposal - */ - function receiveProposal( - uint256 callerAddress, - uint256 proposalOutcome, - uint256 executionHashLow, - uint256 executionHashHigh, - bytes32[] memory _txHashes - ) external { - require(proposalOutcome != 0, 'Proposal did not pass'); - require(_txHashes.length > 0, 'proposal must contain transactions'); - require(whitelistedSpaces[callerAddress] == true, 'Invalid caller'); - - // Call to the StarkNet core contract will fail if finalized proposal message was not received on L1. - _receiveFinalizedProposal(callerAddress, proposalOutcome, executionHashLow, executionHashHigh); - - // Re-assemble the lowest and highest bytes to get the full execution hash - uint256 executionHash = (executionHashHigh << 128) + executionHashLow; - require(bytes32(executionHash) == keccak256(abi.encode(_txHashes)), 'Invalid execution'); - - proposalIndexToProposalExecution[proposalIndex].txHashes = _txHashes; - proposalIndex++; - emit ProposalReceived(proposalIndex); - } - - /** - * @dev Initializes a new proposal execution struct (To test execution without actually receiving message) - * @param executionHash Hash of all the transactions in the proposal - * @param proposalOutcome Whether proposal was accepted / rejected / cancelled - * @param _txHashes Array of transaction hashes in proposal - * @notice TODO: REMEMBER TO REMOVE BEFORE PROD - */ - function receiveProposalTest( - uint256 callerAddress, - uint256 executionHash, - uint256 proposalOutcome, - bytes32[] memory _txHashes - ) external { - require(callerAddress != 0); - require(proposalOutcome == 1, 'Proposal did not pass'); - require(_txHashes.length > 0, 'proposal must contain transactions'); - require(bytes32(executionHash) == keccak256(abi.encode(_txHashes)), 'Invalid execution'); - proposalIndexToProposalExecution[proposalIndex].txHashes = _txHashes; - proposalIndex++; - emit ProposalReceived(proposalIndex); - } - - /** - * @dev Cancels a set of proposals - * @param _proposalIndexes Array of proposal indexes that should be cancelled - */ - function cancelProposals(uint256[] memory _proposalIndexes) external onlyOwner { - for (uint256 i = 0; i < _proposalIndexes.length; i++) { - require( - getProposalState(_proposalIndexes[i]) != ProposalState.NotReceived, - 'Proposal not received, nothing to cancel' - ); - require( - getProposalState(_proposalIndexes[i]) != ProposalState.Executed, - 'Execution completed, nothing to cancel' - ); - require( - proposalIndexToProposalExecution[_proposalIndexes[i]].cancelled == false, - 'proposal is already cancelled' - ); - // To cancel a proposal, we can set the execution counter for the proposal to the number of transactions in the proposal. - // We must also set a boolean in the Proposal Execution struct to true, without this there would be no way for the state to differentiate between a cancelled and an executed proposal. - // proposalIndexToProposalExecution[_proposalIndexes[i]] - // .executionCounter = proposalIndexToProposalExecution[_proposalIndexes[i]].txHashes.length; - proposalIndexToProposalExecution[_proposalIndexes[i]].cancelled = true; - emit ProposalCancelled(_proposalIndexes[i]); - } - } - - /** - * @dev Executes a single transaction in a proposal - * @param _proposalIndex Index of proposal - * @param to the contract to be called by the avatar - * @param value ether value to pass with the call - * @param data the data to be executed from the call - * @param operation Call or DelegateCall indicator - */ - function executeProposalTx( - uint256 _proposalIndex, - address to, - uint256 value, - bytes memory data, - Enum.Operation operation - ) public { - require( - getProposalState(_proposalIndex) == ProposalState.Executing, - 'Proposal is not in executing state' - ); - bytes32 txHash = getTransactionHash(to, value, data, operation); - require( - proposalIndexToProposalExecution[_proposalIndex].txHashes[ - proposalIndexToProposalExecution[_proposalIndex].executionCounter - ] == txHash, - 'Invalid transaction or invalid transaction order' - ); - proposalIndexToProposalExecution[_proposalIndex].executionCounter++; - require(exec(to, value, data, operation), 'Module transaction failed'); - emit TransactionExecuted(_proposalIndex, txHash); - if (getProposalState(_proposalIndex) == ProposalState.Executed) { - emit ProposalExecuted(_proposalIndex); - } - } - - /** - * @dev Wrapper function around executeProposalTx that will execute all transactions in a proposal - * @param _proposalIndex Index of proposal - * @param tos Array of contracts to be called by the avatar - * @param values Array of ether values to pass with the calls - * @param data Array of data to be executed from the calls - * @param operations Array of Call or DelegateCall indicators - */ - function executeProposalTxBatch( - uint256 _proposalIndex, - address[] memory tos, - uint256[] memory values, - bytes[] memory data, - Enum.Operation[] memory operations - ) external { - for (uint256 i = 0; i < tos.length; i++) { - executeProposalTx(_proposalIndex, tos[i], values[i], data[i], operations[i]); - } - } - - /* VIEW FUNCTIONS */ - - /** - * @dev Returns state of proposal - * @param _proposalIndex Index of proposal - */ - function getProposalState(uint256 _proposalIndex) public view returns (ProposalState) { - ProposalExecution storage proposalExecution = proposalIndexToProposalExecution[_proposalIndex]; - if (proposalExecution.txHashes.length == 0) { - return ProposalState.NotReceived; - } else if (proposalExecution.cancelled) { - return ProposalState.Cancelled; - } else if (proposalExecution.txHashes.length == proposalExecution.executionCounter) { - return ProposalState.Executed; - } else { - return ProposalState.Executing; - } - } - - /** - * @dev Gets number of transactions in a proposal - * @param _proposalIndex Index of proposal - * @return numTx Number of transactions in the proposal - */ - function getNumOfTxInProposal(uint256 _proposalIndex) public view returns (uint256 numTx) { - require(_proposalIndex < proposalIndex, 'Invalid Proposal Index'); - return proposalIndexToProposalExecution[_proposalIndex].txHashes.length; - } - - /** - * @dev Gets hash of transaction in a proposal - * @param _proposalIndex Index of proposal - * @param txIndex Index of transaction in proposal - * @param txHash Transaction Hash - */ - function getTxHash(uint256 _proposalIndex, uint256 txIndex) public view returns (bytes32 txHash) { - require(_proposalIndex < proposalIndex, 'Invalid Proposal Index'); - require(txIndex < proposalIndexToProposalExecution[_proposalIndex].txHashes.length); - return proposalIndexToProposalExecution[_proposalIndex].txHashes[txIndex]; - } - - /** - * @dev Gets whether transaction has been executed - * @param _proposalIndex Index of proposal - * @param txIndex Index of transaction in proposal - * @param isExecuted Is transaction executed - */ - function isTxExecuted(uint256 _proposalIndex, uint256 txIndex) - public - view - returns (bool isExecuted) - { - require(_proposalIndex < proposalIndex, 'Invalid Proposal Index'); - require(txIndex < proposalIndexToProposalExecution[_proposalIndex].txHashes.length); - return proposalIndexToProposalExecution[_proposalIndex].executionCounter > txIndex; - } - - /** - * @dev Generates the data for the module transaction hash (required for signing) - * @param to the contract to be called by the avatar - * @param value ether value to pass with the call - * @param data the data to be executed from the call - * @param operation Call or DelegateCall indicator - * @return txHashData Transaction hash data - */ - function generateTransactionHashData( - address to, - uint256 value, - bytes memory data, - Enum.Operation operation, - uint256 nonce - ) public view returns (bytes memory txHashData) { - uint256 chainId = block.chainid; - bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, chainId, this)); - bytes32 transactionHash = keccak256( - abi.encode(TRANSACTION_TYPEHASH, to, value, keccak256(data), operation, nonce) - ); - return abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator, transactionHash); - } - - /** - * @dev Generates transaction hash - * @param to the contract to be called by the avatar - * @param value ether value to pass with the call - * @param data the data to be executed from the call - * @param operation Call or DelegateCall indicator - * @return txHash Transaction hash - */ - function getTransactionHash( - address to, - uint256 value, - bytes memory data, - Enum.Operation operation - ) public view returns (bytes32 txHash) { - // No nonce is required here because we prevent tx replays via the execution counter - return keccak256(generateTransactionHashData(to, value, data, operation, 0)); - } -} diff --git a/contracts/ethereum/ZodiacModule/deps.sol b/contracts/ethereum/ZodiacModule/deps.sol deleted file mode 100644 index df9e7557..00000000 --- a/contracts/ethereum/ZodiacModule/deps.sol +++ /dev/null @@ -1,9 +0,0 @@ -/// SPDX-License-Identifier: MIT - -pragma solidity 0.8.9; - -import '@gnosis.pm/safe-contracts/contracts/GnosisSafeL2.sol'; -import '@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol'; -import '@gnosis.pm/zodiac/contracts/factory/ModuleProxyFactory.sol'; -import '@gnosis.pm/zodiac/contracts/guard/Guardable.sol'; -import '@gnosis.pm/zodiac/contracts/core/Module.sol'; diff --git a/contracts/starknet/Authenticators/EthSig.cairo b/contracts/starknet/Authenticators/EthSig.cairo deleted file mode 100644 index 304b18ff..00000000 --- a/contracts/starknet/Authenticators/EthSig.cairo +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_secp.signature import verify_eth_signature_uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.cairo_keccak.keccak import ( - keccak_add_uint256s, - keccak_bigend, - finalize_keccak, -) - -from contracts.starknet.lib.eip712 import EIP712 -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.math_utils import MathUtils - -// -// @title Ethereum Signature Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via an Ethereum signature -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Authentication of an action (vote or propose) via an Ethereum signature -// @param r Signature parameter -// @param s Signature parameter -// @param v Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, bitwise_ptr: BitwiseBuiltin* -}( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, -) -> () { - if (function_selector == PROPOSAL_SELECTOR) { - EIP712.verify_propose_sig(r, s, v, salt, target, calldata_len, calldata); - } else { - if (function_selector == VOTE_SELECTOR) { - EIP712.verify_vote_sig(r, s, v, salt, target, calldata_len, calldata); - } else { - // Invalid selector - return (); - } - } - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/Authenticators/EthSigSessionKey.cairo b/contracts/starknet/Authenticators/EthSigSessionKey.cairo deleted file mode 100644 index 2034e8c7..00000000 --- a/contracts/starknet/Authenticators/EthSigSessionKey.cairo +++ /dev/null @@ -1,140 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_keccak.keccak import ( - keccak_add_uint256s, - keccak_bigend, - finalize_keccak, -) - -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.eip712 import EIP712 -from contracts.starknet.lib.stark_eip191 import StarkEIP191 -from contracts.starknet.lib.session_key import SessionKey - -// -// @title Session key Authenticator with Ethereum Signature Authorization -// @author SnapshotLabs -// @notice Contract to allow authentication with a session key that can be authorized and revoked with an Ethereum signature -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Authentication of an action (vote or propose) via a StarkNet session key signature -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -// @param session_public_key The StarkNet session public key that was used to generate the signature -@external -func authenticate{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}( - r: felt, - s: felt, - salt: felt, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, - session_public_key: felt, -) { - let eth_address = calldata[0]; - SessionKey.assert_valid(session_public_key, eth_address); - - // Check signature with session key - if (function_selector == PROPOSAL_SELECTOR) { - StarkEIP191.verify_propose_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - if (function_selector == VOTE_SELECTOR) { - StarkEIP191.verify_vote_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - // Invalid selector - return (); - } - } - execute(target, function_selector, calldata_len, calldata); - return (); -} - -// @dev Registers a session key via authorization from an Ethereum signature -// @param r Signature parameter -// @param s Signature parameter -// @param v Signature parameter -// @param salt Signature salt -// @param eth_address Owner's Ethereum Address that was used to create the signature -// @param session_public_key The StarkNet session public key that should be registered -// @param session_duration The number of seconds that the session key is valid -@external -func authorizeSessionKeyWithSig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, -}( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - eth_address: felt, - session_public_key: felt, - session_duration: felt, -) { - SessionKey.authorize_with_sig(r, s, v, salt, eth_address, session_public_key, session_duration); - return (); -} - -// @dev Revokes a session key via authorization from a signature from the session key itself -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithSessionKeySig{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}(r: felt, s: felt, salt: felt, session_public_key: felt) { - SessionKey.revoke_with_session_key_sig(r, s, salt, session_public_key); - return (); -} - -// @dev Revokes a session key via authorization from a signature from the owner Ethereum account -// @param r Signature parameter -// @param s Signature parameter -// @param v Signature parameter -// @param salt Signature salt -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithOwnerSig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - ecdsa_ptr: SignatureBuiltin*, -}(r: Uint256, s: Uint256, v: felt, salt: Uint256, session_public_key: felt) { - SessionKey.revoke_with_owner_sig(r, s, v, salt, session_public_key); - return (); -} - -// @dev Returns owner of a session key if it exists, otherwise throws -// @param session_public_key The StarkNet session public key -// @return owner The owner Ethereum address -@view -func getSessionKeyOwner{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) -> (eth_address: felt) { - let (eth_address) = SessionKey.get_owner(session_public_key); - return (eth_address,); -} diff --git a/contracts/starknet/Authenticators/EthTx.cairo b/contracts/starknet/Authenticators/EthTx.cairo deleted file mode 100644 index 631d4ca6..00000000 --- a/contracts/starknet/Authenticators/EthTx.cairo +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.memcpy import memcpy - -from contracts.starknet.lib.array_utils import ArrayUtils -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.eth_tx import EthTx - -// -// @title Ethereum Transaction Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via an Ethereum transaction -// - -// @dev Constructor -// @param starknet_commit_address Address of the StarkNet Commit Ethereum contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - starknet_commit_address: felt -) { - EthTx.initializer(starknet_commit_address); - return (); -} - -// @dev Authentication of an action (vote or propose) via an Ethereum transaction -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) { - alloc_locals; - // Cast arguments to single array and hash them - let (input_array: felt*) = alloc(); - assert input_array[0] = target; - assert input_array[1] = function_selector; - memcpy(input_array + 2, calldata, calldata_len); - let (hash) = ArrayUtils.hash(calldata_len + 2, input_array); - - // Checks that hash matches a commit and that the commit was created by the correct address - let address = calldata[0]; - EthTx.consume_commit(hash, address); - - // Execute the function call with calldata supplied. - execute(target, function_selector, calldata_len, calldata); - return (); -} - -// @dev L1 handler that receives hash from StarkNet Commit contract and stores it in state -// @param from_address Origin contract address of the L1 message -// @param sender_address Address of user that initiated the L1 message transaction -// @param hash The commit payload -@l1_handler -func commit{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - from_address: felt, sender_address: felt, hash: felt -) { - EthTx.commit(from_address, sender_address, hash); - return (); -} diff --git a/contracts/starknet/Authenticators/EthTxSessionKey.cairo b/contracts/starknet/Authenticators/EthTxSessionKey.cairo deleted file mode 100644 index d8320826..00000000 --- a/contracts/starknet/Authenticators/EthTxSessionKey.cairo +++ /dev/null @@ -1,137 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin - -from contracts.starknet.lib.execute import execute -from contracts.starknet.lib.eth_tx import EthTx -from contracts.starknet.lib.session_key import SessionKey -from contracts.starknet.lib.stark_eip191 import StarkEIP191 - -// -// @title Session key Authenticator with Ethereum Transaction Authorization -// @author SnapshotLabs -// @notice Contract to allow authentication with a session key that can be authorized and revoked with an Ethereum transaction -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Constructor -// @param starknet_commit_address Address of the StarkNet Commit Ethereum contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - starknet_commit_address: felt -) { - EthTx.initializer(starknet_commit_address); - return (); -} - -// @dev Authentication of an action (vote or propose) via an StarkNet session key signature -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -// @param session_public_key The StarkNet session public key that was used to generate the signature -@external -func authenticate{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}( - r: felt, - s: felt, - salt: felt, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, - session_public_key: felt, -) { - let eth_address = calldata[0]; - SessionKey.assert_valid(session_public_key, eth_address); - - // Check signature with session key - if (function_selector == PROPOSAL_SELECTOR) { - StarkEIP191.verify_propose_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - if (function_selector == VOTE_SELECTOR) { - StarkEIP191.verify_vote_sig( - r, s, salt, target, calldata_len, calldata, session_public_key - ); - } else { - // Invalid selector - return (); - } - } - - // Call the contract - execute(target, function_selector, calldata_len, calldata); - - return (); -} - -// @dev Registers a session key via authorization from an Ethereum transaction -// @note Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propogated to L2 before calling this function -// @param eth_address Owner's Ethereum Address that was used to commit the hash on Ethereum -// @param session_public_key The StarkNet session public key that should be registered -// @param session_duration The number of seconds that the session key is valid -@external -func authorizeSessionKeyWithTx{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - eth_address: felt, session_public_key: felt, session_duration: felt -) { - SessionKey.authorize_with_tx(eth_address, session_public_key, session_duration); - return (); -} - -// @dev Revokes a session key via authorization from a signature from the session key itself -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithSessionKeySig{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, ecdsa_ptr: SignatureBuiltin* -}(r: felt, s: felt, salt: felt, session_public_key: felt) { - SessionKey.revoke_with_session_key_sig(r, s, salt, session_public_key); - return (); -} - -// @dev Revokes a session key via authorization from an Ethereum transaction by the owner -// @dev Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propagated to L2 before calling this function -// @param session_public_key The StarkNet session public key that should be revoked -@external -func revokeSessionKeyWithOwnerTx{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) { - SessionKey.revoke_with_owner_tx(session_public_key); - return (); -} - -// @dev Returns owner of a session key if it exists, otherwise throws -// @param session_public_key The StarkNet session public key -// @return owner The owner Ethereum address -@view -func getSessionKeyOwner{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) -> (eth_address: felt) { - let (eth_address) = SessionKey.get_owner(session_public_key); - return (eth_address,); -} - -// @dev L1 handler that receives hash from StarkNet Commit contract and stores it in state -// @param from_address Origin contract address of the L1 message -// @param sender_address Address of user that initiated the L1 message transaction -// @param hash The commit payload -@l1_handler -func commit{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - from_address: felt, sender_address: felt, hash: felt -) { - EthTx.commit(from_address, sender_address, hash); - return (); -} diff --git a/contracts/starknet/Authenticators/StarkSig.cairo b/contracts/starknet/Authenticators/StarkSig.cairo deleted file mode 100644 index 852c6d06..00000000 --- a/contracts/starknet/Authenticators/StarkSig.cairo +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin - -from contracts.starknet.lib.stark_eip191 import StarkEIP191 -from contracts.starknet.lib.execute import execute - -// -// @title StarkNet Signature Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via a StarkNet signature -// - -// getSelectorFromName("propose") -const PROPOSAL_SELECTOR = 0x1bfd596ae442867ef71ca523061610682af8b00fc2738329422f4ad8d220b81; -// getSelectorFromName("vote") -const VOTE_SELECTOR = 0x132bdf85fc8aa10ac3c22f02317f8f53d4b4f52235ed1eabb3a4cbbe08b5c41; - -// @dev Authentication of an action (vote or propose) via a StarkNet signature -// @param r Signature parameter -// @param s Signature parameter -// @param salt Signature salt -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{ - syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin* -}( - r: felt, - s: felt, - salt: felt, - target: felt, - function_selector: felt, - calldata_len: felt, - calldata: felt*, -) -> () { - // The public key of the voter or proposer is stored at the start of the calldata array - let public_key = calldata[0]; - - if (function_selector == PROPOSAL_SELECTOR) { - StarkEIP191.verify_propose_sig(r, s, salt, target, calldata_len, calldata, public_key); - } else { - if (function_selector == VOTE_SELECTOR) { - StarkEIP191.verify_vote_sig(r, s, salt, target, calldata_len, calldata, public_key); - } else { - // Invalid selector - return (); - } - } - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/Authenticators/StarkTx.cairo b/contracts/starknet/Authenticators/StarkTx.cairo deleted file mode 100644 index a4e76fdf..00000000 --- a/contracts/starknet/Authenticators/StarkTx.cairo +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address - -from contracts.starknet.lib.execute import execute - -// -// @title StarkNet Transaction Authenticator -// @author SnapshotLabs -// @notice Contract to allow authentication of Snapshot X users via a StarkNet transaction -// - -// @dev Authentication of an action (vote or propose) via a StarkNet transaction -// @param target Address of the space contract -// @param function_selector Function selector of the action -// @param calldata Calldata array required for the action -@external -func authenticate{syscall_ptr: felt*, range_check_ptr}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) -> () { - let (caller_address) = get_caller_address(); - with_attr error_message("Incorrect caller") { - assert caller_address = calldata[0]; - } - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/Authenticators/Vanilla.cairo b/contracts/starknet/Authenticators/Vanilla.cairo deleted file mode 100644 index e4ebe72b..00000000 --- a/contracts/starknet/Authenticators/Vanilla.cairo +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from contracts.starknet.lib.execute import execute - -// -// @title Vanilla Authenticator -// @author SnapshotLabs -// @notice Contract to allow bypassing of authentication for Snapshot X users -// - -@external -func authenticate{syscall_ptr: felt*, range_check_ptr}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) -> () { - execute(target, function_selector, calldata_len, calldata); - return (); -} diff --git a/contracts/starknet/ExecutionStrategies/EthRelayer.cairo b/contracts/starknet/ExecutionStrategies/EthRelayer.cairo deleted file mode 100644 index d51ed019..00000000 --- a/contracts/starknet/ExecutionStrategies/EthRelayer.cairo +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.alloc import alloc -from starkware.starknet.common.messages import send_message_to_l1 - -// -// @title Ethereum Relayer Execution Strategy -// @author SnapshotLabs -// @notice Contract to allow executing proposal transactions on Ethereum mainnet -// - -// @dev Relays an execution hash to Ethereum after a proposal is finalized or cancelled -// @param proposal_outcome The outcome of a proposal -// @param execution_params The array of execution parameters -@external -func execute{syscall_ptr: felt*}( - proposal_outcome: felt, execution_params_len: felt, execution_params: felt* -) { - alloc_locals; - // NOTE: This function can be called by anyone so it is important that the destination contract checks that caller_address is the correct space contract - let (caller_address) = get_caller_address(); - - with_attr error_message("EthRelayer: Invalid execution param array") { - assert execution_params_len = 3; - } - let l1_destination_address = execution_params[0]; - let execution_hash_low = execution_params[1]; - let execution_hash_high = execution_params[2]; - - // Create the payload - let (message_payload: felt*) = alloc(); - assert message_payload[0] = caller_address; - assert message_payload[1] = proposal_outcome; - assert message_payload[2] = execution_hash_low; - assert message_payload[3] = execution_hash_high; - let payload_size = 4; - - // Send message to L1 Contract - send_message_to_l1( - to_address=l1_destination_address, payload_size=payload_size, payload=message_payload - ); - return (); -} diff --git a/contracts/starknet/ExecutionStrategies/Vanilla.cairo b/contracts/starknet/ExecutionStrategies/Vanilla.cairo deleted file mode 100644 index d2cf36db..00000000 --- a/contracts/starknet/ExecutionStrategies/Vanilla.cairo +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -// -// @title Vanilla Execution Strategy -// @author SnapshotLabs -// @notice Dummy Execution Strategy -// - -@external -func execute{syscall_ptr: felt*}( - proposal_outcome: felt, execution_params_len: felt, execution_params: felt* -) { - return (); -} diff --git a/contracts/starknet/Interfaces/IExecutionStrategy.cairo b/contracts/starknet/Interfaces/IExecutionStrategy.cairo deleted file mode 100644 index 71c45a07..00000000 --- a/contracts/starknet/Interfaces/IExecutionStrategy.cairo +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -@contract_interface -namespace IExecutionStrategy { - func execute(proposal_outcome: felt, execution_params_len: felt, execution_params: felt*) { - } -} diff --git a/contracts/starknet/Interfaces/ISpaceAccount.cairo b/contracts/starknet/Interfaces/ISpaceAccount.cairo deleted file mode 100644 index e0034c3e..00000000 --- a/contracts/starknet/Interfaces/ISpaceAccount.cairo +++ /dev/null @@ -1,113 +0,0 @@ -%lang starknet - -from openzeppelin.account.library import AccountCallArray -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.proposal_info import ProposalInfo -from starkware.cairo.common.uint256 import Uint256 - -@contract_interface -namespace ISpaceaccount { - func getPublicKey() -> (publicKey: felt) { - } - - func supportsInterface(interfaceId: felt) -> (success: felt) { - } - - func setPublicKey(newPublicKey: felt) { - } - - func isValidSignature(hash: felt, signature_len: felt, signature: felt*) -> (isValid: felt) { - } - - func __validate__( - call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt* - ) { - } - - func __validate_declare__(hash: felt) { - } - - func __execute__( - call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt* - ) -> (response_len: felt, response: felt*) { - } - - func propose( - proposer_address: Address, - metadata_uri_string_len: felt, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_strategy: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - execution_params_len: felt, - execution_params: felt*, - ) -> () { - } - - func vote( - voter_address: Address, - proposal_id: felt, - choice: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - ) -> () { - } - - func finalize_proposal(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - } - - func cancel_proposal(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - } - - func has_voted(proposal_id: felt, voter_address: Address) -> (voted: felt) { - } - - func get_proposal_info(proposal_id: felt) -> (proposal_info: ProposalInfo) { - } - - func update_controller(new_controller: felt) { - } - - func update_quorum(new_quorum: Uint256) { - } - - func update_voting_delay(new_delay: felt) { - } - - func update_min_voting_duration(new_min_voting_duration: felt) { - } - - func update_max_voting_duration(new_max_voting_duration: felt) { - } - - func update_proposal_threshold(new_proposal_threshold: Uint256) { - } - - func update_metadata_uri(new_metadata_uri_len: felt, new_metadata_uri: felt*) { - } - - func add_execution_strategies(addresses_len: felt, addresses: felt*) { - } - - func remove_execution_strategies(addresses_len: felt, addresses: felt*) { - } - - func add_voting_strategies( - addresses_len: felt, addresses: felt*, params_flat_len: felt, params_flat: felt* - ) { - } - - func remove_voting_strategies(indexes_len: felt, indexes: felt*) { - } - - func add_authenticators(addresses_len: felt, addresses: felt*) { - } - - func remove_authenticators(addresses_len: felt, addresses: felt*) { - } -} diff --git a/contracts/starknet/Interfaces/ISpaceFactory.cairo b/contracts/starknet/Interfaces/ISpaceFactory.cairo deleted file mode 100644 index 9a749574..00000000 --- a/contracts/starknet/Interfaces/ISpaceFactory.cairo +++ /dev/null @@ -1,27 +0,0 @@ -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -@contract_interface -namespace ISpacefactory { - func deploy_space( - public_key: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - voting_strategies_len: felt, - voting_strategies: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategy_len: felt, - execution_strategy: felt*, - metadata_uri_len: felt, - metadata_uri: felt*, - ) { - } -} diff --git a/contracts/starknet/Interfaces/IVotingStrategy.cairo b/contracts/starknet/Interfaces/IVotingStrategy.cairo deleted file mode 100644 index e7c48f6d..00000000 --- a/contracts/starknet/Interfaces/IVotingStrategy.cairo +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.general_address import Address - -@contract_interface -namespace IVotingStrategy { - func getVotingPower( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, - ) -> (voting_power: Uint256) { - } -} diff --git a/contracts/starknet/SpaceAccount.cairo b/contracts/starknet/SpaceAccount.cairo deleted file mode 100644 index c12dced4..00000000 --- a/contracts/starknet/SpaceAccount.cairo +++ /dev/null @@ -1,423 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.starknet.common.syscalls import get_tx_info -from starkware.cairo.common.uint256 import Uint256 - -from openzeppelin.account.library import Account, AccountCallArray -from openzeppelin.access.ownable.library import Ownable - -from contracts.starknet.lib.voting import Voting -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.proposal_info import ProposalInfo -from contracts.starknet.lib.vote import Vote - -// -// @title Snapshot X Space Account -// @author SnapshotLabs -// @notice Core contract for Snapshot X, each DAO should deploy their own instance -// - -// @dev Constructor -// @param public_key The public key that can execute transactions via this account - Can set to zero if this functionality is unwanted -// @param voting_delay The delay between when a proposal is created, and when the voting starts -// @param min_voting_duration The minimum duration of the voting period -// @param max_voting_duration The maximum duration of the voting period -// @param proposal_threshold The minimum amount of voting power needed to be able to create a new proposal in the space -// @param controller The address of the controller account for the space -// @param quorum The minimum total voting power required for a proposal to pass -// @param voting_strategies Array of whitelisted voting strategy contract addresses -// @param voting_strategy_params_flat Flattened 2D array of voting strategy parameters -// @param authenticators Array of whitelisted authenticator contract addresses -// @param execution_strategies Array of whitelisted execution strategy contract addresses -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - public_key: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, -) { - Account.initializer(public_key); - Ownable.initializer(controller); - Voting.initializer( - voting_delay, - min_voting_duration, - max_voting_duration, - proposal_threshold, - quorum, - voting_strategies_len, - voting_strategies, - voting_strategy_params_flat_len, - voting_strategy_params_flat, - authenticators_len, - authenticators, - execution_strategies_len, - execution_strategies, - ); - return (); -} - -// ----- OZ Account Functionality ----- - -// -// Getters -// - -@view -func getPublicKey{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> ( - publicKey: felt -) { - let (publicKey: felt) = Account.get_public_key(); - return (publicKey=publicKey); -} - -@view -func supportsInterface{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - interfaceId: felt -) -> (success: felt) { - return Account.supports_interface(interfaceId); -} - -// -// Setters -// - -@external -func setPublicKey{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - newPublicKey: felt -) { - Account.set_public_key(newPublicKey); - return (); -} - -// -// Business logic -// - -@view -func isValidSignature{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(hash: felt, signature_len: felt, signature: felt*) -> (isValid: felt) { - let (isValid: felt) = Account.is_valid_signature(hash, signature_len, signature); - return (isValid=isValid); -} - -@external -func __validate__{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) { - let (tx_info) = get_tx_info(); - Account.is_valid_signature(tx_info.transaction_hash, tx_info.signature_len, tx_info.signature); - return (); -} - -@external -func __validate_declare__{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(class_hash: felt) { - let (tx_info) = get_tx_info(); - Account.is_valid_signature(tx_info.transaction_hash, tx_info.signature_len, tx_info.signature); - return (); -} - -@external -func __validate_deploy__{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, ecdsa_ptr: SignatureBuiltin*, range_check_ptr -}(class_hash: felt, salt: felt, publicKey: felt) { - let (tx_info) = get_tx_info(); - Account.is_valid_signature(tx_info.transaction_hash, tx_info.signature_len, tx_info.signature); - return (); -} - -@external -func __execute__{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, -}(call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) -> ( - response_len: felt, response: felt* -) { - let (response_len, response) = Account.execute( - call_array_len, call_array, calldata_len, calldata - ); - return (response_len, response); -} - -// ----- Space Contract Functionality ----- - -// @dev Creates a proposal -// @param proposer_address The address of the proposal creator -// @param metadata_uri_string_len The string length of the metadata URI (required for keccak hashing) -// @param metadata_uri The metadata URI for the proposal -// @param used_voting_strategies The voting strategies (within the whitelist for the space) that the proposal creator has non-zero voting power with -// @param user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used -// @param execution_params Execution parameters for the proposal -@external -func propose{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposer_address: Address, - metadata_uri_string_len: felt, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_strategy: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - execution_params_len: felt, - execution_params: felt*, -) -> () { - Voting.propose( - proposer_address, - metadata_uri_string_len, - metadata_uri_len, - metadata_uri, - execution_strategy, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_flat_len, - user_voting_strategy_params_flat, - execution_params_len, - execution_params, - ); - return (); -} - -// @dev Casts a vote on a proposal -// @param voter_address The address of the voter -// @param proposal_id The ID of the proposal in the space -// @param choice The voter's choice (FOR, AGAINST, ABSTAIN) -// @param used_voting_strategies The voting strategies (within the whitelist for the space) that the voter has non-zero voting power with -// @param user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used -@external -func vote{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr: felt, -}( - voter_address: Address, - proposal_id: felt, - choice: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, -) -> () { - Voting.vote( - voter_address, - proposal_id, - choice, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_flat_len, - user_voting_strategy_params_flat, - ); - return (); -} - -// @dev Finalizes a proposal, triggering execution via the chosen execution strategy -// @param proposal_id The ID of the proposal -// @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) -@external -func finalizeProposal{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, -}(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - Voting.finalize_proposal(proposal_id, execution_params_len, execution_params); - return (); -} - -// @dev Cancels a proposal. Only callable by the controller. -// @param proposal_id The ID of the proposal -// @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) -@external -func cancelProposal{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, execution_params_len: felt, execution_params: felt* -) { - Ownable.assert_only_owner(); - Voting.cancel_proposal(proposal_id, execution_params_len, execution_params); - return (); -} - -// @dev Checks to see whether a given address has voted in a proposal -// @param proposal_id The proposal ID -// @param voter_address The voter's address -// @return voted 1 if user has voted, otherwise 0 -@view -func hasVoted{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, voter_address: Address -) -> (voted: felt) { - return Voting.has_voted(proposal_id, voter_address); -} - -// @dev Returns proposal information -// @param proposal_id The proposal ID -// @return proposal_info Struct containing proposal information -@view -func getProposalInfo{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt -) -> (proposal_info: ProposalInfo) { - return Voting.get_proposal_info(proposal_id); -} - -// @dev Updates the controller -// @param new_controller The new controller account address -@external -func setController{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_controller: felt -) { - Ownable.assert_only_owner(); - Ownable.transfer_ownership(new_controller); - return (); -} - -// @dev Updates the quorum -// @param new_quorum The new quorum -@external -func setQuorum{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_quorum: Uint256 -) { - Ownable.assert_only_owner(); - Voting.update_quorum(new_quorum); - return (); -} - -// @dev Updates the voting delay -// @param new_voting_delay The new voting delay -@external -func setVotingDelay{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_delay: felt -) { - Ownable.assert_only_owner(); - Voting.update_voting_delay(new_delay); - return (); -} - -// @dev Updates the minimum voting duration -// @param new_min_voting_duration The new minimum voting duration -@external -func setMinVotingDuration{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_min_voting_duration: felt -) { - Ownable.assert_only_owner(); - Voting.update_min_voting_duration(new_min_voting_duration); - return (); -} - -// @dev Updates the maximum voting duration -// @param new_max_voting_duration The new maximum voting duration -@external -func setMaxVotingDuration{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_max_voting_duration: felt -) { - Ownable.assert_only_owner(); - Voting.update_max_voting_duration(new_max_voting_duration); - return (); -} - -// @dev Updates the proposal threshold -// @param new_proposal_threshold The new proposal threshold -@external -func setProposalThreshold{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_proposal_threshold: Uint256 -) { - Ownable.assert_only_owner(); - Voting.update_proposal_threshold(new_proposal_threshold); - return (); -} - -// @dev Updates the metadata URI -// @param new_metadata_uri The new metadata URI -@external -func setMetadataUri{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_metadata_uri_len: felt, new_metadata_uri: felt* -) { - Ownable.assert_only_owner(); - Voting.update_metadata_uri(new_metadata_uri_len, new_metadata_uri); - return (); -} - -// @dev Adds execution strategy contracts to the whitelist -// @param addresses Array of execution strategy contract addresses -@external -func addExecutionStrategies{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* -) { - Ownable.assert_only_owner(); - Voting.add_execution_strategies(addresses_len, addresses); - return (); -} - -// @dev Removes execution strategy contracts from the whitelist -// @param addresses Array of execution strategy contract addresses -@external -func removeExecutionStrategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(addresses_len: felt, addresses: felt*) { - Ownable.assert_only_owner(); - Voting.remove_execution_strategies(addresses_len, addresses); - return (); -} - -// @dev Adds voting strategy contracts to the whitelist -// @param addresses Array of voting strategy contract addresses -// @param params_flat Flattened 2D array of voting strategy parameters -@external -func addVotingStrategies{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt*, params_flat_len: felt, params_flat: felt* -) { - Ownable.assert_only_owner(); - Voting.add_voting_strategies(addresses_len, addresses, params_flat_len, params_flat); - return (); -} - -// @dev Removes voting strategy contracts from the whitelist -// @param indexes Array of voting strategy indexes to remove -@external -func removeVotingStrategies{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - indexes_len: felt, indexes: felt* -) { - Ownable.assert_only_owner(); - Voting.remove_voting_strategies(indexes_len, indexes); - return (); -} - -// @dev Adds authenticator contracts to the whitelist -// @param addresses Array of authenticator contract addresses -@external -func addAuthenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* -) { - Ownable.assert_only_owner(); - Voting.add_authenticators(addresses_len, addresses); - return (); -} - -// @dev Removes authenticator contracts from the whitelist -// @param addresses Array of authenticator contract addresses -@external -func removeAuthenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* -) { - Ownable.assert_only_owner(); - Voting.remove_authenticators(addresses_len, addresses); - return (); -} diff --git a/contracts/starknet/SpaceFactory.cairo b/contracts/starknet/SpaceFactory.cairo deleted file mode 100644 index 27b8c48e..00000000 --- a/contracts/starknet/SpaceFactory.cairo +++ /dev/null @@ -1,160 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.memcpy import memcpy -from starkware.starknet.common.syscalls import deploy, get_caller_address - -// -// @title Snapshot X Space Factory -// @author SnapshotLabs -// @notice Contract to deploy space contracts in a trackable way -// @notice The space contract needs to be declared on StarkNet first, which will return the clash hash that is passed to the constructor of this contract -// - -// @dev Stores a counter to ensure a unique salt for each deployment -@storage_var -func SpaceFactory_salt() -> (value: felt) { -} - -// @dev Stores the clash hash for the space contract -@storage_var -func SpaceFactory_space_class_hash_store() -> (value: felt) { -} - -@event -func space_deployed( - deployer_address: felt, - space_address: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, - metadata_uri_len: felt, - metadata_uri: felt*, -) { -} - -// @dev Constructor -// @param space_class_hash Class hash of the space contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - space_class_hash: felt -) { - SpaceFactory_space_class_hash_store.write(space_class_hash); - return (); -} - -// @dev Deploys a space contract instance -// @param public_key The public key that can execute transactions via this account - Can set to zero if this functionality is unwanted -// @param voting_delay The delay between when a proposal is created, and when the voting starts -// @param min_voting_duration The minimum duration of the voting period -// @param max_voting_duration The maximum duration of the voting period -// @param proposal_threshold The minimum amount of voting power needed to be able to create a new proposal in the space -// @param controller The address of the controller account for the space -// @param quorum The minimum total voting power required for a proposal to pass -// @param voting_strategies Array of whitelisted voting strategy contract addresses -// @param voting_strategy_params_flat Flattened 2D array of voting strategy parameters -// @param authenticators Array of whitelisted authenticator contract addresses -// @param execution_strategies Array of whitelisted execution strategy contract addresses -// @param metadata_uri The metadata URI for the space -@external -func deploySpace{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - public_key: felt, - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - controller: felt, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, - metadata_uri_len: felt, - metadata_uri: felt*, -) { - alloc_locals; - let (calldata: felt*) = alloc(); - assert calldata[0] = public_key; - assert calldata[1] = voting_delay; - assert calldata[2] = min_voting_duration; - assert calldata[3] = max_voting_duration; - assert calldata[4] = proposal_threshold.low; - assert calldata[5] = proposal_threshold.high; - assert calldata[6] = controller; - assert calldata[7] = quorum.low; - assert calldata[8] = quorum.high; - assert calldata[9] = voting_strategies_len; - memcpy(calldata + 10, voting_strategies, voting_strategies_len); - assert calldata[10 + voting_strategies_len] = voting_strategy_params_flat_len; - memcpy( - calldata + 11 + voting_strategies_len, - voting_strategy_params_flat, - voting_strategy_params_flat_len, - ); - assert calldata[11 + voting_strategies_len + voting_strategy_params_flat_len] = authenticators_len; - memcpy( - calldata + 12 + voting_strategies_len + voting_strategy_params_flat_len, - authenticators, - authenticators_len, - ); - assert calldata[12 + voting_strategies_len + voting_strategy_params_flat_len + authenticators_len] = execution_strategies_len; - memcpy( - calldata + 13 + voting_strategies_len + voting_strategy_params_flat_len + authenticators_len, - execution_strategies, - execution_strategies_len, - ); - // NOTE: The metadata URI is not stored in the contract state (its just emitted as an event). Therefore it does not need to be passed as a parameter in the space deployment - let (deployer_address) = get_caller_address(); - let calldata_len = 13 + voting_strategies_len + voting_strategy_params_flat_len + authenticators_len + execution_strategies_len; - let (current_salt) = SpaceFactory_salt.read(); - let (space_class_hash) = SpaceFactory_space_class_hash_store.read(); - let (space_address) = deploy( - class_hash=space_class_hash, - contract_address_salt=current_salt, - constructor_calldata_size=calldata_len, - constructor_calldata=calldata, - deploy_from_zero=0, - ); - SpaceFactory_salt.write(value=current_salt + 1); - - space_deployed.emit( - deployer_address, - space_address, - voting_delay, - min_voting_duration, - max_voting_duration, - proposal_threshold, - controller, - quorum, - voting_strategies_len, - voting_strategies, - voting_strategy_params_flat_len, - voting_strategy_params_flat, - authenticators_len, - authenticators, - execution_strategies_len, - execution_strategies, - metadata_uri_len, - metadata_uri, - ); - return (); -} diff --git a/contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo b/contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo deleted file mode 100644 index 084ef470..00000000 --- a/contracts/starknet/TestContracts/ExecutionStrategies/FailsIfRejected.cairo +++ /dev/null @@ -1,17 +0,0 @@ -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 -from contracts.starknet.lib.proposal_outcome import ProposalOutcome - -// Throws if `proposal_outcome` is `REJECTED`. -@external -func execute{syscall_ptr: felt*}( - proposal_outcome: felt, execution_params_len: felt, execution_params: felt* -) { - if (proposal_outcome == ProposalOutcome.REJECTED) { - with_attr error_message("TestExecutionStrategy: Proposal was rejected") { - assert 1 = 0; - } - } - return (); -} diff --git a/contracts/starknet/TestContracts/README.md b/contracts/starknet/TestContracts/README.md deleted file mode 100644 index c5ac0b28..00000000 --- a/contracts/starknet/TestContracts/README.md +++ /dev/null @@ -1 +0,0 @@ -These contracts are used to test library functionality in isolation. \ No newline at end of file diff --git a/contracts/starknet/TestContracts/Test_ArrayUtils.cairo b/contracts/starknet/TestContracts/Test_ArrayUtils.cairo deleted file mode 100644 index 6f00bc33..00000000 --- a/contracts/starknet/TestContracts/Test_ArrayUtils.cairo +++ /dev/null @@ -1,30 +0,0 @@ -%lang starknet -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_builtins import HashBuiltin -from contracts.starknet.lib.array_utils import ArrayUtils, Immutable2DArray - -@view -func testArray2D{range_check_ptr}(flat_array_len: felt, flat_array: felt*, index: felt) -> ( - array_len: felt, array: felt* -) { - alloc_locals; - let (array2d: Immutable2DArray) = ArrayUtils.construct_array2d(flat_array_len, flat_array); - let (array_len, array) = ArrayUtils.get_sub_array(array2d, index); - return (array_len, array); -} - -@view -func testHashArray{range_check_ptr, pedersen_ptr: HashBuiltin*}(array_len: felt, array: felt*) -> ( - hash: felt -) { - let (hash) = ArrayUtils.hash(array_len, array); - return (hash,); -} - -@view -func test_assert_no_duplicates{range_check_ptr, pedersen_ptr: HashBuiltin*}( - array_len: felt, array: felt* -) { - ArrayUtils.assert_no_duplicates(array_len, array); - return (); -} diff --git a/contracts/starknet/TestContracts/Test_MathUtils.cairo b/contracts/starknet/TestContracts/Test_MathUtils.cairo deleted file mode 100644 index f3f9f6a4..00000000 --- a/contracts/starknet/TestContracts/Test_MathUtils.cairo +++ /dev/null @@ -1,29 +0,0 @@ -%lang starknet -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from contracts.starknet.lib.math_utils import MathUtils - -@view -func testWordsToUint256{range_check_ptr}(word1: felt, word2: felt, word3: felt, word4: felt) -> ( - uint256: Uint256 -) { - let (uint256) = MathUtils.words_to_uint256(word1, word2, word3, word4); - return (uint256,); -} - -@view -func testPackFelt{range_check_ptr}(num1: felt, num2: felt, num3: felt, num4: felt) -> ( - packed: felt -) { - let (packed) = MathUtils.pack_4_32_bit(num1, num2, num3, num4); - return (packed,); -} - -@view -func testUnpackFelt{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(packed: felt) -> ( - num1: felt, num2: felt, num3: felt, num4: felt -) { - alloc_locals; - let (num1, num2, num3, num4) = MathUtils.unpack_4_32_bit(packed); - return (num1, num2, num3, num4); -} diff --git a/contracts/starknet/TestContracts/Test_Merkle.cairo b/contracts/starknet/TestContracts/Test_Merkle.cairo deleted file mode 100644 index cf9408e8..00000000 --- a/contracts/starknet/TestContracts/Test_Merkle.cairo +++ /dev/null @@ -1,13 +0,0 @@ -%lang starknet -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_builtins import HashBuiltin -from contracts.starknet.lib.merkle import Merkle - -@view -func testAssertValidLeaf{range_check_ptr, pedersen_ptr: HashBuiltin*}( - root: felt, leaf_len: felt, leaf: felt*, proof_len: felt, proof: felt* -) { - alloc_locals; - Merkle.assert_valid_leaf(root, leaf_len, leaf, proof_len, proof); - return (); -} diff --git a/contracts/starknet/VotingStrategies/EthBalanceOf.cairo b/contracts/starknet/VotingStrategies/EthBalanceOf.cairo deleted file mode 100644 index dabd70c9..00000000 --- a/contracts/starknet/VotingStrategies/EthBalanceOf.cairo +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.single_slot_proof import SingleSlotProof - -// -// @title Ethereum Balance Of Voting Strategy -// @author SnapshotLabs -// @notice Contract to allow Ethereum token balances to be used as voting power -// - -// @dev Constructor -// @param fact_registry_address Address of the Fossil fact registry contract -// @param l1_headers_store_address Address of the Fossil L1 headers store contract -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - fact_registry_address: felt, l1_headers_store_address: felt -) { - SingleSlotProof.initializer(fact_registry_address, l1_headers_store_address); - return (); -} - -// @dev Returns the voting power for a user -// @param timestamp The snapshot timestamp -// @param voter_address The address of the user -// @param params Configuration parameter array that is the same for every voter in the proposal. Should be as follows: -// params[0] = The address of the Ethereum token contract -// params[1] = The index of the slot within the token contract where the balances[_address] mapping resides -// @param user_params Array containing storage proofs for the users balance within the token contract -// @return voting_power The value of the balances[_address] mapping corresponding to the user's address -@view -func getVotingPower{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, bitwise_ptr: BitwiseBuiltin* -}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - let (voting_power) = SingleSlotProof.get_storage_slot( - timestamp, voter_address.value, params_len, params, user_params_len, user_params - ); - return (voting_power,); -} diff --git a/contracts/starknet/VotingStrategies/MerkleWhitelist.cairo b/contracts/starknet/VotingStrategies/MerkleWhitelist.cairo deleted file mode 100644 index c4f85042..00000000 --- a/contracts/starknet/VotingStrategies/MerkleWhitelist.cairo +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.memcpy import memcpy -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.math import assert_nn_le - -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.merkle import Merkle - -// -// @title Merkle Whitelist Voting Strategy -// @author SnapshotLabs -// @notice Contract to allow a merkle tree based whitelist to be used to compute voting power for each user -// - -// @dev Returns the voting power for a user obtained from the whitelist -// @param timestamp The snapshot timestamp (not used) -// @param voter_address The address of the user -// @param params Configuration parameter array that is the same for every voter in the proposal. Should be as follows: -// params[0] = The merkle root of the whitelist data, should be computed off-chain -// @param user_params Array containing the leaf and merkle proof data. Should be as follows: -// user_params[0] = address of the whitelisted user -// user_params[1] = Low 128 bits of the voting power of the user -// user_params[2] = High 128 bits of the voting power of the user -// @return voting_power The voting power of the user as a Uint256 -@view -func getVotingPower{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - alloc_locals; - - with_attr error_message("MerkleWhitelist: Invalid parameters supplied") { - assert_nn_le(3, user_params_len); - } - - // Extracting leaf data from user params array - let (leaf: felt*) = alloc(); - let leaf_len = 3; - memcpy(leaf, user_params, leaf_len); - - // Checking that the leaf corresponds to the voter's address - with_attr error_message("MerkleWhitelist: Invalid proof supplied") { - // The address resides at the beginning of the leaf data array - assert leaf[0] = voter_address.value; - } - - // Extracting proof from user params array - let (proof: felt*) = alloc(); - let proof_len = user_params_len - leaf_len; - memcpy(proof, user_params + leaf_len, proof_len); - - // Extracting merkle root from params array - let merkle_root = params[0]; - - // Checking the merkle proof - Merkle.assert_valid_leaf(merkle_root, leaf_len, leaf, proof_len, proof); - - // Extract voting power from leaf and cast to Uint256 - let voting_power = Uint256(leaf[1], leaf[2]); - - return (voting_power,); -} diff --git a/contracts/starknet/VotingStrategies/Vanilla.cairo b/contracts/starknet/VotingStrategies/Vanilla.cairo deleted file mode 100644 index b167e260..00000000 --- a/contracts/starknet/VotingStrategies/Vanilla.cairo +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.general_address import Address - -// -// @title Vanilla Voting Strategy -// @author SnapshotLabs -// @notice Contract to every user 1 voting power -// - -@view -func getVotingPower{range_check_ptr}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - return (Uint256(1, 0),); -} diff --git a/contracts/starknet/VotingStrategies/Whitelist.cairo b/contracts/starknet/VotingStrategies/Whitelist.cairo deleted file mode 100644 index 604676e1..00000000 --- a/contracts/starknet/VotingStrategies/Whitelist.cairo +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin - -from contracts.starknet.lib.math_utils import MathUtils -from contracts.starknet.lib.general_address import Address - -// -// @title Whitelist Voting Strategy -// @author SnapshotLabs -// @notice Contract to allow a whitelist to be used to compute voting power for each user -// - -// @dev Mapping between each address in the whitelist and the voting power assigned to them -@storage_var -func whitelist(address: Address) -> (voting_power: Uint256) { -} - -@event -func whitelisted(address: Address, voting_power: Uint256) { -} - -// @dev Constructor -// @param whitelist Array containing the whitelist -// @notice The whitelist array should be as follows: -// whitelist[0]: The 1st user's address -// whitelist[1]: The low 128 bits of the 1st user's voting power -// whitelist[2]: The high 128 bits of the 1st user's voting power -// whitelist[4]: The 2nd user's address -// etc... -@constructor -func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - whitelist_len: felt, whitelist: felt* -) { - _register_whitelist(whitelist_len, whitelist); - return (); -} - -// @dev Returns the voting power for a user obtained from the whitelist -// @param timestamp The snapshot timestamp -// @param voter_address The address of the user -// @param params Empty array -// @param user_params Empty array -// @return voting_power The voting power of the user -@view -func getVotingPower{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - timestamp: felt, - voter_address: Address, - params_len: felt, - params: felt*, - user_params_len: felt, - user_params: felt*, -) -> (voting_power: Uint256) { - let (power) = whitelist.read(voter_address); - // `power` will be set to 0 if voter is not whitelisted - return (power,); -} - -func _register_whitelist{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - _whitelist_len: felt, _whitelist: felt* -) { - if (_whitelist_len == 0) { - return (); - } else { - let address = Address(_whitelist[0]); - // Add it to the whitelist - let voting_power = Uint256(_whitelist[1], _whitelist[2]); - - MathUtils.assert_valid_uint256(voting_power); - - whitelist.write(address, voting_power); - whitelisted.emit(address, voting_power); - _register_whitelist(_whitelist_len - 3, &_whitelist[3]); - return (); - } -} diff --git a/contracts/starknet/fossil b/contracts/starknet/fossil deleted file mode 160000 index b900ab93..00000000 --- a/contracts/starknet/fossil +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b900ab933df4c2bff9745d0a05daee4e7c10b405 diff --git a/contracts/starknet/lib/array_utils.cairo b/contracts/starknet/lib/array_utils.cairo deleted file mode 100644 index 8e4d4486..00000000 --- a/contracts/starknet/lib/array_utils.cairo +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.hash_state import hash_init, hash_update, hash_finalize -from starkware.cairo.common.bool import TRUE, FALSE -from starkware.cairo.common.math import assert_not_equal - -// -// @title Array Utilities Library -// @author SnapshotLabs -// @notice A library containing various array utilities -// - -struct Immutable2DArray { - offsets_len: felt, // The length of the offsets array is the number of sub arrays in the 2d array - offsets: felt*, // offsets[i] is the index of elements where the ith array starts - elements_len: felt, - elements: felt*, // elements stores all the values of each sub array in the 2d array -} - -namespace ArrayUtils { - // @dev Computes the pedersen hash of an array of felts - // @param array The array of felts - // @return hash The hash of the array - func hash{pedersen_ptr: HashBuiltin*}(array_len: felt, array: felt*) -> (hash: felt) { - let (hash_state_ptr) = hash_init(); - let (hash_state_ptr) = hash_update{hash_ptr=pedersen_ptr}(hash_state_ptr, array, array_len); - let (hash) = hash_finalize{hash_ptr=pedersen_ptr}(hash_state_ptr); - return (hash,); - } - - // Asserts that the array does not contain any duplicates. - // O(N^2) as it loops over each element N times. - func assert_no_duplicates{}(array_len: felt, array: felt*) { - if (array_len == 0) { - return (); - } else { - _assert_not_in_array(array[0], array_len - 1, &array[1]); - assert_no_duplicates(array_len - 1, &array[1]); - return (); - } - } - - // Construct an Immutable2D array from a flat encoding. - // The structure of the flat array that is passed should be as follows: - // flat_array[0] = num_arrays - // flat_array[1:1+num_arrays] = offsets - // flat_array[1+num_arrays:] = elements - func construct_array2d{range_check_ptr}(flat_array_len: felt, flat_array: felt*) -> ( - array2d: Immutable2DArray - ) { - let offsets_len = flat_array[0]; - let offsets = &flat_array[1]; - let elements_len = flat_array_len - offsets_len - 1; - let elements = &flat_array[1 + offsets_len]; - let array2d = Immutable2DArray(offsets_len, offsets, elements_len, elements); - return (array2d,); - } - - // Extracts sub array at the specified index from an Immutable2DArray - func get_sub_array{range_check_ptr}(array2d: Immutable2DArray, index: felt) -> ( - array_len: felt, array: felt* - ) { - let offset = array2d.offsets[index]; - let array = &array2d.elements[offset]; - - if (index == array2d.offsets_len - 1) { - // If the index points to the final array in the 2d array, the length of the sub array is the length of the 2d array elements minus the offset of the final array - tempvar array_len = array2d.elements_len - offset; - } else { - // Otherwise the length of the sub array is the offset of the next array minus the offset of the current array - tempvar array_len = array2d.offsets[index + 1] - offset; - } - return (array_len, array); - } -} - -// @dev Asserts that a value is not present in an array -// @param value The value -// @param array The array -func _assert_not_in_array{}(value: felt, array_len: felt, array: felt*) { - if (array_len == 0) { - return (); - } - with_attr error_message("ArrayUtils: Duplicate entry found") { - assert_not_equal(value, array[0]); - } - _assert_not_in_array(value, array_len - 1, &array[1]); - return (); -} diff --git a/contracts/starknet/lib/choice.cairo b/contracts/starknet/lib/choice.cairo deleted file mode 100644 index fd3624e3..00000000 --- a/contracts/starknet/lib/choice.cairo +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -namespace Choice { - const FOR = 1; - const AGAINST = 2; - const ABSTAIN = 3; -} diff --git a/contracts/starknet/lib/eip712.cairo b/contracts/starknet/lib/eip712.cairo deleted file mode 100644 index d22847f4..00000000 --- a/contracts/starknet/lib/eip712.cairo +++ /dev/null @@ -1,640 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_contract_address -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.cairo_secp.signature import verify_eth_signature_uint256 -from starkware.cairo.common.bitwise import bitwise_and -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.math import unsigned_div_rem -from starkware.cairo.common.cairo_keccak.keccak import ( - keccak_uint256s_bigend, - keccak_add_uint256s, - keccak_bigend, - finalize_keccak, -) -from starkware.cairo.common.uint256 import ( - Uint256, - uint256_eq, - uint256_le, - uint256_mul, - uint256_unsigned_div_rem, -) - -from contracts.starknet.lib.math_utils import MathUtils -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title EIP712 Library -// @author SnapshotLabs -// @notice A library for verifying Ethereum EIP712 signatures on typed data required for Snapshot X -// @dev Refer to the official EIP for more information: https://eips.ethereum.org/EIPS/eip-712 -// - -const ETHEREUM_PREFIX = 0x1901; - -// Domain Separator: (Goerli chain id) -// name: 'snapshot-x', -// version: '1' -// chainId: '5' -const DOMAIN_HASH_HIGH = 0x8aba6bf30572474cf5acb579ce4c27aa; -const DOMAIN_HASH_LOW = 0x01d7dbffc7a8de3d601367229ba8a687; - -// keccak256("Propose(bytes32 authenticator,bytes32 space,address author,string metadata_uri,bytes32 executor,bytes32 execution_hash,bytes32 strategies_hash,bytes32 strategies_params_hash,uint256 salt)") -const PROPOSAL_TYPE_HASH_HIGH = 0x53ca73f14c436dd8e4088b71987f1dad; -const PROPOSAL_TYPE_HASH_LOW = 0x4187b44b32f86ed0ba765a166eaa687e; - -// keccak256("Vote(bytes32 authenticator,bytes32 space,address voter,uint256 proposal,uint256 choice,bytes32 strategies_hash,bytes32 strategies_params_hash,uint256 salt)") -const VOTE_TYPE_HASH_HIGH = 0x7c25de9274f16730816515e2132f9775; -const VOTE_TYPE_HASH_LOW = 0x17f55b8568b810cc267dc2999edce64a; - -// keccak256("SessionKey(address address,bytes32 sessionPublicKey,uint256 sessionDuration,uint256 salt)") -const SESSION_KEY_INIT_TYPE_HASH_HIGH = 0x53f1294cb551b4ff97c8fd4caefa8ec6; -const SESSION_KEY_INIT_TYPE_HASH_LOW = 0xaa9d835345c95b1a435ddff5ae910083; - -// keccak256("RevokeSessionKey(bytes32 sessionPublicKey,uint256 salt)") -const SESSION_KEY_REVOKE_TYPE_HASH_HIGH = 0x0a5ba214c2c419ff474ecb96dc30103d; -const SESSION_KEY_REVOKE_TYPE_HASH_LOW = 0x8166de3d410abc781e23aae247360fa9; - -// @dev Signature salts store -@storage_var -func EIP712_salts(eth_address: felt, salt: Uint256) -> (already_used: felt) { -} - -namespace EIP712 { - // @dev Asserts that a signature to cast a vote is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is casting a vote - // @param calldata Vote calldata - func verify_vote_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - target: felt, - calldata_len: felt, - calldata: felt*, - ) { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - let voter_address = calldata[0]; - let (authenticator_address) = get_contract_address(); - let (auth_address_u256) = MathUtils.felt_to_uint256(authenticator_address); - - // Ensure voter has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(voter_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - let (space) = MathUtils.felt_to_uint256(target); - - let (voter_address_u256) = MathUtils.felt_to_uint256(voter_address); - - let (proposal_id) = MathUtils.felt_to_uint256(calldata[1]); - let (choice) = MathUtils.felt_to_uint256(calldata[2]); - - let used_voting_strategies_len = calldata[3]; - let used_voting_strategies = &calldata[4]; - let (used_voting_strategies_hash) = _get_padded_hash( - used_voting_strategies_len, used_voting_strategies - ); - - let user_voting_strategy_params_flat_len = calldata[4 + used_voting_strategies_len]; - let user_voting_strategy_params_flat = &calldata[5 + used_voting_strategies_len]; - let (user_voting_strategy_params_flat_hash) = _get_padded_hash( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - // Now construct the data hash (hashStruct) - let (data: Uint256*) = alloc(); - assert data[0] = Uint256(VOTE_TYPE_HASH_LOW, VOTE_TYPE_HASH_HIGH); - assert data[1] = auth_address_u256; - assert data[2] = space; - assert data[3] = voter_address_u256; - assert data[4] = proposal_id; - assert data[5] = choice; - assert data[6] = used_voting_strategies_hash; - assert data[7] = user_voting_strategy_params_flat_hash; - assert data[8] = salt; - - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(9, data); - - // Prepare the encoded data - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required in order to call `keccak`) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(hash, r, s, v - 27, voter_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(voter_address, salt, 1); - return (); - } - - // @dev Asserts that a signature to create a proposal is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is creating a proposal - // @param calldata Propose calldata - func verify_propose_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - target: felt, - calldata_len: felt, - calldata: felt*, - ) { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - // Proposer address should be located in calldata[0] - let proposer_address = calldata[0]; - - let (authenticator_address) = get_contract_address(); - let (auth_address_u256) = MathUtils.felt_to_uint256(authenticator_address); - - // Ensure proposer has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(proposer_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - - // We don't need to pad because calling `.address` with starknet.js - // already left pads the address with 0s - let (space) = MathUtils.felt_to_uint256(target); - - // Proposer address - let (proposer_address_u256) = MathUtils.felt_to_uint256(proposer_address); - - // Metadata URI - let metadata_uri_string_len = calldata[1]; - let metadata_uri_len = calldata[2]; - let metadata_uri: felt* = &calldata[3]; - let (metadata_uri_hash) = _keccak_ints_sequence{keccak_ptr=keccak_ptr}( - metadata_uri_string_len, metadata_uri_len, metadata_uri - ); - - // Execution Strategy - let execution_strategy = calldata[3 + metadata_uri_len]; - let (execution_strategy_u256) = MathUtils.felt_to_uint256(execution_strategy); - - // Used voting strategies - let used_voting_strats_len = calldata[4 + metadata_uri_len]; - let used_voting_strats = &calldata[5 + metadata_uri_len]; - let (used_voting_strategies_hash) = _get_padded_hash( - used_voting_strats_len, used_voting_strats - ); - - // User voting strategy params flat - let user_voting_strat_params_flat_len = calldata[5 + metadata_uri_len + used_voting_strats_len]; - let user_voting_strat_params_flat = &calldata[6 + metadata_uri_len + used_voting_strats_len]; - let (user_voting_strategy_params_flat_hash) = _get_padded_hash( - user_voting_strat_params_flat_len, user_voting_strat_params_flat - ); - - // Execution hash - let execution_params_len = calldata[6 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let execution_params_ptr: felt* = &calldata[7 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let (execution_hash) = _get_padded_hash(execution_params_len, execution_params_ptr); - - // Now construct the data hash (hashStruct) - let (data: Uint256*) = alloc(); - - assert data[0] = Uint256(PROPOSAL_TYPE_HASH_LOW, PROPOSAL_TYPE_HASH_HIGH); - assert data[1] = auth_address_u256; - assert data[2] = space; - assert data[3] = proposer_address_u256; - assert data[4] = metadata_uri_hash; - assert data[5] = execution_strategy_u256; - assert data[6] = execution_hash; - assert data[7] = used_voting_strategies_hash; - assert data[8] = user_voting_strategy_params_flat_hash; - assert data[9] = salt; - - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(10, data); - - // Prepare the encoded data - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required in order to call `keccak`) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(hash, r, s, v - 27, proposer_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(proposer_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to authorize a session key is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param eth_address Owner's Ethereum Address that was used to create the signature - // @param session_public_key The StarkNet session public key that should be registered - // @param session_duration The number of seconds that the session key is valid - func verify_session_key_auth_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - eth_address: felt, - session_public_key: felt, - session_duration: felt, - ) -> () { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - // Ensure user has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(eth_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - // Encode data - let (eth_address_u256) = MathUtils.felt_to_uint256(eth_address); - - let (session_public_key_u256) = MathUtils.felt_to_uint256(session_public_key); - let (padded_session_public_key) = _pad_right(session_public_key_u256); - - let (session_duration_u256) = MathUtils.felt_to_uint256(session_duration); - - // Now construct the data array - let (data: Uint256*) = alloc(); - assert data[0] = Uint256(SESSION_KEY_INIT_TYPE_HASH_LOW, SESSION_KEY_INIT_TYPE_HASH_HIGH); - assert data[1] = eth_address_u256; - assert data[2] = padded_session_public_key; - assert data[3] = session_duration_u256; - assert data[4] = salt; - - // Hash the data array - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(5, data); - - // Prepend the domain separator hash - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required for the cairo keccak implementation) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (msg_hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(msg_hash, r, s, v - 27, eth_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(eth_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to revoke a session key is valid - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param eth_address Owner's Ethereum Address that was used to create the signature - // @param session_public_key The StarkNet session public key that should be revoked - func verify_session_key_revoke_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - }( - r: Uint256, s: Uint256, v: felt, salt: Uint256, eth_address: felt, session_public_key: felt - ) -> () { - alloc_locals; - - MathUtils.assert_valid_uint256(r); - MathUtils.assert_valid_uint256(s); - MathUtils.assert_valid_uint256(salt); - - // Ensure user has not already used this salt in a previous action - let (already_used) = EIP712_salts.read(eth_address, salt); - with_attr error_message("EIP712: Salt already used") { - assert already_used = 0; - } - - // Encode data - let (session_public_key_u256) = MathUtils.felt_to_uint256(session_public_key); - let (padded_session_public_key) = _pad_right(session_public_key_u256); - - // Now construct the data array - let (data: Uint256*) = alloc(); - assert data[0] = Uint256(SESSION_KEY_REVOKE_TYPE_HASH_LOW, SESSION_KEY_REVOKE_TYPE_HASH_HIGH); - assert data[1] = padded_session_public_key; - assert data[2] = salt; - - // Hash the data array - let (local keccak_ptr: felt*) = alloc(); - let keccak_ptr_start = keccak_ptr; - let (hash_struct) = _get_keccak_hash{keccak_ptr=keccak_ptr}(3, data); - - // Prepend the domain separator hash - let (prepared_encoded: Uint256*) = alloc(); - assert prepared_encoded[0] = Uint256(DOMAIN_HASH_LOW, DOMAIN_HASH_HIGH); - assert prepared_encoded[1] = hash_struct; - - // Prepend the ethereum prefix - let (encoded_data: Uint256*) = alloc(); - _prepend_prefix_2bytes(ETHEREUM_PREFIX, encoded_data, 2, prepared_encoded); - - // Now go from Uint256s to Uint64s (required for the cairo keccak implementation) - let (signable_bytes) = alloc(); - let signable_bytes_start = signable_bytes; - keccak_add_uint256s{inputs=signable_bytes}(n_elements=3, elements=encoded_data, bigend=1); - - // Compute the hash - let (msg_hash) = keccak_bigend{keccak_ptr=keccak_ptr}( - inputs=signable_bytes_start, n_bytes=2 * 32 + 2 - ); - - // `v` is supposed to be `yParity` and not the `v` usually used in the Ethereum world (pre-EIP155). - // We substract `27` because `v` = `{0, 1} + 27` - verify_eth_signature_uint256{keccak_ptr=keccak_ptr}(msg_hash, r, s, v - 27, eth_address); - - // Verify that all the previous keccaks are correct - finalize_keccak(keccak_ptr_start, keccak_ptr); - - // Write the salt to prevent replay attack - EIP712_salts.write(eth_address, salt, 1); - - return (); - } -} - -// -// Private Functions -// - -// Adds a 2 bytes (16 bits) `prefix` to a 16 bytes (128 bits) `value`. -func _add_prefix128{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(value: felt, prefix: felt) -> ( - result: felt, carry: felt -) { - // Shift the prefix by 128 bits - let shifted_prefix = prefix * 2 ** 128; - // `with_prefix` is now 18 bytes long - let with_prefix = shifted_prefix + value; - // Create 2 bytes mask - let overflow_mask = 2 ** 16 - 1; - // Extract the last two bytes of `with_prefix` - let (carry) = bitwise_and(with_prefix, overflow_mask); - // Compute the new number, right shift by 16 - let result = (with_prefix - carry) / 2 ** 16; - return (result, carry); -} - -// Concatenates a 2 bytes long `prefix` and `input` to `output`. -// `input_len` is the number of `Uint256` in `input`. -func _prepend_prefix_2bytes{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}( - prefix: felt, output: Uint256*, input_len: felt, input: Uint256* -) { - if (input_len == 0) { - // Done, simlpy store the prefix in the `.high` part of the last Uint256, and - // make sure we left shift it by 28 (32 - 4) - assert output[0] = Uint256(0, prefix * 16 ** 28); - return (); - } else { - let num = input[0]; - - let (w1, high_carry) = _add_prefix128(num.high, prefix); - let (w0, low_carry) = _add_prefix128(num.low, high_carry); - - let res = Uint256(w0, w1); - assert output[0] = res; - - // Recurse, using the `low_carry` as `prefix` - _prepend_prefix_2bytes(low_carry, &output[1], input_len - 1, &input[1]); - return (); - } -} - -// Computes the `keccak256` hash from an array of `Uint256`. Does NOT call `finalize_keccak`, -// so the caller needs to make she calls `finalize_keccak` on the `keccak_ptr` once she's done -// with it. -func _get_keccak_hash{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: felt*}( - uint256_words_len: felt, uint256_words: Uint256* -) -> (hash: Uint256) { - let (hash) = keccak_uint256s_bigend{keccak_ptr=keccak_ptr}(uint256_words_len, uint256_words); - - return (hash,); -} - -// Returns the number of digits needed to represent `num` in hexadecimal. -// Similar to doing `len(hex(num)[2:])` in Python. -// E.g.: -// - `0x123` will return `3` -// - `0x1` will return `1` -// - `0xa3b1d4` will return `6` -// Notice: Will not work for `0x0` (will return `0` for `0x0` instead of `1`). -func _get_base16_len{range_check_ptr}(num: Uint256) -> (res: felt) { - let (is_eq) = uint256_eq(num, Uint256(0, 0)); - if (is_eq == 1) { - return (0,); - } - let (lt) = uint256_le(Uint256(16 ** 32, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 32, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 32,); - } - let (lt) = uint256_le(Uint256(16 ** 16, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 16, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 16,); - } - let (lt) = uint256_le(Uint256(16 ** 8, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 8, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 8,); - } - let (lt) = uint256_le(Uint256(16 ** 4, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 4, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 4,); - } - let (lt) = uint256_le(Uint256(16 ** 2, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 2, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 2,); - } - let (lt) = uint256_le(Uint256(16 ** 1, 0), num); - if (lt == 1) { - let (divided, _) = uint256_unsigned_div_rem(num, Uint256(16 ** 1, 0)); - let (res_len) = _get_base16_len(divided); - return (res_len + 1,); - } - return (1,); -} - -// Computes `base ** exp` where `base` and `exp` are both `felts` and returns the result as a `Uint256`. -func _u256_pow{range_check_ptr}(base: felt, exp: felt) -> (res: Uint256) { - alloc_locals; - - if (exp == 0) { - // Any number to the power of 0 is 1 - return (Uint256(1, 0),); - } else { - // Compute `base ** exp - 1` - let (recursion) = _u256_pow(base, exp - 1); - - let (uint256_base) = MathUtils.felt_to_uint256(base); - - // Multiply the result by `base` - let (res, overflow) = uint256_mul(recursion, uint256_base); - - with_attr error_message("EIP712: Overflow happened") { - let (no_overflow) = uint256_eq(overflow, Uint256(0, 0)); - assert no_overflow = 1; - } - - return (res,); - } -} - -// Right pads `num` with `0` to make it 32 bytes long. -// E.g: -// - right_pad(0x1) -> (0x0100000000000000000000000000000000000000000000000000000000000000) -// - right_pad(0xaa) -> (0xaa00000000000000000000000000000000000000000000000000000000000000) -func _pad_right{range_check_ptr}(num: Uint256) -> (res: Uint256) { - let (len_base16) = _get_base16_len(num); - - let (_, rem) = unsigned_div_rem(len_base16, 2); - if (rem == 1) { - // Odd-length: add one (a byte is two characters long) - tempvar len_base16 = len_base16 + 1; - } else { - tempvar len_base16 = len_base16; - } - - let base = 16; - let exp = 64 - len_base16; - let (power_16) = _u256_pow(base, exp); - - // Left shift - let (low, high) = uint256_mul(num, power_16); - - with_attr error_message("EIP712: Overflow happened") { - assert high.low = 0; - assert high.high = 0; - } - - return (low,); -} - -func _keccak_ints_sequence{range_check_ptr, bitwise_ptr: BitwiseBuiltin*, keccak_ptr: felt*}( - nb_bytes: felt, sequence_len: felt, sequence: felt* -) -> (res: Uint256) { - return keccak_bigend(inputs=sequence, n_bytes=nb_bytes); -} - -func _get_padded_hash{range_check_ptr, pedersen_ptr: HashBuiltin*}( - input_len: felt, input: felt* -) -> (res: Uint256) { - alloc_locals; - - let (hash) = ArrayUtils.hash(input_len, input); - let (hash_u256) = MathUtils.felt_to_uint256(hash); - let (padded_hash) = _pad_right(hash_u256); - - return (res=padded_hash); -} diff --git a/contracts/starknet/lib/eth_tx.cairo b/contracts/starknet/lib/eth_tx.cairo deleted file mode 100644 index a6e40d7e..00000000 --- a/contracts/starknet/lib/eth_tx.cairo +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.math import assert_not_equal - -// -// @title Ethereum Transaction Authentication Library -// @author SnapshotLabs -// @notice A library to handle the authorization of actions within Snapshot X via transactions with an Ethereum account -// - -// @dev Address of the StarkNet Commit Ethereum contract which acts as the origin address of the messages sent to the contract -@storage_var -func EthTx_starknet_commit_address_store() -> (res: felt) { -} - -// @dev Stores the sender address for each hash committed to the contract -@storage_var -func EthTx_commit_store(hash: felt) -> (address: felt) { -} - -namespace EthTx { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param starknet_commit_address The address of the StarkNet Commit contract on Ethereum - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - starknet_commit_address: felt - ) { - EthTx_starknet_commit_address_store.write(value=starknet_commit_address); - return (); - } - - // @dev Stores a hash that was committed on Ethereum, this should be called by the @l1_handler in the contract only - // @param origin_address The address of the origin Ethereum contract for the L1->L2 message - // @param sender_address The Ethereum address of the user that committed the hash to the StarkNet Commit contract - func commit{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - origin_address: felt, sender_address: felt, hash: felt - ) { - // Check L1 message origin address is equal to the StarkNet Commit address. - let (starknet_commit_address) = EthTx_starknet_commit_address_store.read(); - with_attr error_message("EthTx: Invalid message origin_address address") { - assert origin_address = starknet_commit_address; - } - // Note: If the same hash is committed twice by the same sender, then the mapping will be overwritten but with the same value as before. - EthTx_commit_store.write(hash, sender_address); - return (); - } - - // @dev Checks to see if a commit exists and was made by a specified address, if so clears it from the contract. Otherwise throws - // @param hash The commit hash to consume - // @param sender_address The sender address to check the commit against - func consume_commit{syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*}( - hash: felt, sender_address: felt - ) { - // Check that the hash has been received by the contract from the StarkNet Commit contract - let (stored_address) = EthTx_commit_store.read(hash); - with_attr error_message("EthTx: Hash not yet committed or already executed") { - assert_not_equal(stored_address, 0); - } - // The sender of the commit on L1 must be the same as the address in the calldata. - with_attr error_message("EthTx: Commit made by invalid L1 address") { - assert sender_address = stored_address; - } - EthTx_commit_store.write(hash, 0); - return (); - } -} diff --git a/contracts/starknet/lib/execute.cairo b/contracts/starknet/lib/execute.cairo deleted file mode 100644 index 7565c558..00000000 --- a/contracts/starknet/lib/execute.cairo +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.starknet.common.syscalls import call_contract - -func execute{syscall_ptr: felt*, range_check_ptr}( - target: felt, function_selector: felt, calldata_len: felt, calldata: felt* -) -> () { - call_contract( - contract_address=target, - function_selector=function_selector, - calldata_size=calldata_len, - calldata=calldata, - ); - return (); -} diff --git a/contracts/starknet/lib/general_address.cairo b/contracts/starknet/lib/general_address.cairo deleted file mode 100644 index 4115f646..00000000 --- a/contracts/starknet/lib/general_address.cairo +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT - -// @dev Generalized type used to represent addresses in Snapshot X. Eg Ethereum, Starknet, etc. -struct Address { - value: felt, -} diff --git a/contracts/starknet/lib/math_utils.cairo b/contracts/starknet/lib/math_utils.cairo deleted file mode 100644 index 7a528438..00000000 --- a/contracts/starknet/lib/math_utils.cairo +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.cairo_builtins import BitwiseBuiltin -from starkware.cairo.common.math import unsigned_div_rem, split_felt, assert_nn_le -from starkware.cairo.common.bitwise import bitwise_and -from starkware.cairo.common.uint256 import Uint256, uint256_check - -const MAX_32 = 2 ** 32 - 1; - -const SHIFT_32 = 2 ** 32; -const SHIFT_64 = 2 ** 64; -const SHIFT_96 = 2 ** 96; - -const MASK_4 = 2 ** 32 - 1; -const MASK_3 = 2 ** 64 - 2 ** 32; -const MASK_2 = 2 ** 96 - 2 ** 64; -const MASK_1 = 2 ** 128 - 2 ** 96; - -// -// @title Math Utilities Library -// @author SnapshotLabs -// @notice A library containing various math utilities -// - -namespace MathUtils { - // @dev Converts 4 words of 64 bits each to a Uint256 - // @param word1 1st word (most significant word) - // @param word2 2nd word - // @param word3 3rd word - // @param word4 4th word (least significant word) - // @return uint256 The Uint256 - func words_to_uint256{range_check_ptr}(word1: felt, word2: felt, word3: felt, word4: felt) -> ( - uint256: Uint256 - ) { - let word1_shifted = word1 * SHIFT_64; - let word3_shifted = word3 * SHIFT_64; - let result = Uint256(low=word3_shifted + word4, high=word1_shifted + word2); - MathUtils.assert_valid_uint256(result); - return (result,); - } - - // @dev Converts a felt to a Uint256 - // @param value The felt - // @return uint256 The Uint256 - func felt_to_uint256{range_check_ptr}(value: felt) -> (uint256: Uint256) { - let (high, low) = split_felt(value); - return (Uint256(low=low, high=high),); - } - - // @dev Packs 4 32 bit numbers into a single felt - // @param num1 1st number - // @param num2 2nd number - // @param num3 3rd number - // @param num4 4th number - // @return packed_felt The packed felt - func pack_4_32_bit{range_check_ptr}(num1: felt, num2: felt, num3: felt, num4: felt) -> ( - packed_felt: felt - ) { - with_attr error_message("MathUtils: number too big to be packed") { - assert_nn_le(num1, MAX_32); - assert_nn_le(num2, MAX_32); - assert_nn_le(num3, MAX_32); - assert_nn_le(num4, MAX_32); - } - let packed_felt = num4 + num3 * SHIFT_32 + num2 * SHIFT_64 + num1 * SHIFT_96; - return (packed_felt,); - } - - // @dev Unpacks a felt into 4 32 bit numbers - // @param packed_felt The packed felt - // @return num1 1st number - // @return num2 2nd number - // @return num3 3rd number - // @return num4 4th number - func unpack_4_32_bit{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(packed_felt: felt) -> ( - num1: felt, num2: felt, num3: felt, num4: felt - ) { - let (num4) = bitwise_and(packed_felt, MASK_4); - let (num3) = bitwise_and(packed_felt, MASK_3); - let (num3, _) = unsigned_div_rem(num3, SHIFT_32); - let (num2) = bitwise_and(packed_felt, MASK_2); - let (num2, _) = unsigned_div_rem(num2, SHIFT_64); - let (num1) = bitwise_and(packed_felt, MASK_1); - let (num1, _) = unsigned_div_rem(num1, SHIFT_96); - return (num1, num2, num3, num4); - } - - // @dev Asserts that a uint256 is valid - // @param uint256 The Uint256 - func assert_valid_uint256{range_check_ptr}(uint256: Uint256) { - with_attr error_message("MathUtils: Invalid Uint256") { - uint256_check(uint256); - } - return (); - } -} diff --git a/contracts/starknet/lib/merkle.cairo b/contracts/starknet/lib/merkle.cairo deleted file mode 100644 index 0790c038..00000000 --- a/contracts/starknet/lib/merkle.cairo +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.math_cmp import is_le_felt -from starkware.cairo.common.hash import hash2 - -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title Merkle Proof Library -// @author SnapshotLabs -// @notice A library to to verify merkle proofs -// - -namespace Merkle { - // @dev Asserts a given leaf is a member of the set with the specified root by verifing a proof - // @param root The merkle root of the data - // @param leaf The leaf data array - // @param proof The proof - func assert_valid_leaf{pedersen_ptr: HashBuiltin*, range_check_ptr}( - root: felt, leaf_len: felt, leaf: felt*, proof_len: felt, proof: felt* - ) { - let (leaf_node) = ArrayUtils.hash(leaf_len, leaf); - let (computed_root) = _compute_merkle_root(leaf_node, proof_len, proof); - with_attr error_message("Merkle: Invalid proof") { - assert root = computed_root; - } - return (); - } -} - -func _compute_merkle_root{pedersen_ptr: HashBuiltin*, range_check_ptr}( - curr: felt, proof_len: felt, proof: felt* -) -> (root: felt) { - alloc_locals; - - if (proof_len == 0) { - return (curr,); - } - - let le = is_le_felt(curr, proof[0]); - if (le == 1) { - let (n) = hash2{hash_ptr=pedersen_ptr}(curr, proof[0]); - tempvar node = n; - } else { - let (n) = hash2{hash_ptr=pedersen_ptr}(proof[0], curr); - tempvar node = n; - } - - let (root) = _compute_merkle_root(node, proof_len - 1, &proof[1]); - return (root,); -} diff --git a/contracts/starknet/lib/proposal.cairo b/contracts/starknet/lib/proposal.cairo deleted file mode 100644 index 9821fb2b..00000000 --- a/contracts/starknet/lib/proposal.cairo +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.uint256 import Uint256 - -struct Proposal { - quorum: Uint256, - // timestamps contains the following packed into a single felt (each one is 32 bit): - // snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - timestamps: felt, - execution_strategy: felt, - execution_hash: felt, -} diff --git a/contracts/starknet/lib/proposal_info.cairo b/contracts/starknet/lib/proposal_info.cairo deleted file mode 100644 index e6c0916f..00000000 --- a/contracts/starknet/lib/proposal_info.cairo +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.uint256 import Uint256 - -from contracts.starknet.lib.proposal import Proposal - -struct ProposalInfo { - proposal: Proposal, - power_for: Uint256, - power_against: Uint256, - power_abstain: Uint256, -} diff --git a/contracts/starknet/lib/proposal_outcome.cairo b/contracts/starknet/lib/proposal_outcome.cairo deleted file mode 100644 index 7b3c038f..00000000 --- a/contracts/starknet/lib/proposal_outcome.cairo +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -namespace ProposalOutcome { - const ACCEPTED = 1; - const REJECTED = 2; - const CANCELLED = 3; -} diff --git a/contracts/starknet/lib/session_key.cairo b/contracts/starknet/lib/session_key.cairo deleted file mode 100644 index d6703d4f..00000000 --- a/contracts/starknet/lib/session_key.cairo +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_block_timestamp -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.math import assert_lt, assert_not_zero, assert_nn_le -from starkware.cairo.common.alloc import alloc - -from contracts.starknet.lib.stark_eip191 import StarkEIP191 -from contracts.starknet.lib.eip712 import EIP712 -from contracts.starknet.lib.eth_tx import EthTx -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title Session Key Library -// @author SnapshotLabs -// @notice A library to handle the authorization and revokation of StarkNet session keys from an Ethereum account -// - -// @dev Stores the owner Ethereum address for a given session key -@storage_var -func SessionKey_owner_store(session_public_key: felt) -> (eth_address: felt) { -} - -// @dev Stores the timestamp at which a session key is no longer valid -@storage_var -func SessionKey_end_timestamp_store(session_public_key: felt) -> (timestamp: felt) { -} - -@event -func session_key_registered(eth_address: felt, session_public_key: felt, session_duration: felt) { -} - -@event -func session_key_revoked(session_public_key: felt) { -} - -namespace SessionKey { - // @dev Registers a session key via authorization from an Ethereum EIP712 signature - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param eth_address Owner's Ethereum Address that was used to create the signature - // @param session_public_key The StarkNet session public key that should be registered - // @param session_duration The number of seconds that the session key is valid - func authorize_with_sig{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, - }( - r: Uint256, - s: Uint256, - v: felt, - salt: Uint256, - eth_address: felt, - session_public_key: felt, - session_duration: felt, - ) { - alloc_locals; - - EIP712.verify_session_key_auth_sig( - r, s, v, salt, eth_address, session_public_key, session_duration - ); - _register(eth_address, session_public_key, session_duration); - return (); - } - - // @dev Registers a session key via authorization from an Ethereum transaction - // @dev Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propogated to L2 before calling this function - // @param eth_address Owner's Ethereum Address that was used to commit the hash on Ethereum - // @param session_public_key The StarkNet session public key that should be registered - // @param session_duration The number of seconds that the session key is valid - func authorize_with_tx{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - eth_address: felt, session_public_key: felt, session_duration: felt - ) { - alloc_locals; - let (commit_array: felt*) = alloc(); - assert commit_array[0] = eth_address; - assert commit_array[1] = session_public_key; - assert commit_array[2] = session_duration; - let (commit_hash) = ArrayUtils.hash(3, commit_array); - - // Checks that the hash matches a commit and that the commit was created by the correct address - EthTx.consume_commit(commit_hash, eth_address); - - _register(eth_address, session_public_key, session_duration); - return (); - } - - // @dev Revokes a session key via authorization from a signature from the session key itself - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @param session_public_key The StarkNet session public key that should be revoked - func revoke_with_session_key_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(r: felt, s: felt, salt: felt, session_public_key: felt) { - alloc_locals; - let (eth_address) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(eth_address); - } - StarkEIP191.verify_session_key_revoke_sig(r, s, salt, session_public_key); - _revoke(session_public_key); - return (); - } - - // @dev Revokes a session key via authorization from a signature from the owner Ethereum account - // @param r Signature parameter - // @param s Signature parameter - // @param v Signature parameter - // @param salt Signature salt - // @param session_public_key The StarkNet session public key that should be revoked - func revoke_with_owner_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(r: Uint256, s: Uint256, v: felt, salt: Uint256, session_public_key: felt) { - alloc_locals; - - let (eth_address) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(eth_address); - } - EIP712.verify_session_key_revoke_sig(r, s, v, salt, eth_address, session_public_key); - _revoke(session_public_key); - return (); - } - - // @dev Revokes a session key via authorization from an Ethereum transaction by the owner - // @dev Users must commit a hash to the StarkNet Commit contract on L1 and wait for it to be propogated to L2 before calling this function - // @param session_public_key The StarkNet session public key that should be revoked - func revoke_with_owner_tx{syscall_ptr: felt*, range_check_ptr, pedersen_ptr: HashBuiltin*}( - session_public_key: felt - ) { - alloc_locals; - let (eth_address) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(eth_address); - } - let (commit_array: felt*) = alloc(); - assert commit_array[0] = eth_address; - assert commit_array[1] = session_public_key; - let (commit_hash) = ArrayUtils.hash(2, commit_array); - - // Checks that hash maches a commit and that the commit was created by the correct address - EthTx.consume_commit(commit_hash, eth_address); - - _revoke(session_public_key); - - return (); - } - - // @dev Returns owner of a session key if it exists, otherwise throws - // @param session_public_key The StarkNet session public key - // return owner The owner Ethereum address - func get_owner{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt - ) -> (owner: felt) { - let (owner) = SessionKey_owner_store.read(session_public_key); - with_attr error_message("SessionKey: Session does not exist") { - assert_not_zero(owner); - } - - let (end_timestamp) = SessionKey_end_timestamp_store.read(session_public_key); - let (current_timestamp) = get_block_timestamp(); - with_attr error_message("SessionKey: Session has ended") { - assert_lt(current_timestamp, end_timestamp); - } - return (owner,); - } - - // @dev Asserts that a session key exists and has an owner equal to _owner - // @param session_public_key The StarkNet session public key - // @param _owner An Ethereum address - func assert_valid{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt, _owner: felt - ) { - let (owner) = get_owner(session_public_key); - with_attr error_message("SessionKey: Invalid owner") { - assert _owner = owner; - } - return (); - } -} - -// -// Internal Functions -// - -func _register{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - eth_address: felt, session_public_key: felt, session_duration: felt -) { - // It is valid to give a session duration of zero - if so it means the session is only valid during the same block as when it was registered - let (current_timestamp) = get_block_timestamp(); - let end_timestamp = current_timestamp + session_duration; - with_attr error_message("SessionKey: Invalid session duration") { - // Asserts that 0 <= session_duration <= end_timestamp < RANGE_CHECK_BOUND - assert_nn_le(session_duration, end_timestamp); - } - SessionKey_owner_store.write(session_public_key, eth_address); - SessionKey_end_timestamp_store.write(session_public_key, end_timestamp); - session_key_registered.emit(eth_address, session_public_key, session_duration); - return (); -} - -func _revoke{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - session_public_key: felt -) { - SessionKey_owner_store.write(session_public_key, 0); - session_key_revoked.emit(session_public_key); - return (); -} diff --git a/contracts/starknet/lib/single_slot_proof.cairo b/contracts/starknet/lib/single_slot_proof.cairo deleted file mode 100644 index 5a1bf180..00000000 --- a/contracts/starknet/lib/single_slot_proof.cairo +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, BitwiseBuiltin -from starkware.cairo.common.uint256 import Uint256, uint256_add, uint256_eq -from starkware.cairo.common.math import assert_nn_le - -from contracts.starknet.lib.timestamp import Timestamp -from contracts.starknet.lib.slot_key import SlotKey -from contracts.starknet.lib.math_utils import MathUtils - -// -// @title Ethereum single slot proof library -// @author SnapshotLabs -// @notice A library to prove values from the Ethereum state on StarkNet using the Fossil storage verifier -// - -struct StorageSlot { - word_1: felt, - word_2: felt, - word_3: felt, - word_4: felt, -} - -@contract_interface -namespace IFactsRegistry { - func get_storage_uint( - block: felt, - account_160: felt, - slot: StorageSlot, - proof_sizes_bytes_len: felt, - proof_sizes_bytes: felt*, - proof_sizes_words_len: felt, - proof_sizes_words: felt*, - proofs_concat_len: felt, - proofs_concat: felt*, - ) -> (res: Uint256) { - } -} - -// @dev Stores the address of the Fossil fact registry contract -@storage_var -func SingleSlotProof_fact_registry_store() -> (res: felt) { -} - -namespace SingleSlotProof { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param fact_registry_address Address of the Fossil fact registry contract - // @param l1_headers_store_address Address of the Fossil L1 headers store contract - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - fact_registry_address: felt, l1_headers_store_address: felt - ) { - SingleSlotProof_fact_registry_store.write(value=fact_registry_address); - Timestamp.initializer(l1_headers_store_address); - return (); - } - - // @dev Returns the value of a mapping and block number of the Ethereum state if a valid proof is supplied - // @param timestamp The snapshot timestamp, which will get mapped to a block number - // @param mapping_key The key of the mapping that one wants the value from (eg. _address for balances[_address]) - // @param params Array of parameters required to verify the storage proof - // @param proofs Array containing encoded storage proof data - // @return storage_slot The slot value - func get_storage_slot{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - }( - timestamp: felt, - mapping_key: felt, - params_len: felt, - params: felt*, - proofs_len: felt, - proofs: felt*, - ) -> (storage_slot: Uint256) { - alloc_locals; - let (fact_registry_addr) = SingleSlotProof_fact_registry_store.read(); - - // Mapping timestamp to an ethereum block number - let (eth_block_number) = Timestamp.get_eth_block_number(timestamp); - let eth_block_number = eth_block_number - 1; // temp shift - waiting for Fossil fix - - // Decoding encoded proof data - let ( - slot, - proof_sizes_bytes_len, - proof_sizes_bytes, - proof_sizes_words_len, - proof_sizes_words, - proofs_concat_len, - proofs_concat, - ) = _decode_param_array(proofs_len, proofs); - - // Extracting individual parameters from parameter array - with_attr error_message("SingleSlotProof: Invalid size parameters array") { - assert params_len = 2; - } - // Contract address where the desired slot resides - let contract_address = params[0]; - // Index of the desired slot - let slot_index = params[1]; - - let (valid_slot) = SlotKey.get_mapping_slot_key(slot_index, mapping_key); - let (slot_uint256) = MathUtils.words_to_uint256( - slot.word_1, slot.word_2, slot.word_3, slot.word_4 - ); - with_attr error_message("SingleSlotProof: Invalid slot proof provided") { - // Checking that the slot proof corresponds to the correct slot - assert valid_slot = slot_uint256; - // Calling Fossil Fact Registry to verify the storage proof of the slot value - let (storage_slot) = IFactsRegistry.get_storage_uint( - fact_registry_addr, - eth_block_number, - contract_address, - slot, - proof_sizes_bytes_len, - proof_sizes_bytes, - proof_sizes_words_len, - proof_sizes_words, - proofs_concat_len, - proofs_concat, - ); - } - - let (is_zero) = uint256_eq(Uint256(0, 0), storage_slot); - with_attr error_message("SingleSlotProof: Slot is zero") { - is_zero = 0; - } - - return (storage_slot,); - } -} - -func _decode_param_array{range_check_ptr}(param_array_len: felt, param_array: felt*) -> ( - slot: StorageSlot, - proof_sizes_bytes_len: felt, - proof_sizes_bytes: felt*, - proof_sizes_words_len: felt, - proof_sizes_words: felt*, - proofs_concat_len: felt, - proofs_concat: felt*, -) { - assert_nn_le(5, param_array_len); - let slot: StorageSlot = StorageSlot( - param_array[0], param_array[1], param_array[2], param_array[3] - ); - let num_nodes = param_array[4]; - let proof_sizes_bytes_len = num_nodes; - let proof_sizes_bytes = param_array + 5; - let proof_sizes_words_len = num_nodes; - let proof_sizes_words = param_array + 5 + num_nodes; - let proofs_concat = param_array + 5 + 2 * num_nodes; - let proofs_concat_len = param_array_len - 5 - 2 * num_nodes; - - return ( - slot, - proof_sizes_bytes_len, - proof_sizes_bytes, - proof_sizes_words_len, - proof_sizes_words, - proofs_concat_len, - proofs_concat, - ); -} diff --git a/contracts/starknet/lib/slot_key.cairo b/contracts/starknet/lib/slot_key.cairo deleted file mode 100644 index 7f96cd7f..00000000 --- a/contracts/starknet/lib/slot_key.cairo +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.keccak import unsafe_keccak -from starkware.cairo.common.uint256 import Uint256 -from starkware.cairo.common.math import split_felt - -// -// @title EVM Slot key Library -// @author SnapshotLabs -// @notice A library to find the key of a slot in the EVM -// @notice Currently only has functionality for mappings -// @dev Refer to this section of the Solidity compiler documentation for more information: https://docs.soliditylang.org/en/v0.8.11/internals/layout_in_storage.html -// - -namespace SlotKey { - // @dev Computes the EVM slot key for mappings - // @dev UNSAFE: This is not safe to use in production code due to unsafe keccak - waiting for safe optimized version - // @param slot_index The index of the mapping variable in the contract - // @param mapping_key The key of the mapping in the contract. Key can be any value type as long as it fits inside a felt - func get_mapping_slot_key{range_check_ptr}(slot_index: felt, mapping_key: felt) -> ( - slot_key: Uint256 - ) { - alloc_locals; - let (encoded_array: felt*) = alloc(); - let (slot_index_high, slot_index_low) = split_felt(slot_index); - let (mapping_key_high, mapping_key_low) = split_felt(mapping_key); - encoded_array[0] = mapping_key_high; - encoded_array[1] = mapping_key_low; - encoded_array[2] = slot_index_high; - encoded_array[3] = slot_index_low; - let (low, high) = unsafe_keccak(encoded_array, 64); - let slot_key = Uint256(low=low, high=high); - return (slot_key,); - } -} diff --git a/contracts/starknet/lib/stark_eip191.cairo b/contracts/starknet/lib/stark_eip191.cairo deleted file mode 100644 index 073e2930..00000000 --- a/contracts/starknet/lib/stark_eip191.cairo +++ /dev/null @@ -1,256 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address, get_contract_address -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin -from starkware.cairo.common.math import assert_not_zero -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.signature import verify_ecdsa_signature - -from contracts.starknet.lib.math_utils import MathUtils -from contracts.starknet.lib.array_utils import ArrayUtils - -// -// @title StarkNet EIP191 Library -// @author SnapshotLabs -// @notice A library for verifying StarkNet EIP191 signatures on typed data required for Snapshot X -// @dev Refer to the official EIP for more information: https://eips.ethereum.org/EIPS/eip-191 -// - -// NOTE: We will need to update chain ID for prod -// { name: 'snapshot-x', version: '1', chainId: '0x534e5f474f45524c49'} (chainID: SN_GOERLI) -const DOMAIN_HASH = 0x7b887e96718721a64b601a4873454d4a9e26a4b798d660c8d6b96d2045c8404; - -const STARKNET_MESSAGE = 0x537461726b4e6574204d657373616765; - -// getSelectorFromName("Propose(space:felt,author:felt,metadata_uri:felt*,executor:felt,execution_hash:felt,strategies_hash:felt,strategies_params_hash:felt,salt:felt)") -const PROPOSAL_TYPE_HASH = 0x2092032d2957beaa83248292f326648fd2ad923d97f59c75296e41d924c5355; - -// getSelectorFromName("Vote(space:felt,voter:felt,proposal:felt,choice:felt,strategies_hash:felt,strategies_params_hash:felt,salt:felt)") -const VOTE_TYPE_HASH = 0x31236321e2e03bd76ca3b07ff9544b3d50aa3e677b473a2850a894dcd983781; - -// getSelectorFromName("RevokeSessionKey(salt:felt)") -const REVOKE_SESSION_KEY_TYPE_HASH = 0x31F0BF4E2BBD12ECBA02E325F0EA3231350A638FC633AF8EBF244F50663ACE8; - -// @dev Signature salts store -@storage_var -func StarkEIP191_salts(user: felt, salt: felt) -> (already_used: felt) { -} - -namespace StarkEIP191 { - // @dev Asserts that a signature to create a proposal is valid - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is creating a proposal - // @param calldata Propose calldata - // @public_key The StarkNet key that was used to generate the signature - func verify_propose_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }( - r: felt, - s: felt, - salt: felt, - target: felt, - calldata_len: felt, - calldata: felt*, - public_key: felt, - ) { - alloc_locals; - - let proposer_address = calldata[0]; - - let (authenticator) = get_contract_address(); - - // Ensure proposer has not already used this salt in a previous action - let (already_used) = StarkEIP191_salts.read(proposer_address, salt); - - with_attr error_message("StarkEIP191: Salt already used") { - assert already_used = 0; - } - - // Metadata URI - let metadata_uri_string_len = calldata[1]; - let metadata_uri_len = calldata[2]; - let metadata_uri: felt* = &calldata[3]; - let (metadata_uri_hash) = ArrayUtils.hash(metadata_uri_len, metadata_uri); - - // Execution strategy - let execution_strategy = calldata[3 + metadata_uri_len]; - let (execution_strategy_u256) = MathUtils.felt_to_uint256(execution_strategy); - - // Used voting strategies - let used_voting_strats_len = calldata[4 + metadata_uri_len]; - let used_voting_strats = &calldata[5 + metadata_uri_len]; - let (used_voting_strategies_hash) = ArrayUtils.hash( - used_voting_strats_len, used_voting_strats - ); - - // User voting strategy params flat - let user_voting_strat_params_flat_len = calldata[5 + metadata_uri_len + used_voting_strats_len]; - let user_voting_strat_params_flat = &calldata[6 + metadata_uri_len + used_voting_strats_len]; - let (user_voting_strategy_params_flat_hash) = ArrayUtils.hash( - user_voting_strat_params_flat_len, user_voting_strat_params_flat - ); - - // Execution hash - let execution_params_len = calldata[6 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let execution_params_ptr: felt* = &calldata[7 + metadata_uri_len + used_voting_strats_len + user_voting_strat_params_flat_len]; - let (execution_hash) = ArrayUtils.hash(execution_params_len, execution_params_ptr); - - let (structure: felt*) = alloc(); - - assert structure[0] = PROPOSAL_TYPE_HASH; - assert structure[1] = target; - assert structure[2] = proposer_address; - assert structure[3] = metadata_uri_hash; - assert structure[4] = execution_strategy; - assert structure[5] = execution_hash; - assert structure[6] = used_voting_strategies_hash; - assert structure[7] = user_voting_strategy_params_flat_hash; - assert structure[8] = salt; - - let (hash_struct) = ArrayUtils.hash(9, structure); - - let (message: felt*) = alloc(); - - assert message[0] = STARKNET_MESSAGE; - assert message[1] = DOMAIN_HASH; - assert message[2] = authenticator; - assert message[3] = hash_struct; - - let (message_hash) = ArrayUtils.hash(4, message); - - verify_ecdsa_signature(message_hash, public_key, r, s); - - StarkEIP191_salts.write(proposer_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to cast a vote is valid - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @param target Address of the space contract where the user is casting a vote - // @param calldata Vote calldata - // @public_key The StarkNet key that was used to generate the signature - func verify_vote_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }( - r: felt, - s: felt, - salt: felt, - target: felt, - calldata_len: felt, - calldata: felt*, - public_key: felt, - ) { - alloc_locals; - - let voter_address = calldata[0]; - - let (authenticator) = get_contract_address(); - - // Ensure voter has not already used this salt in a previous action - let (already_used) = StarkEIP191_salts.read(voter_address, salt); - - with_attr error_message("StarkEIP191: Salt already used") { - assert already_used = 0; - } - - let proposal_id = calldata[1]; - let choice = calldata[2]; - - let used_voting_strategies_len = calldata[3]; - let used_voting_strategies = &calldata[4]; - let (used_voting_strategies_hash) = ArrayUtils.hash( - used_voting_strategies_len, used_voting_strategies - ); - - let user_voting_strategy_params_flat_len = calldata[4 + used_voting_strategies_len]; - let user_voting_strategy_params_flat = &calldata[5 + used_voting_strategies_len]; - let (user_voting_strategy_params_flat_hash) = ArrayUtils.hash( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - // Now construct the data hash (hashStruct) - let (structure: felt*) = alloc(); - assert structure[0] = VOTE_TYPE_HASH; - assert structure[1] = target; - assert structure[2] = voter_address; - assert structure[3] = proposal_id; - assert structure[4] = choice; - assert structure[5] = used_voting_strategies_hash; - assert structure[6] = user_voting_strategy_params_flat_hash; - assert structure[7] = salt; - - let (hash_struct) = ArrayUtils.hash(8, structure); - - let (message: felt*) = alloc(); - - assert message[0] = STARKNET_MESSAGE; - assert message[1] = DOMAIN_HASH; - assert message[2] = authenticator; - assert message[3] = hash_struct; - - let (message_hash) = ArrayUtils.hash(4, message); - - verify_ecdsa_signature(message_hash, public_key, r, s); - - StarkEIP191_salts.write(voter_address, salt, 1); - - return (); - } - - // @dev Asserts that a signature to revoke a session key is valid - // @param r Signature parameter - // @param s Signature parameter - // @param salt Signature salt - // @public_key The StarkNet key that was used to generate the signature - func verify_session_key_revoke_sig{ - syscall_ptr: felt*, - range_check_ptr, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(r: felt, s: felt, salt: felt, public_key: felt) { - alloc_locals; - - let (authenticator) = get_contract_address(); - - // Ensure voter has not already used this salt in a previous action - let (already_used) = StarkEIP191_salts.read(public_key, salt); - with_attr error_message("StarkEIP191: Salt already used") { - assert already_used = 0; - } - - // Now construct the data hash (hashStruct) - let (structure: felt*) = alloc(); - assert structure[0] = REVOKE_SESSION_KEY_TYPE_HASH; - assert structure[1] = salt; - - let (hash_struct) = ArrayUtils.hash(2, structure); - - let (message: felt*) = alloc(); - - assert message[0] = STARKNET_MESSAGE; - assert message[1] = DOMAIN_HASH; - assert message[2] = authenticator; - assert message[3] = hash_struct; - - let (message_hash) = ArrayUtils.hash(4, message); - - verify_ecdsa_signature(message_hash, public_key, r, s); - - StarkEIP191_salts.write(public_key, salt, 1); - - return (); - } -} diff --git a/contracts/starknet/lib/timestamp.cairo b/contracts/starknet/lib/timestamp.cairo deleted file mode 100644 index 1bc2fe71..00000000 --- a/contracts/starknet/lib/timestamp.cairo +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin - -// -// @title Timestamp Resolver Library -// @author SnapshotLabs -// @notice Snapshot X uses timestamps for a proposal snapshot, however certain voting strategies require Ethereum block numbers -// @notice This library provides the functionality to resolve timestamps to Ethereum block numbers with a one-to-one mapping -// - -@contract_interface -namespace IL1HeadersStore { - func get_latest_l1_block() -> (number: felt) { - } -} - -// @dev Stores the address of the Fossil L1 Headers Store contract -@storage_var -func Timestamp_l1_headers_store() -> (res: felt) { -} - -// @dev Stores the timestamp to Ethereum block number mapping -@storage_var -func Timestamp_timestamp_to_eth_block_number_store(timestamp: felt) -> (eth_block_number: felt) { -} - -namespace Timestamp { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param l1_headers_store_address Address of the Fossil L1 headers store contract - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - l1_headers_store_address: felt - ) { - Timestamp_l1_headers_store.write(value=l1_headers_store_address); - return (); - } - - // @dev Resolves a provided timestamp to an Ethereum block number with a one-to-one mapping - // @dev timestamp The timestamp that should be resolved - // @return eth_block_number The Ethereum block number - func get_eth_block_number{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - timestamp: felt - ) -> (eth_block_number: felt) { - let (eth_block_number) = Timestamp_timestamp_to_eth_block_number_store.read(timestamp); - if (eth_block_number != 0) { - // The timestamp has already be queried in fossil and stored. Therefore we can just return the stored value - // This branch will be taken whenever a vote is cast as the mapping value would be set at proposal creation. - return (eth_block_number,); - } else { - // The timestamp has not yet been queried in fossil. Therefore we must query Fossil for the latest eth block - // number stored there and store it here in the mapping indexed by the timestamp provided. - // This branch will be taken whenever a proposal is created, except for the (rare) case of multiple proposals - // being created in the same block. - let (l1_headers_store_address) = Timestamp_l1_headers_store.read(); - let (eth_block_number) = IL1HeadersStore.get_latest_l1_block(l1_headers_store_address); - Timestamp_timestamp_to_eth_block_number_store.write(timestamp, eth_block_number); - return (eth_block_number,); - } - } -} diff --git a/contracts/starknet/lib/vote.cairo b/contracts/starknet/lib/vote.cairo deleted file mode 100644 index b4fc875a..00000000 --- a/contracts/starknet/lib/vote.cairo +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.cairo.common.uint256 import Uint256 - -struct Vote { - choice: felt, - voting_power: Uint256, -} diff --git a/contracts/starknet/lib/voting.cairo b/contracts/starknet/lib/voting.cairo deleted file mode 100644 index e75764b7..00000000 --- a/contracts/starknet/lib/voting.cairo +++ /dev/null @@ -1,1154 +0,0 @@ -// SPDX-License-Identifier: MIT - -%lang starknet - -from starkware.starknet.common.syscalls import get_caller_address, get_block_timestamp, get_tx_info -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.uint256 import Uint256, uint256_add, uint256_lt, uint256_le, uint256_eq -from starkware.cairo.common.bool import TRUE, FALSE -from starkware.cairo.common.hash_state import hash_init, hash_update -from starkware.cairo.common.math_cmp import is_le -from starkware.cairo.common.math import assert_lt, assert_le, assert_nn, assert_not_zero - -from openzeppelin.account.library import Account, AccountCallArray, Call -from openzeppelin.security.safemath.library import SafeUint256 - -from contracts.starknet.Interfaces.IVotingStrategy import IVotingStrategy -from contracts.starknet.Interfaces.IExecutionStrategy import IExecutionStrategy -from contracts.starknet.lib.general_address import Address -from contracts.starknet.lib.proposal import Proposal -from contracts.starknet.lib.proposal_info import ProposalInfo -from contracts.starknet.lib.vote import Vote -from contracts.starknet.lib.choice import Choice -from contracts.starknet.lib.proposal_outcome import ProposalOutcome -from contracts.starknet.lib.array_utils import ArrayUtils, Immutable2DArray -from contracts.starknet.lib.math_utils import MathUtils - -// -// @title Snapshot X Voting Library -// @author SnapshotLabs -// @notice Library that implements the core functionality of Snapshot X -// - -// -// Storage -// - -@storage_var -func Voting_voting_delay_store() -> (delay: felt) { -} - -@storage_var -func Voting_min_voting_duration_store() -> (period: felt) { -} - -@storage_var -func Voting_max_voting_duration_store() -> (period: felt) { -} - -@storage_var -func Voting_proposal_threshold_store() -> (threshold: Uint256) { -} - -@storage_var -func Voting_quorum_store() -> (value: Uint256) { -} - -@storage_var -func Voting_authenticators_store(authenticator_address: felt) -> (is_valid: felt) { -} - -@storage_var -func Voting_execution_strategies_store(execution_strategy_address: felt) -> (is_valid: felt) { -} - -@storage_var -func Voting_voting_strategies_store(strategy_index: felt) -> (strategy_address: felt) { -} - -@storage_var -func Voting_num_voting_strategies_store() -> (num: felt) { -} - -@storage_var -func Voting_voting_strategy_params_store(strategy_index: felt, param_index: felt) -> (param: felt) { -} - -@storage_var -func Voting_next_proposal_nonce_store() -> (nonce: felt) { -} - -@storage_var -func Voting_proposal_registry_store(proposal_id: felt) -> (proposal: Proposal) { -} - -@storage_var -func Voting_executed_proposals_store(proposal_id: felt) -> (executed: felt) { -} - -@storage_var -func Voting_vote_registry_store(proposal_id: felt, voter_address: Address) -> (voted: felt) { -} - -@storage_var -func Voting_vote_power_store(proposal_id: felt, choice: felt) -> (power: Uint256) { -} - -// -// Events -// - -@event -func proposal_created( - proposal_id: felt, - proposer_address: Address, - proposal: Proposal, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_params_len: felt, - execution_params: felt*, -) { -} - -@event -func vote_created(proposal_id: felt, voter_address: Address, vote: Vote) { -} - -@event -func quorum_updated(previous: Uint256, new_quorum: Uint256) { -} - -@event -func voting_delay_updated(previous: felt, new_voting_delay: felt) { -} - -@event -func min_voting_duration_updated(previous: felt, new_voting_duration: felt) { -} - -@event -func max_voting_duration_updated(previous: felt, new_voting_duration: felt) { -} - -@event -func proposal_threshold_updated(previous: Uint256, new_proposal_threshold: Uint256) { -} - -@event -func metadata_uri_updated(new_metadata_uri_len: felt, new_metadata_uri: felt*) { -} - -@event -func authenticators_added(added_len: felt, added: felt*) { -} - -@event -func authenticators_removed(removed_len: felt, removed: felt*) { -} - -@event -func execution_strategies_added(added_len: felt, added: felt*) { -} - -@event -func execution_strategies_removed(removed_len: felt, removed: felt*) { -} - -@event -func voting_strategies_added(added_len: felt, added: felt*) { -} - -@event -func voting_strategies_removed(removed_len: felt, removed: felt*) { -} - -namespace Voting { - // @dev Initializes the library, must be called in the constructor of contracts that use the library - // @param voting_delay The delay between when a proposal is created, and when the voting starts - // @param min_voting_duration The minimum duration of the voting period - // @param max_voting_duration The maximum duration of the voting period - // @param proposal_threshold The minimum amount of voting power needed to be able to create a new proposal in the space - // @param quorum The minimum total voting power required for a proposal to pass - // @param voting_strategies Array of whitelisted voting strategy contract addresses - // @param voting_strategy_params_flat Flattened 2D array of voting strategy parameters - // @param authenticators Array of whitelisted authenticator contract addresses - // @param execution_strategies Array of whitelisted execution strategy contract addresses - func initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - voting_delay: felt, - min_voting_duration: felt, - max_voting_duration: felt, - proposal_threshold: Uint256, - quorum: Uint256, - voting_strategies_len: felt, - voting_strategies: felt*, - voting_strategy_params_flat_len: felt, - voting_strategy_params_flat: felt*, - authenticators_len: felt, - authenticators: felt*, - execution_strategies_len: felt, - execution_strategies: felt*, - ) { - alloc_locals; - - with_attr error_message("Voting: Invalid constructor parameters") { - assert_nn(voting_delay); - assert_le(min_voting_duration, max_voting_duration); - assert_not_zero(voting_strategies_len); - assert_not_zero(authenticators_len); - assert_not_zero(execution_strategies_len); - MathUtils.assert_valid_uint256(proposal_threshold); - MathUtils.assert_valid_uint256(quorum); - } - - // Initialize the storage variables - Voting_voting_delay_store.write(voting_delay); - Voting_min_voting_duration_store.write(min_voting_duration); - Voting_max_voting_duration_store.write(max_voting_duration); - Voting_proposal_threshold_store.write(proposal_threshold); - Voting_quorum_store.write(quorum); - - // Reconstruct the voting params 2D array (1 sub array per strategy) from the flattened version. - // Currently there is no way to pass struct types with pointers in calldata, so we must do it this way. - let (voting_strategy_params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - voting_strategy_params_flat_len, voting_strategy_params_flat - ); - - _unchecked_add_voting_strategies( - voting_strategies_len, voting_strategies, voting_strategy_params_all - ); - _unchecked_add_authenticators(authenticators_len, authenticators); - _unchecked_add_execution_strategies(execution_strategies_len, execution_strategies); - - // The first proposal in a space will have a proposal ID of 1. - Voting_next_proposal_nonce_store.write(1); - - return (); - } - - // @dev Updates the quorum - // @param new_quorum The new quorum - func update_quorum{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_quorum: Uint256 - ) { - MathUtils.assert_valid_uint256(new_quorum); - let (previous_quorum) = Voting_quorum_store.read(); - Voting_quorum_store.write(new_quorum); - quorum_updated.emit(previous_quorum, new_quorum); - return (); - } - - // @dev Updates the voting delay - // @param new_voting_delay The new voting delay - func update_voting_delay{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_voting_delay: felt - ) { - let (previous_delay) = Voting_voting_delay_store.read(); - Voting_voting_delay_store.write(new_voting_delay); - voting_delay_updated.emit(previous_delay, new_voting_delay); - return (); - } - - // @dev Updates the minimum voting duration - // @param new_min_voting_duration The new minimum voting duration - func update_min_voting_duration{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(new_min_voting_duration: felt) { - let (previous_min_voting_duration) = Voting_min_voting_duration_store.read(); - let (max_voting_duration) = Voting_max_voting_duration_store.read(); - with_attr error_message( - "Voting: Min voting duration must be less than max voting duration") { - assert_le(new_min_voting_duration, max_voting_duration); - } - Voting_min_voting_duration_store.write(new_min_voting_duration); - min_voting_duration_updated.emit(previous_min_voting_duration, new_min_voting_duration); - return (); - } - - // @dev Updates the maximum voting duration - // @param new_max_voting_duration The new maximum voting duration - func update_max_voting_duration{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(new_max_voting_duration: felt) { - let (previous_max_voting_duration) = Voting_max_voting_duration_store.read(); - let (min_voting_duration) = Voting_min_voting_duration_store.read(); - with_attr error_message( - "Voting: Max voting duration must be greater than min voting duration") { - assert_le(min_voting_duration, new_max_voting_duration); - } - Voting_max_voting_duration_store.write(new_max_voting_duration); - max_voting_duration_updated.emit(previous_max_voting_duration, new_max_voting_duration); - return (); - } - - // @dev Updates the proposal threshold - // @param new_proposal_threshold The new proposal threshold - func update_proposal_threshold{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(new_proposal_threshold: Uint256) { - MathUtils.assert_valid_uint256(new_proposal_threshold); - let (previous_proposal_threshold) = Voting_proposal_threshold_store.read(); - Voting_proposal_threshold_store.write(new_proposal_threshold); - proposal_threshold_updated.emit(previous_proposal_threshold, new_proposal_threshold); - return (); - } - - // @dev Updates the metadata URI - // @param new_metadata_uri The new metadata URI - // @notice We do not store the metadata URI in the contract state, it is just emitted as an event which allows it to be picked up by an indexer - func update_metadata_uri{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - new_metadata_uri_len: felt, new_metadata_uri: felt* - ) { - alloc_locals; - metadata_uri_updated.emit(new_metadata_uri_len, new_metadata_uri); - return (); - } - - // @dev Adds execution strategy contracts to the whitelist - // @param addresses Array of execution strategy contract addresses - func add_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*) { - alloc_locals; - _unchecked_add_execution_strategies(addresses_len, addresses); - execution_strategies_added.emit(addresses_len, addresses); - return (); - } - - // @dev Removes execution strategy contracts from the whitelist - // @param addresses Array of execution strategy contract addresses - func remove_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*) { - alloc_locals; - _unchecked_remove_execution_strategies(addresses_len, addresses); - execution_strategies_removed.emit(addresses_len, addresses); - return (); - } - - // @dev Adds voting strategy contracts to the whitelist - // @param addresses Array of voting strategy contract addresses - // @param params_flat Flattened 2D array of voting strategy parameters - func add_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*, params_flat_len: felt, params_flat: felt*) { - alloc_locals; - _assert_no_active_proposal(); - let (params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - params_flat_len, params_flat - ); - _unchecked_add_voting_strategies(addresses_len, addresses, params_all); - voting_strategies_added.emit(addresses_len, addresses); - return (); - } - - // @dev Removes voting strategy contracts from the whitelist - // @param indexes Array of voting strategy indexes to remove - func remove_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(indexes_len: felt, indexes: felt*) { - alloc_locals; - _assert_no_active_proposal(); - _unchecked_remove_voting_strategies(indexes_len, indexes); - voting_strategies_removed.emit(indexes_len, indexes); - return (); - } - - // @dev Adds authenticator contracts to the whitelist - // @param addresses Array of authenticator contract addresses - func add_authenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - addresses_len: felt, addresses: felt* - ) { - alloc_locals; - _assert_no_active_proposal(); - _unchecked_add_authenticators(addresses_len, addresses); - authenticators_added.emit(addresses_len, addresses); - return (); - } - - // @dev Removes authenticator contracts from the whitelist - // @param addresses Array of authenticator contract addresses - func remove_authenticators{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt - }(addresses_len: felt, addresses: felt*) { - alloc_locals; - _assert_no_active_proposal(); - _unchecked_remove_authenticators(addresses_len, addresses); - authenticators_removed.emit(addresses_len, addresses); - return (); - } - - // @dev Casts a vote on a proposal - // @param voter_address The address of the voter - // @param proposal_id The ID of the proposal in the space - // @param choice The voter's choice (FOR, AGAINST, ABSTAIN) - // @used_voting_strategies The voting strategies (within the whitelist for the space) that the voter has non-zero voting power with - // @user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used - func vote{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr: felt, - }( - voter_address: Address, - proposal_id: felt, - choice: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - ) -> () { - alloc_locals; - - // Verify that the caller is the authenticator contract. - _assert_valid_authenticator(); - - // Make sure proposal has not already been executed - with_attr error_message("Voting: Proposal already executed") { - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - assert has_been_executed = 0; - } - - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - - // Unpacking the timestamps from the packed value - let ( - snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - ) = MathUtils.unpack_4_32_bit(proposal.timestamps); - - with_attr error_message("Voting: Proposal does not exist") { - // Asserting start timestamp is not zero because start timestamp - // is necessarily > 0 when creating a new proposal. - assert_not_zero(start_timestamp); - } - - let (current_timestamp) = get_block_timestamp(); - // Make sure proposal is still open for voting - with_attr error_message("Voting: Voting period has ended") { - assert_lt(current_timestamp, max_end_timestamp); - } - - // Make sure proposal has started - with_attr error_message("Voting: Voting has not started yet") { - assert_le(start_timestamp, current_timestamp); - } - - // Make sure voter has not already voted - let (prev_vote) = Voting_vote_registry_store.read(proposal_id, voter_address); - with_attr error_message("Voting: User already voted") { - assert prev_vote = 0; - } - - // Make sure `choice` is a valid choice - with_attr error_message("Voting: Invalid choice") { - assert (choice - Choice.ABSTAIN) * (choice - Choice.FOR) * (choice - Choice.AGAINST) = 0; - } - - // Reconstruct the voting params 2D array (1 sub array per strategy) from the flattened version. - let (user_voting_strategy_params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - let (user_voting_power) = _get_cumulative_voting_power( - snapshot_timestamp, - voter_address, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_all, - 0, - ); - - let (no_voting_power) = uint256_eq(Uint256(0, 0), user_voting_power); - with_attr error_message("Voting: No voting power for user") { - assert no_voting_power = 0; - } - - let (previous_voting_power) = Voting_vote_power_store.read(proposal_id, choice); - with_attr error_message("Voting: Overflow in voting power") { - let (new_voting_power) = SafeUint256.add(user_voting_power, previous_voting_power); - } - - Voting_vote_power_store.write(proposal_id, choice, new_voting_power); - Voting_vote_registry_store.write(proposal_id, voter_address, 1); - - // Emit event - let vote = Vote(choice=choice, voting_power=user_voting_power); - vote_created.emit(proposal_id, voter_address, vote); - - return (); - } - - // @dev Creates a proposal - // @param proposer_address The address of the proposal creator - // @param metadata_uri_string_len The string length of the metadata URI (required for keccak hashing) - // @param metadata_uri The metadata URI for the proposal - // @param used_voting_strategies The voting strategies (within the whitelist for the space) that the proposal creator has non-zero voting power with - // @param user_voting_strategy_params_flat Flattened 2D array of parameters for the voting strategies used - // @param execution_params Execution parameters for the proposal - func propose{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposer_address: Address, - metadata_uri_string_len: felt, - metadata_uri_len: felt, - metadata_uri: felt*, - execution_strategy: felt, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_flat_len: felt, - user_voting_strategy_params_flat: felt*, - execution_params_len: felt, - execution_params: felt*, - ) -> () { - alloc_locals; - - // Verify that the caller is the authenticator contract. - _assert_valid_authenticator(); - - // Verify that the execution strategy address is one of the whitelisted addresses - _assert_valid_execution_strategy(execution_strategy); - - // The snapshot for the proposal is the current timestamp at proposal creation - // We use a timestamp instead of a block number to define a snapshot so that the system can generalize to multi-chain - // TODO: Need to consider what sort of guarantees we have on the timestamp returned being correct. - let (snapshot_timestamp) = get_block_timestamp(); - let (delay) = Voting_voting_delay_store.read(); - - let (min_voting_duration) = Voting_min_voting_duration_store.read(); - let (max_voting_duration) = Voting_max_voting_duration_store.read(); - - // Define start_timestamp, min_end and max_end - let start_timestamp = snapshot_timestamp + delay; - let min_end_timestamp = start_timestamp + min_voting_duration; - let max_end_timestamp = start_timestamp + max_voting_duration; - - // Reconstruct the voting params 2D array (1 sub array per strategy) from the flattened version. - let (user_voting_strategy_params_all: Immutable2DArray) = ArrayUtils.construct_array2d( - user_voting_strategy_params_flat_len, user_voting_strategy_params_flat - ); - - let (voting_power) = _get_cumulative_voting_power( - snapshot_timestamp, - proposer_address, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_all, - 0, - ); - - // Verify that the proposer has enough voting power to trigger a proposal - let (threshold) = Voting_proposal_threshold_store.read(); - let (has_enough_vp) = uint256_le(threshold, voting_power); - with_attr error_message("Voting: Not enough voting power") { - assert has_enough_vp = 1; - } - - // Hash the execution params - // Storing arrays inside a struct is impossible so instead we just store a hash and then reconstruct the array in finalize_proposal - let (execution_hash) = ArrayUtils.hash(execution_params_len, execution_params); - - let (quorum) = Voting_quorum_store.read(); - - // Packing the timestamps into a single felt to reduce storage usage - let (packed_timestamps) = MathUtils.pack_4_32_bit( - snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - ); - - // Create the proposal and its proposal id - let proposal = Proposal(quorum, packed_timestamps, execution_strategy, execution_hash); - - let (proposal_id) = Voting_next_proposal_nonce_store.read(); - - // Store the proposal - Voting_proposal_registry_store.write(proposal_id, proposal); - - // Emit event - proposal_created.emit( - proposal_id, - proposer_address, - proposal, - metadata_uri_len, - metadata_uri, - execution_params_len, - execution_params, - ); - - // Increase the proposal nonce - Voting_next_proposal_nonce_store.write(proposal_id + 1); - - return (); - } - - // @dev Finalizes a proposal, triggering execution via the chosen execution strategy - // @param proposal_id The ID of the proposal - // @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) - @external - func finalize_proposal{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - range_check_ptr, - bitwise_ptr: BitwiseBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - }(proposal_id: felt, execution_params_len: felt, execution_params: felt*) { - alloc_locals; - - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - - // Make sure proposal has not already been executed - with_attr error_message("Voting: Proposal already executed") { - assert has_been_executed = 0; - } - - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - - // Unpacking the the timestamps from the packed value - let ( - snapshot_timestamp, start_timestamp, min_end_timestamp, max_end_timestamp - ) = MathUtils.unpack_4_32_bit(proposal.timestamps); - - with_attr error_message("Voting: Invalid proposal id") { - // Checks that the proposal id exists. If it doesn't exist, then the whole `Proposal` struct will - // be set to 0, hence the snapshot timestamp will be set to 0 too. - assert_not_zero(snapshot_timestamp); - } - - // Make sure proposal period has ended - let (current_timestamp) = get_block_timestamp(); - with_attr error_message("Voting: Min voting period has not elapsed") { - assert_le(min_end_timestamp, current_timestamp); - } - - // Make sure execution params match the ones sent at proposal creation by checking that the hashes match - let (recovered_hash) = ArrayUtils.hash(execution_params_len, execution_params); - with_attr error_message("Voting: Invalid execution parameters") { - assert recovered_hash = proposal.execution_hash; - } - - // Count votes for - let (for) = Voting_vote_power_store.read(proposal_id, Choice.FOR); - - // Count votes abstaining - let (abstain) = Voting_vote_power_store.read(proposal_id, Choice.ABSTAIN); - - // Count votes against - let (against) = Voting_vote_power_store.read(proposal_id, Choice.AGAINST); - - let (partial_power, overflow1) = uint256_add(for, abstain); - - let (total_power, overflow2) = uint256_add(partial_power, against); - - let quorum = proposal.quorum; - let (is_lower_or_equal) = uint256_le(quorum, total_power); - - // If overflow1 or overflow2 happened, then quorum has necessarily been reached because `quorum` is by definition smaller or equal to Uint256::MAX. - // If `is_lower_or_equal` (meaning `_quorum` is smaller than `total_power`), then quorum has been reached (definition of quorum). - // So if `overflow1 || overflow2 || is_lower_or_equal`, we have reached quorum. If we sum them and find `0`, then they're all equal to 0, which means - // quorum has not been reached. - if (overflow1 + overflow2 + is_lower_or_equal == 0) { - let voting_period_has_ended = is_le(max_end_timestamp, current_timestamp + 1); - if (voting_period_has_ended == FALSE) { - with_attr error_message("Voting: Quorum has not been reached") { - assert 1 = 0; - return (); - } - } else { - // Voting period has ended but quorum hasn't been reached: proposal should be `REJECTED` - tempvar proposal_outcome = ProposalOutcome.REJECTED; - - // Cairo trick to prevent revoked reference - tempvar range_check_ptr = range_check_ptr; - } - } else { - // Quorum has been reached: set proposal outcome accordingly - // Note: The proposal is rejected if for and against votes are equal. - let (has_passed) = uint256_lt(against, for); - - if (has_passed == 1) { - tempvar proposal_outcome = ProposalOutcome.ACCEPTED; - } else { - tempvar proposal_outcome = ProposalOutcome.REJECTED; - } - - // Cairo trick to prevent revoked reference - tempvar range_check_ptr = range_check_ptr; - } - - let (is_valid) = Voting_execution_strategies_store.read(proposal.execution_strategy); - if (is_valid == 0) { - // execution_strategy has been removed from the whitelist. Cancel this execution. - tempvar proposal_outcome = ProposalOutcome.CANCELLED; - } else { - // Cairo trick to prevent revoked reference - tempvar proposal_outcome = proposal_outcome; - } - - // Execute proposal Transactions - // There are 2 situations: - // 1) Starknet execution strategy - then txs are executed directly by this contract. - // 2) Other execution strategy - then tx are executed by the specified execution strategy contract. - - if (proposal.execution_strategy == 1) { - // Starknet execution strategy so we execute the proposal txs directly - if (proposal_outcome == ProposalOutcome.ACCEPTED) { - let (call_array_len, call_array, calldata_len, calldata) = _decode_execution_params( - execution_params_len, execution_params - ); - let (response_len, response) = _execute_proposal_txs( - call_array_len, call_array, calldata_len, calldata - ); - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - tempvar ecdsa_ptr = ecdsa_ptr; - tempvar bitwise_ptr = bitwise_ptr; - } else { - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - tempvar ecdsa_ptr = ecdsa_ptr; - tempvar bitwise_ptr = bitwise_ptr; - } - } else { - // Other execution strategy, so we forward the txs to the specified execution strategy contract. - IExecutionStrategy.execute( - contract_address=proposal.execution_strategy, - proposal_outcome=proposal_outcome, - execution_params_len=execution_params_len, - execution_params=execution_params, - ); - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - tempvar ecdsa_ptr = ecdsa_ptr; - tempvar bitwise_ptr = bitwise_ptr; - } - - // Flag this proposal as executed - Voting_executed_proposals_store.write(proposal_id, 1); - - return (); - } - - // @dev Cancels a proposal - // @param proposal_id The ID of the proposal - // @param execution_params Execution parameters for the proposal (must be the same as those submitted during proposal creation) - func cancel_proposal{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, execution_params_len: felt, execution_params: felt* - ) { - alloc_locals; - - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - - // Make sure proposal has not already been executed - with_attr error_message("Voting: Proposal already executed") { - assert has_been_executed = 0; - } - - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - with_attr error_message("Voting: Invalid proposal id") { - // Checks that the proposal id exists. If it doesn't exist, then the whole `Proposal` struct will - // be set to 0, hence the timestamps value will be set to 0 too. - assert_not_zero(proposal.timestamps); - } - - // Make sure execution params match the ones sent at proposal creation by checking that the hashes match - let (recovered_hash) = ArrayUtils.hash(execution_params_len, execution_params); - with_attr error_message("Voting: Invalid execution parameters") { - assert recovered_hash = proposal.execution_hash; - } - - let proposal_outcome = ProposalOutcome.CANCELLED; - - if (proposal.execution_strategy != 1) { - // Custom execution strategies may have different processes to follow when a proposal is cancelled. - // Therefore, we still forward the execution payload to the specified strategy contract. - IExecutionStrategy.execute( - contract_address=proposal.execution_strategy, - proposal_outcome=proposal_outcome, - execution_params_len=execution_params_len, - execution_params=execution_params, - ); - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - } else { - // In the case of starknet execution we do nothing if the proposal is cancelled. - tempvar syscall_ptr = syscall_ptr; - tempvar pedersen_ptr = pedersen_ptr; - tempvar range_check_ptr = range_check_ptr; - } - - // Flag this proposal as executed - Voting_executed_proposals_store.write(proposal_id, 1); - - return (); - } - - // @dev Checks to see whether a given address has voted in a proposal - // @param proposal_id The proposal ID - // @param voter_address The voter's address - // @return voted 1 if user has voted, otherwise 0 - func has_voted{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt, voter_address: Address - ) -> (voted: felt) { - return Voting_vote_registry_store.read(proposal_id, voter_address); - } - - // @dev Returns proposal information - // @param proposal_id The proposal ID - // @return proposal_info Struct containing proposal information - func get_proposal_info{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt}( - proposal_id: felt - ) -> (proposal_info: ProposalInfo) { - let (proposal) = Voting_proposal_registry_store.read(proposal_id); - with_attr error_message("Voting: Proposal does not exist") { - assert_not_zero(proposal.timestamps); - } - - let (power_against) = Voting_vote_power_store.read(proposal_id, Choice.AGAINST); - let (power_for) = Voting_vote_power_store.read(proposal_id, Choice.FOR); - let (power_abstain) = Voting_vote_power_store.read(proposal_id, Choice.ABSTAIN); - return ( - ProposalInfo(proposal=proposal, power_for=power_for, power_against=power_against, power_abstain=power_abstain), - ); - } -} - -// -// Internal Functions -// - -func _unchecked_add_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(addresses_len: felt, addresses: felt*) { - if (addresses_len == 0) { - return (); - } else { - Voting_execution_strategies_store.write(addresses[0], 1); - _unchecked_add_execution_strategies(addresses_len - 1, &addresses[1]); - return (); - } -} - -func _unchecked_remove_execution_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(addresses_len: felt, addresses: felt*) { - if (addresses_len == 0) { - return (); - } else { - Voting_execution_strategies_store.write(addresses[0], 0); - _unchecked_remove_execution_strategies(addresses_len - 1, &addresses[1]); - return (); - } -} - -func _unchecked_add_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(addresses_len: felt, addresses: felt*, params_all: Immutable2DArray) { - alloc_locals; - let (prev_index) = Voting_num_voting_strategies_store.read(); - _unchecked_add_voting_strategies_recurse(addresses_len, addresses, params_all, prev_index, 0); - // Incrementing the voting strategies counter by the number of strategies added - Voting_num_voting_strategies_store.write(prev_index + addresses_len); - return (); -} - -func _unchecked_add_voting_strategies_recurse{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}( - addresses_len: felt, - addresses: felt*, - params_all: Immutable2DArray, - next_index: felt, - index: felt, -) { - alloc_locals; - if (addresses_len == 0) { - return (); - } else { - Voting_voting_strategies_store.write(next_index, addresses[0]); - // Extract voting params for the voting strategy - let (params_len, params) = ArrayUtils.get_sub_array(params_all, index); - // We store the length of the voting strategy params array at index zero - Voting_voting_strategy_params_store.write(next_index, 0, params_len); - // The following elements are the actual params - _unchecked_add_voting_strategy_params(next_index, 1, params_len, params); - _unchecked_add_voting_strategies_recurse( - addresses_len - 1, &addresses[1], params_all, next_index + 1, index + 1 - ); - return (); - } -} - -func _unchecked_add_voting_strategy_params{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(strategy_index: felt, param_index: felt, params_len: felt, params: felt*) { - if (params_len == 0) { - // List is empty - return (); - } else { - // Store voting parameter - Voting_voting_strategy_params_store.write(strategy_index, param_index, params[0]); - _unchecked_add_voting_strategy_params( - strategy_index, param_index + 1, params_len - 1, ¶ms[1] - ); - return (); - } -} - -func _unchecked_remove_voting_strategies{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(indexes_len: felt, indexes: felt*) { - if (indexes_len == 0) { - return (); - } else { - Voting_voting_strategies_store.write(indexes[0], 0); - // The length of the voting strategy params is stored at index zero - let (params_len) = Voting_voting_strategy_params_store.read(indexes[0], 0); - Voting_voting_strategy_params_store.write(indexes[0], 0, 0); - // Removing voting strategy params - _unchecked_remove_voting_strategy_params(indexes[0], params_len, 1); - _unchecked_remove_voting_strategies(indexes_len - 1, &indexes[1]); - return (); - } -} - -func _unchecked_remove_voting_strategy_params{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(strategy_index: felt, param_index: felt, params_len: felt) { - if (params_len == 0) { - // List is empty - return (); - } - if (param_index == params_len + 1) { - // All params have been removed from the array - return (); - } - // Remove voting parameter - Voting_voting_strategy_params_store.write(strategy_index, param_index, 0); - _unchecked_remove_voting_strategy_params(strategy_index, param_index + 1, params_len); - return (); -} - -func _unchecked_add_authenticators{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - addresses_len: felt, addresses: felt* -) { - if (addresses_len == 0) { - return (); - } else { - Voting_authenticators_store.write(addresses[0], 1); - _unchecked_add_authenticators(addresses_len - 1, &addresses[1]); - return (); - } -} - -func _unchecked_remove_authenticators{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr: felt -}(addresses_len: felt, addresses: felt*) { - if (addresses_len == 0) { - return (); - } else { - Voting_authenticators_store.write(addresses[0], 0); - _unchecked_remove_authenticators(addresses_len - 1, &addresses[1]); - } - return (); -} - -// Throws if the caller address is not a member of the set of whitelisted authenticators (stored in the `authenticators` mapping) -func _assert_valid_authenticator{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - ) { - let (caller_address) = get_caller_address(); - let (is_valid) = Voting_authenticators_store.read(caller_address); - with_attr error_message("Voting: Invalid authenticator") { - assert_not_zero(is_valid); - } - - return (); -} - -// Throws if `execution_strategy` is not a member of the set of whitelisted execution_strategies -func _assert_valid_execution_strategy{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(execution_strategy: felt) { - let (is_valid) = Voting_execution_strategies_store.read(execution_strategy); - with_attr error_message("Voting: Invalid execution strategy") { - assert is_valid = 1; - } - - return (); -} - -func _assert_no_active_proposal_recurse{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}(proposal_id: felt) { - if (proposal_id == 0) { - return (); - } else { - // Ensure each proposal has been executed - let (has_been_executed) = Voting_executed_proposals_store.read(proposal_id); - assert has_been_executed = 1; - _assert_no_active_proposal_recurse(proposal_id - 1); - return (); - } -} - -func _assert_no_active_proposal{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() { - let (next_proposal) = Voting_next_proposal_nonce_store.read(); - // Using `next_proposal - 1` because `next_proposal` corresponds to the *next* nonce - // so we need to substract one. This is safe because latest_proposal is at least 1 because - // the constructor initializes the nonce to 1. - let latest_proposal = next_proposal - 1; - with_attr error_message("Voting: Some proposals are still active") { - _assert_no_active_proposal_recurse(latest_proposal); - } - return (); -} - -// Computes the cumulated voting power of a user by iterating over the voting strategies of `used_voting_strategies`. -// TODO: In the future we will need to transition to an array of `voter_address` because they might be different for different voting strategies. -func _get_cumulative_voting_power{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - current_timestamp: felt, - voter_address: Address, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_all: Immutable2DArray, - index: felt, -) -> (voting_power: Uint256) { - // Make sure there are no duplicates to avoid an attack where people double count a voting strategy - ArrayUtils.assert_no_duplicates(used_voting_strategies_len, used_voting_strategies); - - return _unchecked_get_cumulative_voting_power( - current_timestamp, - voter_address, - used_voting_strategies_len, - used_voting_strategies, - user_voting_strategy_params_all, - index, - ); -} - -// Actual computation of voting power. Unchecked because duplicates are not checked in `used_voting_strategies`. The caller is -// expected to check for duplicates before calling this function. -func _unchecked_get_cumulative_voting_power{ - syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr -}( - current_timestamp: felt, - voter_address: Address, - used_voting_strategies_len: felt, - used_voting_strategies: felt*, - user_voting_strategy_params_all: Immutable2DArray, - index: felt, -) -> (voting_power: Uint256) { - alloc_locals; - - if (used_voting_strategies_len == 0) { - // Reached the end, stop iteration - return (Uint256(0, 0),); - } - - let strategy_index = used_voting_strategies[0]; - - let (strategy_address) = Voting_voting_strategies_store.read(strategy_index); - - with_attr error_message("Voting: Invalid voting strategy") { - assert_not_zero(strategy_address); - } - - // Extract voting params array for the voting strategy specified by the index - let (user_voting_strategy_params_len, user_voting_strategy_params) = ArrayUtils.get_sub_array( - user_voting_strategy_params_all, index - ); - - // Initialize empty array to store voting params - let (voting_strategy_params: felt*) = alloc(); - - // Check that voting strategy params exist by the length which is stored in the first element of the array - let (voting_strategy_params_len) = Voting_voting_strategy_params_store.read(strategy_index, 0); - - let (voting_strategy_params_len, voting_strategy_params) = _get_voting_strategy_params( - strategy_index, voting_strategy_params_len, voting_strategy_params, 1 - ); - - let (user_voting_power) = IVotingStrategy.getVotingPower( - contract_address=strategy_address, - timestamp=current_timestamp, - voter_address=voter_address, - params_len=voting_strategy_params_len, - params=voting_strategy_params, - user_params_len=user_voting_strategy_params_len, - user_params=user_voting_strategy_params, - ); - - let (additional_voting_power) = _get_cumulative_voting_power( - current_timestamp, - voter_address, - used_voting_strategies_len - 1, - &used_voting_strategies[1], - user_voting_strategy_params_all, - index + 1, - ); - - let (voting_power, overflow) = uint256_add(user_voting_power, additional_voting_power); - with_attr error_message("Voting: Overflow while computing voting power") { - assert overflow = 0; - } - - return (voting_power,); -} - -// Function to reconstruct voting param array for voting strategy specified -func _get_voting_strategy_params{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - strategy_index: felt, params_len: felt, params: felt*, index: felt -) -> (params_len: felt, params: felt*) { - // If there are no parameters, we just return an empty array - if (params_len == 0) { - return (0, params); - } - let (param) = Voting_voting_strategy_params_store.read(strategy_index, index); - assert params[index - 1] = param; - // All parameters have been added to the array so we can return it - if (index == params_len) { - return (params_len, params); - } - let (params_len, params) = _get_voting_strategy_params( - strategy_index, params_len, params, index + 1 - ); - return (params_len, params); -} - -// Decodes an array into the data required to perform a set of calls according to the OZ account standard -func _decode_execution_params{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - execution_params_len: felt, execution_params: felt* -) -> (call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) { - assert_le(4, execution_params_len); // Min execution params length is 4 (corresponding to 1 tx with no calldata) - let call_array_len = (execution_params[0] - 1) / 4; // Number of calls in the proposal payload - let call_array = cast(&execution_params[1], AccountCallArray*); - let calldata_len = execution_params_len - execution_params[0]; - let calldata = &execution_params[execution_params[0]]; - return (call_array_len, call_array, calldata_len, calldata); -} - -// Same as OZ `execute` just without the assert get_caller_address() = 0 -// This is a reentrant call guard which prevents another account calling execute -// In the context of proposal txs, reentrancy is not an issue as the transactions are trusted to be non malicious -func _execute_proposal_txs{ - syscall_ptr: felt*, - pedersen_ptr: HashBuiltin*, - ecdsa_ptr: SignatureBuiltin*, - bitwise_ptr: BitwiseBuiltin*, - range_check_ptr, -}(call_array_len: felt, call_array: AccountCallArray*, calldata_len: felt, calldata: felt*) -> ( - response_len: felt, response: felt* -) { - alloc_locals; - let (tx_info) = get_tx_info(); - with_attr error_message("Voting: invalid tx version") { - assert tx_info.version = 1; - } - // TMP: Convert `AccountCallArray` to 'Call'. - let (calls: Call*) = alloc(); - Account._from_call_array_to_call(call_array_len, call_array, calldata, calls); - let calls_len = call_array_len; - // execute call - let (response: felt*) = alloc(); - let (response_len) = Account._execute_list(calls_len, calls, response); - return (response_len=response_len, response=response); -} diff --git a/deployments/goerli1.json b/deployments/goerli1.json deleted file mode 100644 index 4c0d5913..00000000 --- a/deployments/goerli1.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "space": { - "address": "0x56f0102b537fae4a9f94c362473d7f03025e92af246502074d9f204c027058b", - "authenticators": { - "StarkTx": "0x327d3a82cf938e7dcef065db5d3f4c40d2b495b27912e352817cf3da41643f9", - "Vanilla": "0x28511c7039691e7298c92b753e28d79ebf8253acc0fa508bb159dd12adea0b6" - }, - "controller": "0x0070d911463b2cb48de8bfec826483631cdc492a6c5798917651297769fc9d68", - "executionStrategies": { - "Vanilla": "0x5d4a61e5ea572b1e956c19ca76678336c2e0472a7988b0b5979fa18719b5652", - "zodiacRelayer": "0x5c512fbf7f4dc97bd2a68e7096968ce8ecd65d42583cbacaf3fdcc7a1800f80" - }, - "maxVotingDuration": "0x7d0", - "minVotingDuration": "0x0", - "name": "Test space", - "proposalThreshold": "0x1", - "quorum": "0x1", - "votingStrategies": { - "SingleSlotProof": { - "address": "0x78f994cdf794bebd68027ef9e2ee0bf309983d87755efb4f5bded8d26980514", - "parameters": [ - "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "0x0" - ] - }, - "Vanilla": { - "address": "0x61b900e2c3b8beb266e1fe9abe837a9b8276cac39509b3b25ad10a20767763a", - "parameters": [ - ] - } - } - } -} \ No newline at end of file diff --git a/deployments/goerli2.json b/deployments/goerli2.json deleted file mode 100644 index 9945abf6..00000000 --- a/deployments/goerli2.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "space": { - "address": "0x794d325db8a7e60b1671c7280e697260433af01b017235f9ce092e775dacdf8", - "authenticators": { - "StarkTx": "0x6b468438f5692139f657f42ba54ac89a8944eda73088173489fe3cae08addfb", - "Vanilla": "0x406c761687627770ffe3913904215c4652bd9f06b72046b301ce4aee093329f" - }, - "controller": "0x0070d911463b2cb48de8bfec826483631cdc492a6c5798917651297769fc9d68", - "executionStrategies": { - "Starknet": "0x76c99e71d34564a754c3a4bba02ff7c45c6e4264afce540827085348b4dc6aa", - "Vanilla": "0x4194fa1be0fce6f70e8b8d3e2b4730467f80637878f9e5111db0cefefb0da72", - "zodiacRelayer": "0xcf166a5c95d1d49109d058fc4a89b6a5ae6e2abc4f487f24a5d9fb6ee947b0" - }, - "maxVotingDuration": "0x7d0", - "minVotingDuration": "0x0", - "name": "Test space", - "proposalThreshold": "0x1", - "quorum": "0x1", - "votingStrategies": { - "SingleSlotProof": { - "address": "0x275b259a35fe0be03d9f211aefcc04c5f5e3fec89e87b8681f84bae87535b51", - "parameters": [ - "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "0x0" - ] - }, - "Vanilla": { - "address": "0x244949da6544e5b8281e4bb2b06107fa0cbfd7169d89762e4f960379eb6b3b2", - "parameters": [ - ] - } - } - } -} \ No newline at end of file diff --git a/docs/images/governance_trilemma.png b/docs/images/governance_trilemma.png deleted file mode 100644 index e710e87178a28689b5ed71e1223d74d66e248448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183234 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

Uk3Sk1PTn0gHOP$gJycJt$3ktGu*q>L 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%0D}oqlDVa%j^0`O>kmGg=opCn(CV^ST>LYW6{yk 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 diff --git a/docs/images/offchain_architecture.png b/docs/images/offchain_architecture.png deleted file mode 100644 index c8b89d4bfb1afa7b9a61699d12ae7e8c7a20c745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124500 zcmeEugaf^;J-DGft+iYO_KfOLm2G((r5bT>mtH%Jc6?|}Ec z_rmvm|AU`?7>?(h9c%4pJ!|c?_86!jCyw!e-~k*Q9EPNXs1h6;at<6E;ub0ja3|h; zhzAZ19b_gVq97?ELZ)D6ZER*~1P3P(_(koWx^l;pWUa{X@P34c;W%!%qULb)F{qv;h>mU}otf*+%ts`LX|)FD2J7t$ z`{i!$&ZLg|dvIG=FY`FCM&QYGmB^$~v5Z6Iq)j4|;gM2>NY&x^NOYNv+J3x7q(g)? zcGYV26LdP7P>%_&T;;Fc|7a%w*RCGGj%?>8&`Jy6G`62riU1cNRX?(bkcZRfr>={F z_|fGHj!FJ+IqKdwa~T(0lJ|)MiV#wTmv#*&;7s}7yBU)U67HFL`i-klU`xaGlc3nb z>9*nu6@2zo_qr6NX7(Q^nUp5?+l5nIc21n|Ug#rQT-hzXSMsdLYXJ3OSC(sC-j#{j zW#!@uJ&MQpcj3n!6gbf*Ed(QtIBubUPsfgQ< zh`4d@DR%7x7ji}H1R)}tj^IGm4fe8D{kH*gR>C;}XjPKfgsTy;T#tw%r~#W0;FF zSTr#Xp71M$Fn%Lv>-|@fF2zBl4Be5RsB^cZ_m&V(3=&=&SbZiSrNgFvoxARvG`D}c z;9sq$_6f&n4=zkWfY*%-&xe)j%@@8=@@OjBZ>|CoXdiIjSl9+}u*iYJv>xn#|KcVc zz`yt@aJ|As3Vtf_nb%8cP3+jrAY7Ktxz|7Q=9^=EOq<}z-`{^^WB4JE>|Q`Z?Rw2G zmJyk!zu@uPQC|Hj7)39T*h-0LvY?UHy?s4}X;U`> zEm=4bD_w}>9K5Pajeih>ko+p-m~_U~=C^*Gs}0@CRlS$cnQV(+ylI8l^Is8p{Cbk; z)PC5M0s5l%rk-LoUHmq6!T8XEVKOIx=;~2M`;xL8I~m&wNAtcjZNN&WSAg9k(@*F6 z>zamMx@c2R?A+#?s{{@GyI&x3qx4qYJ81cdm}VlMyOg`2s`}{!5jM+qyls}d)m~^A z{qiG`DCEjED<&gmg)F#qbaqVqvBk1pJ&!ND;OUBonkRgn_=Ra8Q!A#yN{RCL>rFb< zdvW9U3rH-!htlu<+IE|4tVOA#K4^=(-B=>!XpY=WRD2BOO^mjGYHP!H`9%H$e4KqJsjUw1$L)_DKv+%zK2gb&n7ZaHG zkl@bh=XM3pWlj1Jgw$}~qxqja&`6W=XJA1(W=X@4kAKLDsMA2@yB{{@$eDBetOgZUOkty$KFbUWGU zH;#j^b1I%NHqI-N)qsZvq2pw70fgUQA%rVX5l9LRhNDvvMvy%) zxRjLVbK)yz3Z{1L#pi>8b;1H^Po-WTDk={@Ar387;3D`$leW-r>42m8u~$4cb;*>v zh7kN(J}q`2!Ia??XR8@5JMcLxS~vbXeImvu(ru-z_*}RQ&7H+k1t=Ep`%ZXAgBusZ*W8eL8%9eK9 zDTs~By%2qY)~CcbM;swxh`kjs^P4gIp?$zmKyV;ofO{YJZ6o{}8gCG-{FY&Vhl~zc;5Z!#X1+t8xSPaOZzjdrb!cJ06wu7dA zcbeS549O2298q8zSsMOqMOl z2v{e&UmEl5qnAOyw^Dq6rC;(ReIk8qu$OJZu5d}G%U|^oLySty$g_O0d@Bq44aLzR za6WivA{?a7MUlYCwE~)fPEKS`G8co(wu;%y7bYK1s6hFPb0+Rh%9j?EH_iz;=z)@278wgo>5&;*cD^inhg#61O0 z-AYHF0vyRnmlciZY_9n-?TGq#krd~2y` z;cvQs}#VKM{4C|JbS>xD)vyDu!lS9wM(w z#hq=M^I0}e$~A=`vWB9<@!e(e5S*#AkIkjn4FJ*S64PRaRB?Wc(jV^QQ-R7cO-l!=~|-($aZAACT{M@o9- zJ@;U4pYf{Tu?F$PEw;N)SZ;7Cv`<(}={DT3#*;%sKI+IgnS+ouZZipTnP zor}K84mlFp9I}pyHKyzP>BZ@~*>gk3Lj*ZmGAZmAyXZ%snb;$~eq|>#(dda6%=dIU z-b}Kmv$tD0=Nfa|4yyL5u&EZ0 zxzX0M2y!fub}!3*-;kFD=%NY zmWmKzLJO|1R?nsn%*tH$lbGhT%o#uoT@akgCsv*iCL`#Hu6pAe5ciBu%|#bxN9btM zeZIaou4*bC`d9X@l`--<=%{Grl`)^z1XvP=d0V2M#(JhL{#xY)3*E9_~1hH!hRSm ziH>)`UdgR=5b-vn0NgH`sLNb*=_3Te; z_mel52li*@CgmnZeLX2^j#Z9CTj(2grv}}@N3nyk_1ZtYS1(I0zg*<&UZJ0s<+(dJ zpIJ<7G;jyc64X!c#)#fS6BVzrPA`0zzU1!q`u+7s89+JvCs2WOAIXEZca7MoClk$!cR zHZ;t1HZ-tk=@%C}zob_@OqC-4o~+LflQ#CEIp$7Zmv8LaZR1lA`vvb+cZCL74{y&6 z7jy#lA2CMilE$*KaL<5iR5)aK95_Va3Lf|i2TuTpd~*#4Ck0RV_q7r{-Cyq@z`^;O z!6E(ijwbN?`cF9U1GN6@H)5n8+&$o5IKa=xRD}P$jhvH;_@8UUE#MiPu(F7xB=B4L zot=@9mA$F8gFmFL4Y+aNMnc0L4(we%~y6^&*AR`BTG8d4gl|8QuKgG=(yukJKZ59f$n^znx_$kz7705)a?TpB{ zm|2-wDFhynk&(T$Gc@K^5*7QaIq)xj3R4FM8(tO`XJ=<-XLe?5I}?`YJUl!stZXc7 zY)rr#O!lr;4*D)kR`!&CI{8mOqDJ=b?96N&%&e`*uKU$Duy%Cdr=YkV=MVM!NOzpLzais9@$|WT`G{2DG#XWD;O|@q+cQW_KU`*QOf(G=2Vp^;Xk=J^EME zYaw`*jO?u~9j}$BVrAwa!1j{mzumsuO8uW^0?#=(Sf2mY?BDnAw$b<>ZT@}#ZX0f|kGF89PDcQlgP6u)j0U;_Vr&82~_9OJg_kkKPs<`yKCLDMW?oP+`! z&z+#(v6Zy$kKUM3AdS$ABva?lM-;cEqbh%okye50q&0S=5A#0RnJ8UYF^DL@F&h_< z_9NvVN6S8ZL8t)Ln-p-?l{Td!2)nkba2y1)6J#hw0*IXY#VXZZCUB%pohxD9)~uXv zo5E_0?b&%Ey_>$b(81>RSaSQL48DUd8Ai5MGSH6+Mbsj-IUNPy%e zgh15ll-JsBjRL0favEdu4rzvSAgCY@aYgG?+k`N>d(!`lNsY*Ic7@3b- z{06q&ehy_f9Gvke)q%!7m<1=zG|5C)c{hAM-Llfb-trqFkbwG=$P0l+{s=r=2?*>t z3txDHmVW>j{^(lwy{k^EEirp>PFI`lv;qZr-R(?l>+|IL(jHat70EH-HQ7}}Hx02t z0Mbo^?F8=FMl^2jvp6SdSD9L~Vnj0GF=WoQMKpQ>aZkPJ|6(wX!7 z6Z3$^A`)ZY{ZURpHXs@YClB6j&|79>6IUE>D)P6d{E~w+*|SNKeup z63U!;&Uog3KHb+tFem+pajj(^7i<9S{JlQQB@$Po{tiEML5-E#nak(I|@<1x&?N;;vmF!{@0>15}f^}v&Mvfym*l!4F*wz!xj0l((V1XZp zB<&g2Q18sK9NCf%yix&>1cWkM(Ay32sPQ4~VHV}| ztEQPIgKlj6?+8- zDV+T7`tX_!l%xR%RI$xn|N1sv<%%_-3;~pUsPDT*x^hXykTOp5qf6#unM$1vnk_vP zg)nHHGNUi9Xn_Y}1&vAegKBQ3zXv-ZvI@aj=uF%r`n|^29n~{NXUo^u-YkxmtVPG)813*=hqQ?Gc2T(Kn zKXdw{W*~_OIKPb>0zN(u)KEHilIyGz9Uhpj?93I!Iue(K4h(T6I*FJ$^QGI{V_(lg zNDA=FIg6m2p_CMH}2$pJ-FK)YQ}c_Gjx!y zQgK}Ij_Q4eae@Bo-Q~jW^oL`EXtq^FD769c8wzgJps^sOi%Ad3h4`5yvgJ1SKVST66zm>{6|uFq{thTp1xzxTAZFT zTzBg}Q(|*S_}pNpFpfjIjcN{hnvwg?%e{&W&^q=Q00Uc3chkSfJuVV`gYP*>0AhxBGZKIH zRoH6R({toAMZben5b~6eW}iNy8F!-2@e+=PyP6OJU#^XY*2=e;*yJxXAv9azx%+3!@5}x?_jsXC{FjiBWqx&yk;&iil}*HWAW;Idere6aW}c zZ^c0(g2}J#WH=w-Y=!9)n`_%86b^bO)s=W7v5*B#V3X^_AT3l8UuCYZi>6|`PDiWWq zj5wrY>k>4jf}MK0LXshrc@=n0i{;w1VtuC6*L^e<0+zV*jcn&m@D~8|DFX#ne)Qkg zIzGYCu-CGcf&TdM?TM+!DJDLzEu3R+zVW;YAPrd-5N9Z_I}K^v5{=9j*%BMf-@n!G zk1~9EJYUVDbYQp8x@C$}`4V)6fbY7kfUr*0(B^Qx=g18N1d}a)@#OaYBUJ|pK<2dK zkn$C;)}S#*UM!d0Ks(YP3SMV><3WBoW`)*d%XH}GCecl1AY1}KP@qGlDZ{_DLl*ww zpWsYe$v{lz%GKu)Q@4b0TI+_LaT~|Pelm%d5SY9iEDSvx<#jC^tvZoC1K3ff87 zMSo(CztugQaIJ32gKA=WP$f5bnsHY5D0s8mWWL3%RW%EEIkkGnUv{Oj&RnS7Tkc3!Dk{&-g(d!soA zf6w@?CU!n|ZqpypAxg!TT6V3lY*r?bzchcYM zK^y#)u-U@H`kJ1b8HW=Apy;qAUAx^~_-_O*hjQUeZK$5xMJEQ^!XmX&`OCRlse8{J zj#rn8W~WrCtFmZF3uy;FtOcy!#}Eggg6vvJ-G9jUnjw%L=Q777pPart*~Z$)9ZF1v zRnqh@(?8L0SQ9%r{lfDY!JI$rOe3$umFEWBWS2;}JjC9xk56uB;qP^%XZaNxpX@fv z7!j60RUxS<7LWe2w#;EF=M#r%3^lb6&P0QL4&y1zTw|{@{(+};|4U^Q`R!*QKdvtY zQ!*3Pc@j?=E5x4E7i$JV;vL2`P?E-8YhrdrJSMdcKPcc>b5me28_xEz)NNEYo~@Ko zmG5#64Nd9Ux-z9w_Kv5{xMCenK~faN8~DbrZQ1E}UT5cc?hqG4Rve7bldvphB^Q-@ z5xQw$@4|=h@IDZfwzdlYi-E4iaHRef`mrLdys#p%Z8*U=*duANx%?zy**BSxA_Qt2 zOWA84N#4S|O5@wRPO(G6t?cv!NyG#r4$H%>*pQp)O#bxqs0Q1wv82o^dg7&|1(Oa; zTuW%yPyX*ydh@fW?#)pVbh*VExLVRRQ(TY z=^%KG(_WUyp{%rWl4u5dlF%!JnXmiy_1KeM%;vaawNC{v>y#SKjgxDGK}eBeWO@z7 z6UDYsu;Qfn%O#?<*~%RB_6_=JUgz>!4N7dhYv*Z8Xo_^(Xx={|14&t>ugyZAs{yEaIA|JlVkVVpoHJXXXUuKZXbi2a?KJxF434Fu*%rX7>d4gC+xn zhLM7Tf((1>NbAHa3yJH)-E6Mva+6YU$%`2fWCE%f-0JXdGduIh(0_%I{Q&-e#l}s+=`efn;#Q6XgT@y zBe1fPF3M{-w^lZs5ka#-A7;YWwJCVX_?lt9vQ=Eqq!_e@pS5NaM;Ja`w<*|+2<;LR zvEW~W(ey+-uUwIg!o)atHa5(W1Q@y_t!RtJn)oCHPr*Xg%-fdh!ZS-0!hh*irdUVm zbur~MxmAD(#L7oQx1U z%vR%78p+2i`E0i5>iEMfHM$5YZi+fWWTL5?-uNOqzvypC08mB=PBG_4&;$ys=5(?t z0ot|M$owUe$7l}hF5_u!t<#{*`A<^wExnG&1RXDX2<9jkWpxn=lyoq34I*#*T{*fhn2qWbPEHUH5T zEJtFl_tiuaizOrR#?uE1_Pl=MZy(%(iBPIJJRvWNuQ&$T4>addlw2VczyQGmQG*3w+^P^1YIc<+K=6Ipt*`Q@9Sd9jUwS zvYk1#9-@S{h0vOSUvdmBM&IYg$qt5W%kU(v4{7%9?D%u5e0!N+@#(>74lBFh#b0=S zlA2~6VLyt%^ed$>{)?qwD=1wv&af{uNxtM2p{d*UcJ5dFgm_3IYmQ~yXJc#L=Co_J zZ?rm0!oN+`GQP~Vr^(Lt{4LX}()5;vb0=S0 z&jEO-Y;dW6%sHxCtato5csOl^jz26k+iPX~t5Q{7ySr{zGf(M`=f#EnN2^uQpeug+ zy&M~#gDf7y61rn?+uzBylVN{- z?-x=t-d|z~hBwlz?k}}1BU*DeVdz*TMz^G_eKk!|Vb>{kG9EoYUc)P+t%m!8#nT#G z=l;FGE(CQGy*vZsTL)fkN7-tadfbZ+K{LQ-V+k@@BgkUl8vU>iYZpnp>-8 z)^95CCHYt8s3R|5TZI&<#ag#p#n6NOmR*c^xV$Q5A%#;U154$`4*PXKOYPl-_8Mm? zKAoue@3_^4X7=h<$#Stw5Dak6ucbz&X&LpC%6P5~vXMBomZJ>KiOE1yHP3{Eh~=Fl zAyny2r75cIXhn5|kTqHo`vB8`o)7;kH69?*gpqTIar%-Ym6?8EkE9uhn&VMMsEzqo zDv%?O+-$x#2QdE>K4eaf(!vy|j>VIK5)3svE;W~PP5KQwY3~rH!J|?YHyyB;bVQr! zs;o9!`JQzgUx=xV_hBNXGYM&g{g))Q=Kb;F0qqULfYT|tpj;yoHnu@(cJ?8b{j?0L zd!!TM@w#+Nm+N;Y`^=R>{s-B%ZsMG;>dMVtM~Ck31%O_hQ8?V z%Yc%?m(E^GzdHK;$fpL#r4$mX_1@l>kSU-6q*k-h|DIQUn_S&@(r=hR!I@-S^7In? z$9e+5m3=rq4@~kN5OoC z+s2SQHI<|rwN9R1pLn!MH`J0ANmYGS)I+vDYvk=oJQAJ zzAC0O#FBp)&;V?`4rF;KZ)2{B`9W1$rWMp5gUJyLq;Eio=7bLGbn8BNPLWLwC$-}b zW=NQPnyioqcY>UjI$e-<)P7%1xSQ=1)z7+l!pgA0M>Zr#*mNwctlg_?SzTT+^Xc<@ z_x8|z=zzM4IDYid?MNS0RJ_SA(v6Eyb<&YFx|fa^WFf8?8?wRX+n=pve6b8;May)}a7OqiHd0Onc+gArBgmPe>91qSr`$FD#MRkOZzz+w(jK zijQ-T^Mcpcc<^sa2!~LCXCorXU0e<|N;5urIIOuWg1GK=b{IYC{iLItdaB?;J9nCI zh%j5S*Okw(eb=)yBo32%H*H4TU4Cm)M9$H0c-6x+rA1A9=5442CShg_uFjC?&&jU`tO!=}MajxM;}2?! zvK&Zfvc3nb9XQmREQw3k!iM|?j&#)Q?mJPw7m7yaNX69V0x_db|FB0&e+JayRpjJu zr$4S;nU!hYSpN#waJdCon+QGEQM;jAys--^y-V^Lp&PFq|F>6kAPbq= zW`_w+w9rt@`nIFQf`>w>+sJnDZ-{v6pQm`UZ|DeA6akgZNm$Cv?VbO9>R*1bHCqCm zALPKgZ@nH>Fzr8I+$4!~Lc*mU9g$_hS0uY&vCw6XgBZO$kVXWm4-Bro!A*r|96ddG zHjyC-PkFR&l-B-ved5LcStLisR38UP$w24FgsM3PLqPG>_nO%lfLDHs?1a>d*MLZm%uf@M;gQzGQ-z&WKcVf6 zmt=ewa3aH&y)Jy2+uh{u{)tAiVkiEN)q?sF*v5*1La?F)q4m80WqY);I@kOK_$(%x{R|k^{=Fs zIVJ8FnL4wTX$3B7PrQ_&1M553w3cfEsdOjsR{zEJr2BWQnFP zijZl0ULS}|lgmI&e1Fn^G=tgG(75yc)dm&ynU$14T+Q~td*VUZH!d&FH9e3SF%z)^ zkOr)2fKMa^v?JjG%)GVH|KL{M5L?0(o;wvXSFR0x&-*kcCWUSwKg9CGdUKRpAW?^C zV1!qAP@83>51!+mubJQ`%LPIc(~|x*q$P^prHH%9{>jEm2*7u`QO)vaiQn2m137Wi z@wJ$Jn}-}^6-8@aO#5kV78hpP2*&RH59^I2+m=c%*2I+RKJgBd$h3zYpcsFKJ|r~i z|EQxP=dp@1xNb>$ohb=+JIsEAge9J0P;s4dorCZh=T#30A;F%n0YTxB=^%UWszP=_~+SZlC_2!uHLT zgyw(Na-iNRU6dH!QXJ7e>zRxY|6=q^q}Ta!=3!ppyC3iNjrvcf&-H4$XZMb&j;ORd`bqyeTcnt9^!+>Y1R)aClH1B_4f>`wpb&-8qi33DeaFf<)O;`i>+UZA0r>d@umQePJOBVkTH z9pU=X(h&rkGW-q;^`Zlbxbp3$ahAx9%0jo}e~RduB3=Ve$N(sj(*E>J|8fh3a0rTz ziuJ!G5Be22f#)o29EwA+AsM;st$r12yo&SpJ*gHJWg`dZcCX5K>xFBOep*M9n;af| zFoX8}3NRyO^-Fv@0C$?6b z=5Ht^HAvk=0W@LE+`Q@*iZH>{*n-tMO|HwXVX%$?rbH8UnRbmKamj0x&zmi+{`Xz3 zOxXZQ!dHR)SfJNEGr>Fd1P1EH+9RTYZZc%48J}dOKu^v{rnkq7>dPDJ)R(6#-wqmc zk80m9Gdy?}StnS*PMM)~lJ&AvEQEbm|NE2#!A;?ySZMz0LJ?tM$l(r%jQeL;6+wH34avNDb!pR>&SCtsEnJdSK9s3{(j^yPpk4vbZq=)9X^cNQC{r zx$?Rm@Z~**ev54MYG?r_w_39mUM5tJreI$)V-1gShvx#+;0ZfxfKxnhV*;;erOI*9 z%!${1Rvf>~d#)E@I_{DrWM2Is_QfTQKN^=L@&yeGyb)MSgRZ#L3znl@tDUR_IP-#g zb~)g72Rgh@Y(zAtok*>Oz{1u575ksp#J10!L=GresI(bN_Hk8|V0Fimo4^iy%?RV~ zLEBsXOR90-0>KHkQ0g?u*x+`Lj^9{$j*4%Yg zSkuZ!V=x7G)1dc2pFK%N{A}6&DD&AvAbz1{-TZTO@1JNRl?|S79#}O9XRdFSz@W5+ z!iMICVyplgyV37zeyU>Y0~#sD8TTl3-o{{E-5SgJ7CpkvR{!RQ!_6H;(+~^6t^Ll^ zZm&Osq%#3|&Hu8WjK=O~t*pTzrKZ+=K&6h^>euMRe_XD^);MC&aja`kuSr^y&1;$Sds`$2?-mpCIKnaln)qCFjeWZ3jGU z*LSm|%#uBYNsNqXQ00Z?Uq^t(u2-0;`{eElYc~1Sj)bINThaG}r!%j)VB?H}0u72% z%iIC&&%oYk4lkJ0;w!CpzTnWKWwFM+NV?;~Bw~>z+!{PCqIhq~HN_j^i$rU`6 zqp=YE3MeL&x&D2v_7*bFpSAVj1hCsnkNdNvm(G5fTsG}*2 zQjX5Qz3ZOxkU7u`3tRn@=mx+d;2pHMNzxX%Ed~p*qAw~tOVX!q%FC2xq6o5RStG(d znV`OxEXNSa3}5(izgf**kqw!9zBbymSZIZ3>VLd=03Hw^yHw+rBi@Yr_Xn975(g3_ zirf$7I{^iB?AqYsrW%~J%*OIVyc5sji64S|&78~2-4mxFx&H}PeOv&ggyz%=YuyPE zB7s7Eb6Q5OV`FGIgfa;co_L9f6>Ils&EmBGhu`?o+avz9HK&i|qj8v_aii}XwD6`O zJ0*Sfc*j0B0izHRP^xMh=t-r&Lo*$;spPh%K+U&wyKJtEXjQZbs=n?VEqCWdB>3pkqsbmcwFiaC;{nL2;TM-y>3q;OP5-~H-$^efm1Q}KNGM4+?_TC z4;y-PuN`c6OVwQh0^l!`igQ{qR zB);;f2G1II&#vz7aD9sL~>bo2(R>BQl$E<;KAu|M|Bc1I~p$YVR?l5SM#O zi~O!q(oHj-!)lmSfKV#`4}Xp$12m=Gv;hA1l&?n|&JvPa5OZ{O>%BP|`d+C1fx>8p z&dHzC)VC-1XNK_rLFBp4uH8AG`S+^|MZgP(oqa#FQ zHfmnXcXV?z{Pjm>wve&8Q-aRF)15-4_aEWmb$w=Oh&1Z*jtMzA8O(N+UW<*T^+h?5 zh7{7scpLY8rBxP4V0OnOeMSkJqST*ElES#qpEJ;?bpktV4lC9;ue~+Vo-MByGVV>L z6pWwk13@b#+m5!f%Bq*&dwEhbFz{pqehQ9lkLPTZ7%SAyv~R<7G}em3Ez+vgY0xcJ z7#tijIxZ%UOiI$8+saohiufTN<8~&#$@7+tjqMrHJ7*7A%PWmWFV8P2DPQtcyCSo? zsAzKn(eXL@8&qPL&lFV)-cp0LDr4$q_%ALjfqa4aeX5l!gv?R?%*uZ)U1nX=)X8jz z%GfN0g_nj}v%%^wc)PZqF^LSnkY{zOYJ6OHmJvP3$b$uD%4UNvoW{Tff<8il1)61I zgF}Ovp0$uK#7_<{T^h4HAMo$`v~nT9ON+tN zm2cg^fc5gc%5oaQwD>pz0@CcrjPj=TC-Kl5Pc8pWh-2Co)z?5qDtpp>u;aqB@mbPw zaF3YJsl5h+u&2=)BkT3P@rcg5ty2uUwJ&4tZL+*;FL*Y(bz|N8dXrw;%^7(|ED2sP zCh_yaPsh->Tsz67M{zEz^d z$lSqc4wP?`m+Kjrz*h4<@;P#`&>gQPtZdHDB>Z;rEXTuW8+cOQ^()ph0qdF^f=jb| zKWlef8=>20ZPg(PKw_i@Zf&}nIENZ{(b``P8YwpNGX)53C|$FuGuMtB`u?CI5c_)EHY zUG-S}%So!@Ju@~VMuYh#&XVku$BqM$6n$R@%6j5Czs%ITxttve+MH-N#MTr6P(v3o%i&w??wEv zWT7e40(S3ofu$ic9d|k2OS%c?odGW>0f#ABPLe}if#yZ732v)?cM>)BO;7WLXQsYSbS#NIM=XCi0s7p1(ElP@FBZdFE>O4pOiOInzc}dIJl~_IO4-SrJ8^ zO>%s8b)ml8eKz_z8MGWSOvG-0Wj2)USj|v(HSp-9S!N#6w%w9hl`A2@6~%a2Y!h*? zKA%C@@^mtu3yY9f z0W-x$p?Vgr{&W4$G=HK+?RQ60Co>Ks?v?X2S%(8QSsW{{I@SUQ2962I1-+RmRl2^h0n{={r8gY01Bkh<2fv>eMJl1v{56>a?XPIBOJ4Ttd##Y#U(~WK_3&HS#0f zn?hIP1$b@@Pq!~}r$Lv@Vyv);HS(YgUpIh%C6AV5CrJ~rwCmE&S9fSaM;>aQg8%qr zxCJJaKls~bIk9>#`TqN@y+I3Ww}geZtrh>F4VkA-d-yA-jy{KQ7+@XO1rU$TmFMCl z!{ur{?I0<@d7XR?-MRHLLX%Zf(DIZkkLMmtR>a6x(Rq^R-5FTXXsUu-Xh&BFFp=3XWF6R`!nT4 zKp#`|7iUMd^0b`QVwov~?(i2M=EKxx$aE7}9&M(>gtZ;)YG`{rN8;DNFoh6uADs=C zh`0~H4QlInEy)g?rHtj|0Nige%EiuJme`lly<)L`pl9~P9rJLMg*f?grEzg&B{}yu z^#}gmLMQ~ZAp0RFYUAP}&pU48D3oq^6m~Tfeb%ohIK@9^b3ET+()C=N$ee{5+7l}z zPIR?lmxASKo9waU=``cIL+QFW1MM17DBL7C#lL7nV*y$ zt@&BrFwoc;Yqz-W`1@Z=iLC$+p-JqH%cGOc%JO1)ZId%tV^=l=pgIWb&EXP-Y3S$p?gK)bZ8 zY-t8+9e%IJmE#vd<<5+8>w@rLwhF_}VW$_-^IftX7mNs&hF?>5KHJ^`=P59*i?TCg zS^N4eJQ=dW<``yi5~pGyTvK?$qOp!_PGCOmwBu{HQK9BmBv0i1UJWwW>rQ%DC zL#k_x1|{1h<(2(iAoq`Tye>d2R1ICj%_ExaX~8Hq7c%M|*MZskh=pO$uHaR{P<;zW zrhDrYx3&Y)@5{5$2oHANQ%80sb!q9h-d#z1=gMKxWrvttf*f%It)JyaBPIlk-qQCq z9)DZ0Jq)SrVE1mE#UiwD3y~1yh7k7&Tt$+~Y^;u4UYxdne=WVVo0GDCYID^R)mju=p7c%8{bc~0c zARd)^KI44@!N&7-`(EB+jyVyCM}+UhE*n=pCG8jQHy#P#0`WQSMZWJ#dmX0diX-W; zw~bQ+vsoHtE3Ue6tGk+!uNw6R1U3eX^+oWj$80o8%qw6gt5YSuNC-cSqxVhriqvL) zdo^Zz?|%7=UmfdQcP3KweE9SH*g)T>WfmMA_YHoH(oON|vu1IlsuP*Z8t*(+JT?bVh{tuf|h=Lwp;~CUn(yhV#o{ z-&z^6uZDYc`UN=9+!)&5cfq$@W)OSDH=EdU&iC`W9@Q!ZWXV(q-`;$A>Oc9qbY=yE z4*zlgOtSEttQJgtQyaRt%r+IUUU5(4TL%ju;I0lD5?q=ZpJCvHCH#X z;JIMVf^y5PKvEBINVA@bRBu_8ai_95IL=HE2-!?c={ z!m&NbTK|u|@BC{ji`umS7DQB3q@xIk2&gpaAR-+U6r>})_YR?m9qGOI-di992ndMO z&_hk=Jqb0GkZ=z=^Nut3zW>4fmgINN$=++Py;pnIbB^S@_;e-Oqs+^KVkjY)MUncw zZvF*XK9V6d*1&U@%09(8kwOpN7GjbF2+k7AjSF?01ZI`9`pLB_vSG;WCKSu%Tvw99 z5T_B-ozG$ouBH;)u$?odRRN79GwyRgg6GGUj?tu!)G6*UOrmvIM8|{;^TC?B%7#JR z8u3#-I^gVKCt8r$2CKox8E(&`lF+2S+V^Los6uv8#)52&KK{CnD<5$AmzERRV|9It zsn7fE_B^1`qqP{>q2)iAw0S61M}gphnN-jVzpY0w5{_KZ10CP;8j<9;RUamJ|d07B!}Z0AM{wqTr2${V*i?HVcLobqZg=MQB6cb{mUNOE5|0C4)1k#Xx*orl8?R1QR2o& zu)7|6gyT*KjNJEh21}f4za-(PvUj626UG^-au~h5yxn<|Vbex2ogUQsOlW6RysO{ z19niH!RWaww98SJ0V6RSUI;un0o+`L*M9ppUGTByp7P`Bm?`f!IeG?iEx#Td`EaotR|)I^z}Km-5fHnu2Vp&7l=qrU#e)$Fc}HpO~CLHW|E zGQ%bKGLh)5fc%N#pb)cAmov{0{VC@2Db4ViA4e4xRJdvfYYLm{?)Ncr{ql;tjCDaV zrb2{u@@Fum3pMn1tBTOBjj7I6;bWuD>DnMLf+A;^e@f5|8;*RNNPcm$g@B$573!wU zam^hOMZ6rU8%0r0VN9MIuVug}?Hlop2Www~kvU3)Lg{YJ!L#0!DtAon-lqI9?neyvl7z z5&urM1MzCgO?vyx%sbW$P&K{Cc823A-Ph%0R5$RiltkZ`^#QP zXBmeGcYix%pu^bmkLUX7m$LFzAWj4io@Jv3lW0*J>xEQPwx7-MGjjQ0)9)H$SSF95l zc{sdyvelPAdq6D?g8JHge+VY_@4V)s4YNusbnWDqOm^8S?aoS?ID$v`_TJHQ`QB60 zeK$N+g)qq({Z_&qV}2)Md(?P`hsuUvS6p0dAYQ+V`Ls3LRqFZ4A{dLu)^;#rN~PJe zZHCIiHSb8Hn9d(`T_BuUh!#Xf*muu=;Z*jd9JR%4yG3F7eo|E%PdwEnu#l8eRR0EyA@hZN9bPmVVJ_;q>i1Wsgn&KxmY4{f??L% zi$8s92!gLF9(6@=IKnOswqWY9Z#{ASx8LGlc36&{B<0p4BsY#DC$iNy%zl?R{wj&2 z`I5Mtc>-PjIU*O!o(k&aj7*a%Am%rIRHm&PJN0l!l(t~yZlGILW@AaaRjo@;a7|Z_ z`y}0A46Ou@;Oy{F#<0IO`{Llj^x1crPh7ptUzV2~g;yb|mSoM$KJFFe@x?joUxemM zrRxnfftGzKW*S~XuYOZQcyFXq5|@&>b!`o>9|oAT#%{DLK;F8hJ(*_2*a}))X}no7 zagOWu)jE@?gzGm+TRJb6CQ1srlxG@Nv(<1{L!K*(3%05FO?eyEph0;BF7MHS47-Ih zbs;|pHeL>VMJdLmGtJ>}+^B;!dW}_6cWKyl{UH zxamAsLJ{;wbVE%AfmUhl**k5NHv7FH;n|UrioH<+P0n?>8p@ z9?0g**iKYM(3KD)Yl>58k{=2Tu!?YYiM)c<7ub}S^8dWds59mW@Y4Y4&Ak0%imaTo z4S!b214yp-$-~z(7O2;MDnV5dv<0L}R|X4SJG?6S*a;>Uj|_{gb;}#cGOt;5&8ZNI z@os)PvJOOa%7oH%we(0r_=xcA;esF%w<-cV=*6>H;PtWt%Kakl3v>p1@Gn&!M1^#^ z$c73CMAEEg5biyGYi;ock`A!2QL)#S&Q?T3QeE1wE@}t)HIx@f7lP27yocJcQy(wK z#Be2OdLI3Fn5pIZzEqD^z{*0fP*2b)WU4BA_NS4^0N`*qJniVCvU}95Z2<`j&LOMf z7Vb~su5JLrokX@ABv=pWxsZATQwZXUs18X%Y|#jFEaA-}dQvrtc91!d=4Pg^na=uH zuG*~0dFc^dHks<>Z=#?1VSP8k1tD2`M%R67Gry86b0j~fF}=($)R1iQ0=4}Ue0M@F4rwOAe2tXVd=wOnD*p=Qs3X&+$n+j4Uk#2pp~siCW^#t6m<8`=_V^j}0e7)-5!@CM&cJ`Grx+`e=kmTP=0WXJbGu6{z3;LV za-6tqVs&q#?PD|UpkUbgs3~7@>1+1so!aEvnV+ChF#tS5t>vK4G&uiDq3Me|S~l{b zj>Azqeak4R;Wwn;r6y7n2?;&| zXlLvd{J}-{dZ>NJ08>M*w!6*=Z_gABMv-){0Rs-{1x<&yF9ems9Nl9lQr=prtO5MC z5e(IOE;|+6vWXpMTxXw)Z0YSms?&Epm$x7^3>a=|)4e@AZu?oZ@ijkUsLu#BQ-eL2kcY2G)Z*IHlGkd&@OB^`2>610uxa$ran+EJ^YM=Mn{PGheT-qp6d{v~?C-tCaL zgF8I$n&TSF#^0BPN^B>&f5S_kea_{W#!}!qlqZgmL7XJ<{4A*1`M@mY5{bAEnkg+3 zc?rRcQ-Lh{Q!PJ&r`kdH^_1g89V89xQM)yhE6SreK&B$30ha^w!n-~db$4o~=bg#W z13FlX+Y0f|gGUFMHbJ|}H9;Tcy~K;F@qkh5>}OBCEr|4ut%0YoOlr$I9`E_3dhwun zy-aGQ@2^7vCx3n^y0G4vN4M&k9dWGz`G|Js1Nrp*q^7aA?7iNHsmBqa;s@QFrD>^w zcqZS;<4dDX)V&k+Jy527sAh(Yv^-a?)10k4{?jFf$3IaeKz95P(oek1Kwp#(B5=8P zAS%tgS>|>{)pPy0+Y|5(xOs`gnLJdUg1`?n)E%PfLgK5BObC+K%YZ{Qwz9(-HKrbqE48jf_dPm?bePZs@@9we zLmhYQxr!Yd_TsKC5bxh+XWvJhqP^?~GkjSM%N_stiP5`Lux_Kif@gF*L3m?{Ky)dM zPxTdO!B2Xs7VJB21f1KqZQR*fndb^L5G%7F$}6J4qz!_yql8N~<&ZyGI`G zq|2s0&gOEeudBm&ujB4hX>dOZC=M|hdiaJ(xKlk)1ga#uf68)%@7A>yaW0+=QxX@F zotNx@Q-59GZ`c&KaUUV9HXJfeL6NZ&Y?<>0y%4K^FE`0I1d%fcZ%q4sU{{ZGvd=07 zrQ5D)5TDuApa}jKNSVUS85<0|+^~zJdVY;A6}qld#gFZYdrsr_@EZGV#LTJ$o+rj` zIZvK~bQl~A(Z3sn+t$n_lzdOuH1Pd`fM4W!RX!(}n_}^F#S#gs-x}AsPw$Dr`ci?{ zgBbJB;!E!&G(6y1=1CgdcT0aO8{VspiHDC7wl}{0DX8nISj}4ui5G_0XG?fD-$dBk zWE&eoTuyW_T)rJG&SchEF}e`N3#TH?%CJAX#L#0Mnr|a!At`a}EC|#gGC~~`Db+vD zyTgR|Cl#+^=^zNq7Ld;L+VeY_fko7di&^u1)nb3*!Y(vKjurBWf4_%H`@oTiGfEG?t zUp7y2PN%*OJN^;05aO7+4D)uo*2>#$5Hbo&Dr={A-zFpjJL88K}%=m7HS9Ro_Dn{%NTqo-*gk z8$*`BYYRY7o!`eq;mo%#g!|mm+2FSAs`-^D1m&i!wJd%krm?m*F4OWAn~-1B8NTMr(XB*0X<&8zLd2Vv0=x#7YZ+3_wv`nbGN|lVj-V5$wW+FTj58g_7AvwFY^S_G>U+84KIs#zIdXfR z6#p-aXbO*cayb$%whMYX7pNOHv0TTY#tWFYTQv?dJy0D zmDPwcs@OVEAA*hkiAqWR`cvMwChp#OH6vvN99=1{QP&1#U-Ot=RlI z2lw#aAqT6gJ~+nb@+^~liq-chasL*BJebbpK)St_xJ)CVf`JgcN=JN_9ap_d^G*FG zU&_93oJUB&doTGJ+^-J+pb247ziACQ8DpZRa@GIL$^yI^A4J>}BuWi94;EE1I@LBa z!PBnR@Q=9Hiki!H@)n-_{_L`uR8rgk%*fGHCT+C znkU@gSp3Pw-9SNuomGa?hal8j8<$zIgMi({9mq$q#++0-Q0fRkj8mKZs2^?);(`_F zErF2LA0Zz{pcNKq^W(vfvqSR*UQbELO9|4v(_EWeT#U-56KtB~)edPQz zJ^u>Em+TAg|6GEnDjH?3|> zUi*u2u(~V`Vd4SQqu(H zo$rlZ`Ne7Yw;^P{;v7KOn~>c)+=-aXfjokNy`_rt2^$SH-r1V8{5JEAt!`h>iyE@s z;Ck>NO1!}SO0}@3#&S#O)bc1HD?9dk~(|HTFlE(sLx#L z4qv65{l#MyAbbPpAWGhHa{5;k{)c}U-~c>%=GEwbdVu^T>CXem3289)-nYP*K9b+J zXPh((EGIfW|L@b>%2~}y&Z|aAv2!^0cb$`1Vg&m ze`LzRvqAXIs{gR~3b0o@HF=l1LM2L-JgHCp@?IlOnDHPO_J;prLeBtL!Pl2EVyRTv zo0GH2e?7DWpmi&37WkKp{#-RBfJVvqd-n&sSZbsY^4^_P^8n`vRbq4*F3JB}0ss*j0DExbAN}7n`^x7NA}OUf$bZNe z|CRu=zdxts6SP&?zkR?zBzEP5VKVNa^VR=N%%?T|9sZ&!`k#6Ky#yztW@bAR{|IvN z{}y7v#WTE1zMSegzN{1O*EKx2T-wcf&Ay6H0;L&xq0Kz$EUiIZcfr4w=k9yJ-=LZm z=$HHVKmtszzo~SSe%9<_3WCFV!bpQ+U*jI*|59UXVDPn#VtglkU4M*@Ii8ek7t1xK zHCBx=itR<4j;8rm`%2jVW=cpC2N17o>Z#U$!oL8CWmQSGyV;r^gK&A#QjtF>7W_fa z<;>V_h**>UO#JouRXu-)|5wk6oM}M%S$qdZ8jpxGoE!}w0J|2_!a{!mSAg?^=j6O_ zVz>AYB382VBK;G$D2p#4aT`t{tp%yAWtS6({gHkPbgfsUen-uCaVSX zIG?CV*d<_e9S+nhzuL?GQ5;FN^Db+XFL5;d^#hIcqIOk$R&NN)s|u=3zqj}K)^I@e z=%+3v{8#&%^29zWVD+c&O9HojbFo5|eE0nuJ)8&p*%z-R3&DRM3z7pD>3KI#b#&OS z@7eE{oqp_MXmBh<_j{|}4U{x{?D9_h53T(@a+@f16{+;%l}drKN(LZh87kbrC-2C5g;v*c?mIfD@cAG>qnTIk4{(H{ z?4hMU*ykt!u}PjeX%lQx&iL}raR;n*-5EQ%*JI$-+S2Tjn_{xeubrcID{&i`z18UWp+wD6M@8E7!0dCgpn zY}KWcC!Dmh_VjrCTistQoe`*VLew!F>e3nQeXxG@y7Yrc3JBO9Ab_FO6rWJCn+~gV zOSP3Z#iQ3w`fCE70f(Q;kccewUxKnEwMknqan)f;L=?xoW|H9OsVNQnhE9}ud;qV@ zA~5%rM_rZU{d zrl|ae9I8TpE0-{cPp*OCaj3JlU+jKu(GI}KBtLME@cmN-BnK{xN-7{|)hsyxiXxyf zE5K|*^Uy$H%gZ{J~0kzl5Snf$Q7Pb67*FD2zpn8KNFNh;Y;WrIKOV}46w^N@j_U(4wEOE#rJ%X??eKa*nK z7b%6|O+)V`#i*am&yf|dsG2o_KmIk@0`gJjPT|p|=CE;$DPYPvxUXQ`Q5Z#BQ{*?;zTMm*!!SAD_jBZsmq$9D6-du zXGET#15DbT(|8f4x{&1_`V$VqyPpAlem8k9;mbd#<6ochSziqMTheLg#+(P(f&)xW zb~acA(rc z+_e1<5Apw8AMtGZcnnIpalfD{V9x%G{Jqw`(K|vUpxJ7@TJpj zn*TKE{m-MW$e$s}Wm&Q6*Zg0M0J8$g{};rGO#irW{i z>`Wn~`OOor_8AhVC`HY+z+yb001D+`;im!?IqI>;#Eh8Ib7%Yc3}BV zr0yz? zsH~9}NFM7LZL0~9Hysns4Vkmx^C*Ui>}mKDCzhVI><)Jon-C;t7W=X@L z5A0esBmAzj}o6@B}ne0<$PAMciiW|FaXwliRRHpH!!SJ)vdyhPK9s=4TnC)HD z3m$7v1+gXy+HWF1nEqvLK05{w@Rg?fc^4i#ju+jEy?3-xnCcaOL1~Xygq}i)N!-M| z&uV%wX5T4dpsw_l)ev~&Ty{3+3y6$nzI&TQ7BZSg0g}~e2l6HN_DwV~D=sZhrtunmlNULv)ZD&|x+pyjJ4&}Ph-9T?}2kwlSGE}7Ex9idL z^7Me$hMFYvcTzT$_|=f<{C464L8N0UMSU;OK{Z~z>9gB!>)Yd7jW35rQo7XWk=;vBeWq z2=C!;%#y)T?9s;D69~3MC(DRbH4JjEeGsHwV|APN+fpg{&BV#U!y7}!oG>o^`-5iP z0thqkEBX98w%^==18Q3=P9KI<(vG;nso6EYyO!;g-I>9pwu2edt8+)++1yOAu5wh5 z@gWXB+0fGkudXS=w9sS?ob2Rg`K8DZXaCNhyid;*;5t5^6jn zq=V=v`5+;$P>573F}fj-1qIvC?3E1B%tJl};eJpxi8m5vZGLHEIL|a4;mgtH!*{o? zy{YugWI!jl(tQ=R>N$wDI^#!rqhavyU0c^hD~)MfRx1hBkS(|TmoKDXJ=-6ZxaCo` zg1cQ`*yDU0Zhws&nA;K09b^J<_#vvLA#H^CjN=N*&?*XE>-pI)Ihpp2|Mw-bxUJ{H;xK?e91Li&-W z0Qh`R1HU<3c6Fe1FW=0q+`hLy9d#)d2HUEeIJY!v+^!no*RUBIo=7(P_o==r4->o zk{_zoT`~u<%KS|wtXw_Dno)#gu(NMGPYntmR%w;WuAE}lzO3%)A`^(OnOs;~t)jD3 zYtVJuWEMP!tJ|gX3E_PkVV?66Xu6u5-eFJmV=bk{8!oJ28-eaPpJ!e!+uh$b?YGx5 zvMa3j7>`%)lu|G9W9h51dbJQF=T^-}+%6|#o!wMIj;zEz`YF}E>V)jUnbFuy@uhO& zBxi`NR#N2y{Yw6ULdDAG6c=Uqt&ydyTL}xG*)F{i7}Gv3$HMwhd}UN%{}X~Jt6gUl zeURpq=;s=a=$Zwo-7FpZp5nX)X4vY8Wl{34ORN%kggrZZr{(#|<<00V-&oV{ORLnjWw?TAz1@?xnd64%Zoo#Ob1Q6erg6HZOU}p zOysfNnXjz+^k*aQkKqzxz47lU7s6;l)zw5&ScZiuoHSUsx0Y-slv(uoj5m(N*X(w5 zMnz{?^9SmotAnmYNPa0uL zl+&&p5tP#!lIo6Ycu_**WcTxwYfSv3BMdw0`flF=I8_Lqv^}sbO_sMC+Em&|H|P9~ zwM(;WIsgP(O^W7XV=g+a%|$rese+p)_^%b(6E&ZQFtWQNy#nvD#nDB2L{mx}Oj0OO zio2&J4dql92?lft9^=y~M2|P--aw8b$ZfR4a#Q^}$P)QY+rol+W4(4)JL?T@j`~-U zdBBA$VH7r24!DjbgDP8IVR#snK(33B7R8m=mGwbr2R{$SxYs8yLVPvrwSIbU6w{Aqy zB(aHrO&D7ggp(^ZHMpS@wzjKiM&Rfw#M7XhVDtma6`qLzX7JKHI;NmB6ENbufi6u}q?F343TEU;>4z8=q9ZVi=+0=60RJC%-^3fD# zF^6mR4d#SnV||w9cZ0@kD$!cb)Ly$q9zlotSR_RHXQ0p4@MoiA`VH}Be_yfg2fK^N z*QdL%zK7N8lPmahR+5=dHIx#BWw{wdnN42k2F_r8w~8-3Fr(heOHY&;fH(B9TxfXh zXLgx}@1aR%$Dn!Fyd~*UJf-KA(%`}oyRgbbPhT?c*Z2pQnZ%lX3bXc^+=S1ek=av@ zeyNv)q4q!1YC%1WOM734^-qvkD#De6!E}^JY{n@3!vVpt@xX8$-yiuE#JzNC=1`nQ z*y!5>JScjw$4G*D6=YPBz3t~wu4-}lMIXKuPoD`uEX`hG!y3h)o|^4PPPpgWl>=GZ zeTi$Y1y{sy3H~-J8Z-LT(X`9h$Bt@y5xMBfK$_GSQUl(4JYQ&nO$W0yE$nY7MADpKB1;?x&urutQAt((bzj(MVe*64~}ARWyir+8S+YzWu3b zO8c?RTHr-pRt&w-R%m$m>*I#kP6DOi#E3-q%4WM>GsEOiH<$UiOJYVuQEBC!DQK z)1dsh&F!HTfm;O>DWKV_mXm!{8|zL^=MsD8GLI>u{fKK4b`IL=&z~&x>ez*O#k;Os z=}_Hca_QBINK9Od)HmsUE1FSRGk1Iv5R82bP})nhP~J|)lAH`QSs`kjYp z(~CWFJeoK5i@>p0my4`@qBuv%7?H|G<_qHI;E-?J->~J-EJ=cY0fME4uXJ{muENH` z*)qJ=S%?;nVkKtWJTAqsNu=#Pa{-mW9dVzekJb~C6oAU&P7KYXGc>N z<2FL3>uIAP|0#`0%DkjT5%?jJ{6^A<;VXI4oMh)!c-#vK%9x|ZiqcT+wAB0{O9ckc#SY2rqW)*htew>8XgrQ?h!yZ@ju+@CJo0(CK)sA9a=!eZx?j7u5~o_P#X!P^h@R2)efF zo?^Tb)QEsC5ooVFoKOBdeT1Sb+q}iOa~%2Iw^B;=ku}o(ngO@IS7IW!`W6Y!{>_6M zYbp0=U)edJt(_e9ZVHt-=F>l{jJGWt&x$**H~Vax39B!PBykpzQ>$BYS67xV@0l#) zabGfnLVNRir>fh?T-^!6+7*J_65sCS4}f8GalJ^BfqBB?0s5MZS9arV-^!~Y{c||~ zrm7_qN2gYjm1>aDu2TLh)DhC`%=Zf%{LjoKyy3Ma{QGYOA0{`rR<9d~soo#5G7DU& zQ(bIR?fUAcXGsYi{&w8gu@pazw@lgPU;;4CI{LMgw(dO)tivJ(4=xOEHM)XL2hKS? z$+f7Q6f>ST`0a7Nj~}c*e@FUck6l8%WP0+ViYB7P@0RT+Cohyf=8|O(Ws#Jz^1(x| zb&}NSovmojsdP$+MH#e+yr<`ZF6c?yh4a=4SJ)q-ZPo@WKUG?!CWC2{T+a-u1O}M7 zRg>lJlD!um6cH<~8|wb)AkbxQ;L8%55I<6FJyIp5N>O!qPKRy?UWH~?O1RIfn##$g zQ}qxMEe1&sx)wKL7#!LAv?pm+jLzdIi-S$lFQ>9&N$V_ej?F{-%Ep+X#$nQkG=P@L z@oy^jgC31&mTdXl8kp=p;|~1)gd(@7goT544PM7Gd2x1R3}Mx1Zr^WqNG77+jKq$^>Gj_qNCMTsy^+Mt%8i|$dS-1~= zk4|gBvCIpFS&9|n39gmAX_V**RxOFf2tSM^)sXAE@~@f=?N{X2d_TAr4IN#N^kTtI zgcqXfr9$HDPkZIgj`I3_6vrE2v8Y~Ow|9dV^7$v} zu3-#dawEPQvhag$*b2eEqB56XPrg$gWQyQ1R`T~NU(bKsL7{?8A}WhFJMKL^O|HY% z$XN|1ROTYP6OhDh>eIG)zZ2zYWoNpRxQni%J6|zpUpYt*8gDiW7UR9QHBp+*iH6w#*^>*@G%Q(weuMBnxzA54j;C~`!weA7I zVkRafF?OX%P3dMgRv)>7i(=|z&G{#yeTZX_E~-<*q9f)8%Li>J%LMcd|G}Xfv`HiW zPH@I4n>3H*8kT2F+I*~Xc(CpK59^YLkiuH~j z1M@_hv2>UUmR{~GTxG@1OhrTn@K&!3HEmO}?Ya3jTcT0%1pE`IJY?S^Up*HLNjC}f zPphBE3nTZ&t=Dj^4PC59(yXND`ZizAX1e5a(Btl=u?@DJ=q}n01jm!*1Zlfy?7#=j zM_+MR_pH112$i(qX~{&)2H7YScC1Ie>R-qhKsh)%7WuWSn!NLj1@h>YF;k6Z!F-Vs z?9JT;4}2Rfmuh#nJ?%v%5)%-^aTf-Yhp%~tM5TJS(G)cbJZ&)F89m$rNz%qzN;jv6miW15@T>&(h8*%jGGts6$ z^-=m);JNmiT zO=IIMyhllF5TLEFyEPb&VHL&)Uo3amADEeMEZonQLvJ(2D1SLFJFS_E^h8#6?z!(L zSIX8lue4gZCYj;1)L-vY7k5pSzr0p3B5>LSE{HywSl52sMghFGYCX7%)w|0|L{TKY zz})D=$dXAs3eoe;Hn~}Mu3N;UeTV0nJ$GK4L~3=h=pj6v0G$MqX$y7}7G~_&8V=b` z_9a4h-cVH`bRy?19MV-+w$LtUqfII1p8cHtT=mvidKjmrSV^a~rJa60q`XFz@VGRD z_4ldxm08lE?))1*E|Jp&FO%oNR#Jf%J{%agLznUwDJulH5^vn9?~{1LXP@RPw*AJe zc|WyM9XdivyuF-t<4v7Wu$Xxd?QphiZ2hZC$aebeK@#`fUOeMXiVza2wO>k9~rGju`_u}A_WghB_4T(CljsoEkWN1 zmJ#*Dt!=jDi9P|u&^2tsX2lUyP-f2qpqHtjboJu-(w1ijLamZXDOD zf~zp?c+d%&$`>biRzj0M26wM*)Ny`#QpkGfvyrw$nQ4fmC85+X>rP>Dm)MAdvmwTF z!48~Q-~BK31R}e5@UBNlFr2J3y7DmjKFn++sts0(D-Z*>-BezkNc?oOYA;Octj*;^ z<;0pBLwxhNi#H;&0#>~9N;lR{@0jICbKkP?WqiQD;`!CD*DQGTgAz-|(oj?QV)lr$ zFw-eZLU|P6H@H8TbH??j#A(htv_KiU{>na5Z4gq0-jJ_eIZqWJbrwG++JAVX z``gZ{z&TSXKgpXlYlr77r2KAC@6i+S*8bxc)bRGsBcXAnq`rbiQ9uS{o1A%7nV2-~ zl5wHTvL8%)iOWFznCY~tgcDF{N z44-89ZcjDN(2pTjuYvB?UVM&*?!mK2N@xQgWZU?FuyET=qw09` z%t#OF6p@wZ3S+JEgz$>O>^F5s#rg|%<~t2-&T%cDOeVhZWP8O1*`{E|0~w=SkGGTg z!chky^qWdH{gV?1(ffDdf-1XM#)~KEW=R+F>&Je1%ec2LZ||o0nS81XczesWdI98S{hQN4z^oFD#39Cd_uiU2fOvwK6op4rSIukg2y1%dJe^OQ1Vi z>3+cFYUSfAE6_zWR};3c$HB*{b~Aofal}Z)k9IFV&nR*Qn6`! zG?i^!IQhcS(O_tulrHvTDkX!Nvk0XiZ&9ebL!H_4I&|l|4?(7TDGh3@kcx?FEoTrc zp@444xPLYq+!Gc=rbTIft|5kWYMP^+bLuOm#%fpF+#Q1JRGdNtXxv;pd(qwe=HHb$ zgMj<5?{~>8rEsqdZ<|3EC*mj$F0Km-K6f!wZD)-~#dmiv8*>O7Ypd&9j6IpPuW+Av zCfIipFUQe*cik4VfhfE_3yv;))243j^u{|j$#zZIcXiE{SuFiINWNhBm72;r&kbIk zc)HJb<)Xp4`1xiWvL?;6AwM&>bu1p0aIFnGIyRm2)cgf?jY*PgsKpDtF7Qff*T^Q5 zoI;^E?qg^)ty|Q^crF{2wRgSFeUl_=gV|Br3A<>R>eH`F*qA_X_kDY#UoR(P?j#BE zHRtGj-sW&eB`qycQ)bd%0n%dp!}CmW!dXxMj)2LMo-e0EgUC|XaI?8zBGFC_b@3UM zHr1jB>k>*Svo{2O<~J{$JKn0&br^HStk0^~xj32Mk=U;B8;|d)OT{>&d)zyF+$ETG zdMGYeyKGzGW6kx$7C1G>=B&bYE7J|Sn4Kqc4LtfsEb*zi@Tf}eT3trameBT%Jy$!z z_%5Bv7JRV!3ty1|T-@65u<=uB8LzwFEwSF-q!9{j38Po~36~jk^0ub>6J=BSOKTct z3?Ei*!#5|-JGK=JZ{fd2r(f2bofuD^hiHZL8fw@#cxI8so5S%k`aZi7rXBH`j)dMN?Z+XD{0tJF1(u0>vS0VkT~s&kcG{aV5r5;cbQblB3G@7K zeMsv&W2-F~DWU6lI$-5Ys|%Y;Lm}~YesV9o#&qFFve-oTx~cM*V-f47h28QxSE0$? zk)xfVcBm$1xqIp;Bzf`)mdHBJ#@(1i_fVorqEyw9OM434eWWIG>AZz@z9l<{<`~rx;uYKV z6K^PB`KIBbi;Ds3^R21RkEj+99~6}v+wQImR;mYZaNRL_kv%HkFf;WzJQGbrmV)F# z@vbNnPa?A)3D&GO&6@GDBTkhGj=blBPN2XWUZ3bx!*)ke4FjE0@O5 zG<_)WSgmJJ(ZgoDshrcUAd46J&gvqj(=;II#qE(qvXVzq4nT@F zX?6YP#$-BL9?V0_%qaLaLRCB5{|BpXKTt}5IQ{&v)y!@%N++Wdx8odOzC6}Y*l=~$ zfyx8%iL5Y|%YeoSMx|3-wU}^GhG}ogHRzJCdD<&wB^rIwzi9Od78abXgnXHlY*nB3ZrU`TYKn-CHIgGG~TThlDr4;8jvn7vphROkD@b-Kw@KZKhl-7Uk8!kD zbP8g`dC(B-Bj2y?D)p|~%UoVe(3&@w)2`{7oC2$O!1c^d|H8ZolLFwMCD-7%m%;H* zhRJfOTgDctGqAF%6;eOul8yO|nv`UzA85}nDqFDTs%yEL-!= z$7T73J1wU`%Ln|&JC%NZZHz4)mT1PXzblOAujIYrkjJ6BZh|lqm5Eh0BTv#OZZwnP zisQI$ti_=a-8HQ?WtH19YCWQW?;#DTAo_*wYf@W+mfoe_&CEH_NS80}-^Yc{J77)= zHtEKl^+ZkgS(aJ~fRFY+>J8KPs2qlW-5r+;l!&u$iI*&A|FL#q=PONnZ#>&W?{6~B z3ikVl93A!hmev~h`cG#=sw{`PBA}c+%*m0}TNVKsoYB{>Y{% ze#0JSzWGe3Oq^#p_1JCX7fdokn%QnCg)sS+S-8ZsHTY>@wtfAcrz8yOZYgWGaw>Wt zzi;U3Nw5T>DsyvEUUFwshLxk{6YPf4QWC9&Vc-OJ?d|Jpj+~mE$Isd8U^z=~YTjlh zYbA%jWHFJr%p`tCr^dFDgGWs*BHJvO_O|_MoWb$;2K{!3(eQow5?w7T+Q@fbX-ggn zepY%Ys9UI$3r@am5C`HzD}3!(NLi+C8u4nFG4axN?WfuKb^Zd|<6c73H=%9Q!NuZ% zbX)6u^~&kvu7=Q(y=VuGYla)Q)cai4KDp(z%iOFSEa|-XT&LLu5ISLEU8CZKsOp-J3#m8HZc)LXG zpV#E<%B^`Pzp}Ph!!RUspsV0h)mj3++uu}AfoFQKqwzC%jh<-N)I+j_HN9PT-pnJC z4gt$Y8Zg%&=Ue!sabN$e_@=VR%PkrSh=CADi|KZrAHHfhdPrqS{(0%zl(?n8H+*&) zHEHdHFwYQ7y&n18^q?^ITv* z!ei9NOcR^L-(5IT8HdFF$P8F#sn`*su#RXYSFDag* zyaMEpXhr|&duWaDr-~a{dPAY&ZGZ)ELGns_KA9@&a?3>%5!?x8EctevfXiz#R^wAb zp|s?Fnf*z_LT-&IzABxKRfbExVC)r+Al{XO_-QXuteThb*8Zc%lO=x>`!`na>Y>v7 z5;?Z=)rks5+Im8@yj>}CW%AKi3+`rR$tOX=jqOIPw$tU1f~!x_>H`z&{3T;=Lg>50 z0mxI#S4H`~gIfB~=^e+ni+39VU=m2|jfnV}tlcN#y-97VhP!nXQfCKUd9AO;;VO;( zKz;_ix$$$XPG#q1f{gvE<1!Mc`*v@0Q0@QQSV4trIaVoC~s+ zI4+nmQ>b+k3X=cpRS5UI1NJMhXT(0s1RTJ)D1_G;^~TQ?=U)5EVE*M@{|$1@Pz2zq zE_(3Kx0Hc;`Gb9~jX@tXW!ct+%*fxN?tg%i78l`Th3S>*)2m@B13}eP8!=J+JGwxiV^CWpE=|Q|W*MLPi8Q zw*PKSvJMcef8*OQey@D?aZEu-csQG-HXm_z7UsF(;gNd_2V}kl(klPK;49q%X@_Kg z3Jl}*=Y{iOJA6v2zIyw|#U%d{@{_I?(f~s=WCGUv7iz>;}AA=f_@l$Oj#3#Q&747LqWg+Z+-BSVy(c3vp| z!M0PMp>;-ox|m8=$~B(HvcD-ye^RJwSIguN5=qrhao-~jyXu?J1jO|j%sbTuLLu}y zYT*pL8M2=o!%ohV^RME8m@ff=N+SazS{;zd(?5z3`!W1#?MPDCpSWYh2neEUS>WFJ zl%1dO=~`fZ8Xk^u|0%68r3=uK7z$ygvzZ7#G&rRx2?2U{A*n2;1>C3;Q z{nz>5dIMS`hzyzh$h}i~O|#z0rz^4QDNv^o;Le9V;fjDe42;og&JQ?$KmJH>blaei z1r_6^`L7z&K~Zao7M;aXd>!6vHz^(#TeFpMIsI)cpH+Q8HC`xqmDAjFZtrwzO5n40 zyf~ns7>#P^(E2A%e3rr=U%o&?*#mW6`TlPn!QXVfjR1yXQ$xA;2R*pre-(hT-?RHj zflfpH-zfv+(kKA3XkIbvCI9V+0R*=cdd7ZzXB_+c2E0HIfao?+R-TytFVz0~)B6S* z(@#$x|NKmq>~mxJhQ{alvnxxG9$d{Fl}vb+aibo8NHAKP4CvN8!p;$KgD{X z4oJ64&lTsK5{J>vP)CYfYfH8Xv*})@$7~_<=Uk%s3u)r@%#>^=@6f6leHYr54a{R> zk_`?2lXIoIpAft@mUlIl6Y6w}=r`AW!y;o1hJ`-C+0LpPC<&x@Mb^HjRVIzYqQ z<3Eue7<$R}Q|}pW%>Zv2uDDJ~_^3&DG4=%YuT}`l1D3Ld&j95YzDroS)DM!b`d`4H zvN&)Jal`E2R)zv`<9gc7{S&4NX)GP(8ekM{z($3*(F7`5=)*4KL^(#CbTayBs z!n^taQ5^v;a+}(8;ZBFd4Jh=ExeR|iI<@c*{nn2z`AC-ytXC;)s^=F1Bc_zkSq2zp z>tQ76&`XcqZudi7Vf*pi!0on5*omOB!!izBx9j_(<>=k^wirO=9UTS)z{sDHxyL$# zRd5{?!;80$m5NF>Bzx~of8{eK)NKMOFj`8~mlHDctsi~cViRDiloR8!{`?fJ$FK2T zUFpCVLE@$-S}N2Ja6EKX-~=)$?_xrcnuoU0sO0)8(uL7-G&laz1^WM_|MBkHbU$!= z*-m+Nc!f(IuqT6D9jurrR!o&1DEp$5!2Z#H&^A`$g(#e4h|!Wi)V0`BfhvjqnZd@J zNB7M)#9>vNUg;SbvPBz^425pWFyXtdw5m-mqC!;lBlR(m^&f_J-)&%Z)GmDaHjrM3 zNm?o}{tiq4R@v6+p>LFoOT0#Pi#{dc-`;?JZ+c=7DhQON;j2=6o|ZnCE1YzD+4bFY zBZuE&;`SV)d;}}U!?ps$Tdr6;Zu(0aw8Hcz=!phL@5v}qo5Z%p_O56r%mHW)0wQfVQy+UgPE@f+{L^3W+BI;vbWamY6$(M#}iCs~mN9FT`i(&LE_Q7G81zcL{g_ zqQ>+Z4gARp;OT9`h0l35wYM3jlaC8+-QC^WlLP7h)`q82n8!uxQd^1WoYMbHpEFPX zM!;TH;=WHIbaqH*mKmT0tgKGFq=ED5^^-RxYyc;ti$o0nWVUrY282uT*7UkXn|VnT z*LX>((mlNl5Zuya`1>rgRIwB#lxw&WeYeS7_5|Joz!>xnC%dcPk30YR+?f6oz!fb_ z((r2wdsCAyVLL;m;3W>zzVfiao_uO8pOmVrOaOCcIVh-qYjmZ|W3LW&T>(G6@<0!L zs?zIEJXbpSEEzxvf(Pr$#sATKMnpgUW>W{46ttYCe_u%WyVrm!2#HS2n!nS6AAbYJ zfRz;z!?RR^2^h5(@2naR6a0Tz&nfN>#36m}5qwatjVb%C9W*0)5A`7;liEahWXws$2c#rJ$A< z&r)=Pq9DmGq%AHeX93Jtqr4TB76MYq9$F%!&S6Wy*TxF0M+`LiBgEK1RUVZb4Sp4? z#ubFk4XduhZ+X_folE+J5oORdCgMrw82C2g*=BorT-idZ*wWX@s>$WynEk)LHA}xV zRFD4B)&hjwDKI9hk=|_%wTpt zd7UHcP`Dtww*Tb8r7taQFz(itcN(vN8p)&w`!1gsMgkhL=s$AV3tlU{2L8KH!@2n+ zt29#^CfY$6(E#csjnShU(G`#k4-c0#d11!li zw&L1kfOMCpbVz~$F09OLWSPd|df-N%=p-xhaFc(*S8Ur3V1CNW`^YTe;b0W28rx#nD6omv;hddYe^cmvgAAR7BV?{^zl>9R6#(?O z28bNXsSg_;Sp)ATJXApU4jSqF)jtSRk*HxrF+IP;4`+^Sb-PTbXm?dZms)=Io-6> zu8K^WtUa=h=4_x~OyIMOju0v@!*I^>o|>?Vg&iJ}vaWaIjVBMbVtwlg_1%XH$iJM+ zWJ_=x&H28QaP_`rtA)T&;?f;^k*qb*VtuJVO8Nnl?x-LtJ{gE$h0)9kI9)C)I6O9V zhUe1jq`h6$XCsY@Jzkcg@f1UH(Hvzc5r?gmCvkjo9?wb#u}Y}o=bS>$3q*U8XO(4zFdSxgr z0g3T$;G^M+-$tHGP2&;ZS>GDJ2CK15sQ;Yl@%1AV@y*Xu3I1`KD8{Iq?nf7q%~FBk3yX+_8_65GLUAK1obCC#LMfIWq;3ZrQ9$G`e5LjI zP<%yysTTK2U%kCYcgwiAXq~O>^T_~&V4pP?kij9}dcxD*VBJ5EH=fvs5E-DWj@GjG z4BHI!QPFeT)s=Z78!E?n^N#6Ip1=@BkA8xAnH37h)a?c9immKSKI$Xm=7Fz#Lb{KO zrxV=WuIZ$u0I=V5#14L=ptm&*#t+u5HsSFGX3v3CBaet@8?JP(cEi#?o>^_ zhSch+XdEx(EE!F_ZMTAOEEC@FJLS@j=Qn37YTTe_ zLH+YN#_>Y!p%O+A494`e!KG8(Wjl(0{T|QP#Yln1F5t={@K>#h9zcpQr{JR?9nXCu zzWVp-W?LHroDELn^0D*n#JXk1g!~V{%e}XNJAJZVR^ne1G>XH|H-84XirS#!#Kj7O zIEe=Dr|&)3k8Daoe1ET!4;yLrC?yr<^rbw?E(ep(vDUf)e`ADG{-ny%vhUN3qlPQava0>IvhtPd@$ABsdH zHyhNT07Rpw(twrnJ9z%R3HT-%n~sG@*LNu4EOK*6Gm=w(YRM;9yqdNdK0g^EQekL^ zEYZw=kJGI0zJV`LGK8P%(kmTAy~)>iV!kq+rSWxU4?#$^j+7ecNSr*x|$jrWQiaOpyq;KmE9v1t0n;~J0%(k_;eSK{_TkobPjI z0VxX=&uGB20=4-|4^G#(GsNHBq2OI)qT(94kOjSNX{rnL^wWP5Fn@33;iX24NH zwv!}YW)6pN?F7-|m+bKkClj(Rh&+TGir)JS+#kJ4W!-rZDCSVSoLc7 zOAgWNVY+&pYTlV#ZvVD;x>Hr|agB>WjmWLEM6mH`3UZlk768h(TLZakMUCv?2}O-# zmB?iLN+Iu+U8snJf?!Dn1bp0g>Z{$nr0>B_w_G4ZR!K{_2VS&3EpJmkyo3v3C+xD= zqbOVaN-P>&rY_M)!$?jj(zAZpICWg4I}Eo43i0`SXqL8i6^{^eE_NkYn*<02@!B9f z6;HbhomNK`pnPRtNJu(5ZMaEv;!@UDzD6by26?@B~*Hl7SS_JSIrl+&d~36S~% zm*J3%Y$cD4M_|aSUM>9q?HZ?zyI=+QEf{X;!T@JuWf2t^ykc%|aN3Z%B6YI8LshwM zulSHnW^sR_*h9BAXsN|s5qy7nZ z8bXHZRpXa*%~uAPMN>wp_~~XV(@Q)fU)*XBcXky;%=%xv)`9Y%>QGan;}nbf@mi%o zUe4xy)m)?O~1gd?A_OkddP{YV(Puvv789Hv#h(VBMY z-AWr^KfUZ2q;LvpqiyKv>ex?j?~Utu|Ni~X`c@eF8liTVrOOT~Ny`-jsbD+f$MAfE zdPZQIAgL!(=%Xvb$>t43t<4c95R*Nm%};!Rxm`7dOj%xAI`!CkFXUk&db-rpc+kZ) zeBn_4bf-AMEM2AT0Hf>^>ag2dSoF})1yc9@1Jh{!is9g-Ozl9{NKWe(ZuRS}>Po8k zsWkb#I#~CZCpd&ml``&73n=Q8AJbsXGxLSsj_*a5x)V72n(er- zcF1FSH#J;NqMX;}f(}I^*mj2~f8eQpo+<(0mmC37l^osNqRe+0E1P=y}IxXH0E3 z&#N_Eo)-TI5`;6i+*l)!bDmm25Y04RYgweCXbT`jiuA~1Z+-)||96=yTbzK#?H858 z<)Tp=!}=cW?>0&~mM=RjA=tH7@yXoy?^=j@2m#l7OpGcRj0pq-=k`*&AxaY^O5R-S z7{3GuhWJYlnfOO07pY^1JKi<2SB~>!RRIw(0#s--{-C*yuxj6kKU90fuB2oS>J1j( z%}m9B8!{hNlkYo*M?}ndWZNGx_<*PA1?3RAog4=g$dWy^Ljmg<3MUOzQ_~USyUcc5 zW%%nx>)`#HN9!?%VX7YN+0rRk*bY)nvG^{HFV`ok0VhDxoe`b*L(<@D52^jmR;B?Q z6xs&JLfw{)=@O6ix>2UZ3rh4)3w5R@T6}PcNlkSqL4#Vgf~>9y)i7PF4YArroD`H? zEnk6UuS%6L@=#-E+q&*~O+ zzFTkOAi3C|$`1^L*Zj3{jycLIf}oW-o~_j2`rGnP9eDWN=}}T|@CRem+mS0O+9orf@LuD8_f(VT-wuc* zzY=iv@OVW9b4Xb^9h^Y&fp-x~z0>eUH~(UZeHVc$&(TXr=>Y4~<-vu+hlU3?sX&7X zJEnp-D5Rdx8wG=2Pff)I8QMO$WLrnzPc3XcSEOsuaTnM$tG#J$%pkPT+vfy0nwBK|c8uADaHe`Fd4~O* zSFZ^}=b05`L-a(-oO~c@?niYZ0^{`q#jg)P!;6Dm-ecIJVhC*>7kiAznb}zCgPYiM*Q`f3@X(_gm&&Y%l5sQV)YJ zLw3m*T)bp>U$OUr0L&fKW65GhuT({##plN>j~Y{xg%gqy+2R>b&zIf6w)4?#+?YUhwn~-UAW)Wi{9+Btaoz);`_XHMsRhl z2D_-b-6IhV)ccR5H&Nzhcz>{9Ph*^2H$B@G&DwByvn>-zb&uKXuRBPrBSX4kuR_-sS@})1_0uX zsZm>ti+@{6F^;ztFdClFPke-|1Ii#!#pY}9b1_IiM}CX#;%hrp+?|DV)^7Ca%)8nV zx(ij8@wPcMBlaymyl3@&z4OAnhIk1li4g84a`(uz|2jV;@DSv16FW*)kCvq?UbrW# zTCYf8cM&;A>fCa#Z|?e{V=4}G&B>ZOi+0Lo93r?RFyg)(YQ0^9pF5BlRK1o`B~V zgk0u*aplCqCxL|LWNiusP6I+(+X%eQ1bm{RXa0*AyO+KwznOT6<@O0 zeKK^xe4MYqVjQ?uM#;Db*#dn$JSTsztcvr~nqc)26nA2#jxX`PW4xuORO6Hge@$5w zu$ogHqIN5)*6#6CRq3ULh$1^G2kBlY$$}$rYaCe>MOK-TQGWGDDTqSdMll-CMeBp7 zlv^94B3r&6fIWp7qUdxnPf_?Z)uLm};$n|$#9vFni#Ip>>H}1Z)Q6H3efA{^tJ~8z zKS?hF=@(%674w#A)AWYLMB+;hzI9}TTc^7fr(YM@pRKz_3-kXqPV3s*uqCn&ViS zCBxP!_M53RGRFEgK9WI10VwPw%P}ICQ5X|&5MNscvVJMtH$WuIl+UdnANHQQ z7(aHS)gNF#{ua+VnF}~~#waR*tVwo6Z_~%c5F&M+D}3N+ljuz$T6Y#i?@ZPr%n|ds zpm`Z!d2VcUC-6DN6xA+RQ7s?aj+$8MX1^Oi9#rOtmj^)~uJ`8{f_4ib3enysdr?>E z+x&4(_P*(&&oKauu+TXw@s;s|5Ngr(Owr!!c>iKhA-pGB7o9s>G^Sp)*|*Ws9>99E z1l+$Dm)$jNl`rjlC$sWxZExRsIzXf@Kyb>vnRiMJo5P%L=T?OFBa>!xy5Z`hl*3>} z(UZ_S8qiBluGXwiL>*e!>z$|WC<-5jKY@tI;UrwBckc5zJ(?1l%mwc48f$pvX;r(_ zQz=rWz|PMepswTEcVy)ze>z)dyx)ukUaoM`Qyl9Ry#U`>tFT#O=N~;;@i-LT`!o_A zuCIES+MrO_xOzX1%OzgkZFj~{5!XRhl+ETt=CYCo?;w@W>YPuNUQ{a~)hHtZqoeNV z(n2HcagT@;7#a6EixPblaaq`}vV2ytHkA=!zpU&Q%vnKiZ}983cjaz4s4;1>Yb4j) zZz9XO2ipHhtUlCo)W4|&Z^9ng4V=iWh#q@>Y^!Z zHj9;6RKIi0S=~|m4U=vV)cB-_)idVQ?Yjs6J3pM>L{KVJ54=*%BxxPLe4Q|R(xr1B znhTUk#VhH}ehwDMsbErTo!P~ao$d4ZzG-)8$q!3xq3qq|h{u@^!*y@V8@E1c=H0M$ zL;(;^1ABDgpH;TysPWr^q zZL~v*^C5~nnHYuu;II1N<6yvsHeJHft55`7+F9-VlOwQ~$=3DTl-1u>J142`3KlUz zNKcB$Pt8OhY{71Ql_ezU1+Q`v*KoH(7!l9AT%@g2<6=XX0q+r31c7wGE~1iE@AR!5 zX9rx8IA`-cd6GxhdVoD8Z#Ambd?7etcZxnfb?KC*p$8mdI^L|u53k#e7X74Nv+h3v z*BBYd)v(u}zNom#Iwer#=w=%E3F3A@z9DoKJ#8uMG4n<&LlylH9)D%w5l?(Wu4r|A z<~lF;Cb^lRDv|r%pDc={keu2FwG@iE zJX;;7H`fwF9&YCcCU9vL)~wyGUa86Jve>n-w{PNA<}Y(<;7;(NW>SS@PV{=Yn3<90 zM1@`D>3(dBEP1hDCSZUlq(Ss*eK{hnmzk3q$eL_b@@X5&Q`|-lsos0G*y%98|9tsu1;qR;dj^b$8_8Wz;y4Te144(+N@z}=r{z|9i5Pi z;AX4T`tFH#J4?7v-L-GfI9@4xtKeGd1(}F_RyduzUO_9E zP+$DW7L-Ws2&i@kvEGYInMJbG?$G&?k`m> zsm=kbR4)6`6w%19*op@jw=r-PP;-7y%TH-e`(MDJtQ^S1FUdZ0$=K4B2t{xd2X?(~ zCS_*2|9wxm-T{tn0?p9y5y(3L0XCG`m{amFMy(Q;} zaP)K~ig0u#{j^(_xmNUZ-0cfp&^l_PnQzU9{2u>UcQZMinbg#T1Uv2wolL%8I`pviI#UKc z@45MVSC444M#6s^P15g8{JVhqShaM`Vv>pG1lQDXKC9i;oo)D$~=`A5YUj z0^Dypor}tbGy$-i6dweYWzjyhv)QHY%xD#_CWc- z)_IHY| zfRx>Apieac!~yC9G>3dLQ21P&&Rdz>=8gJPPt96mA+_!58%LJGN`v(ri3{H0^|RqAA!9n8lSGfO`7S(d_k`G3A1U3?d>^ME+h5FZDEBf%3}OmtK2xkWK`X;YDUQ0a+|Y-H4!YNQ6pi z+k(Lvg_W%F!bz)mAZ7|4ZYmeCraVph;)a_^4=&!L#lXVEnmx3NfQWipOz%S7rjJ}w zf*j+}mEt7>E^ue1EyzmsK9CBGyW7a2W9F6^8G8rVR&RAv^7^M-?NvL&u;36clF)t= zLS<7HVnE|18$qkyga^V!+*uF>7UdWADr9{^$Z2V!@b?iL8!M~B=LU|S&CAWnw%lK^=Pyx!j@z>D>pN3D_`qU5sc z^EYn*k?#k=Kn>orc$-3a3(#Zx6701kOlxB8m5l*F zrU6*ANjlz_aDZCF6*F%2Gc;ZCzu{d+F%YkR;2-yh;+}3+8ZZkmF_RAK8V+}97;H3& z(BQqdQNYYEuDR)e^KS?qJyl=mHsMPO5J78106;H*zkXAH2&oxWGDrtb@aurWrJ)G8 zMb7p08Us`LswY0h1FbyPNqr=ngR(Uoil`&T*zzBTulS3gwZ>VV;{3%rKY4xS0ML}?lWToqzi$9Uhd^t}G_R55@5k!}8U--% zL`XSF+~0EoK+}={ngSk)y!xwy3_T3>vfk!@YXSUC(o>N&x5v0?$_Bt1X*UC^OwYU{ zC*`WG8XP9}y9R(cbpp_^TlHLy86T(%ho@EMl;*bAAS@);R>@Rz9%uVg(Lj5bLWk)Q zMYftjTmbw(xvAXAYO(I!^C4+LpPz4?eahejcEY_N0iT#A0LNa$+cOJ=xM8mTQxoU> zpTw^TK+%XgJH@kp4*c8`kW&1A10%e5 z`h*|;%E_nKFiGK6(LfbwIprYV+tNgG2hmY>2J7OmvRAS)H$~V&!p635zAt(zb8sxE zZs%-86d;o6^gwQwl~L{>bD`847U(6?0@O?HXkU_be-RF(Y28Lf_u#*p(+vai+rDVX zZWoqz`q>kGJz3ypFoD;2S+*&Mx&Or+9;&W*P?X4uJIpQ;Em8bqO$S{^r``M&&=Go` zf8p2s74z>na(XI+-={?0ELHY7xJ`}Q{tW{OIB0ubA|rd;E2W!dr5Y2uxMn4Z7CR11 zCFG1A14W%jr@7Fu&a(i^*Vt zW`fHKCVP$Dm-_Y4_C2&N3Iyd!(QKaL#^fq z0{lD=_$Z#&`6eL?tne*7XNP?jFz>JZ^_|XIK_>2MtVr8K+8~~J`t%huS{ z80cl+boY&+``-f-9EjZh?y;Y-scWTNNm=dU*;9d^K}#U-{0A=ezfrZ`{+h!%=mBR1J+6H8UBa5JpwtL$92ij2|(??7hj)LN^N-Or^Tcmi|u zTCeq~Q&kEdUu5MfxUV*2f0#i0wMJk6wvhgDnOd;qB6cnfGN*dNw`O2QrQyzJo8W9- z$SzI@xAj!HA?j8U_Ee2$(VF`a4ZQ(s&WD=d@kd)?zJHj-3^2>VOj)A}tFU3s-Nky_ zuFOKlHtb3A{gP)RN_c12tWwr1s~TpLT$Pc2j-#fjugBi^pZf3KDXo%SRqu-NZqw&* zF{1CT2%^eUm+7`|j9L^Pl5w0Tq~=^;(zEQsE94nw;vh4%j2dnggdKkCEM3}fZ0p8? zQan)gP1?0g3+Bu5IN-m(oNgZE#~U04x~oB%D-sEoONv4aSu;&abmOVZsm>Ea?tZTG z=pVio77ZRMor`L`K@5Kut~%9)_s-}mOrP6?l{I46S1<>Bs!v@gQGnTU(M122K#R|# zH)5t!^^cqyoD?SzJs5`7fgPQmjNg1(k4Ph4ep#}LXkDkJ;Ewc6uA#=YA3`~Ex@+Rl zxaDB|RegVc!dkYmPnzc8IHOv~u}0R&;rz?yRwMOo4|?JlL{!nUwvN;Z&6wKcdjUd` z`Y!|3>IXT%>Ial?`#hsZHMPtE-u9xb@8*nUKG~%7W!*I8E(}?lWaQgaBnN7TL5+-XW|iQ($M?n%FQ zRTDn4&(Yt`jVc;`NdrbrN@&GwmNg4-Ry1*+}O*&^(8gItL@V~56)!QKfYDAV;fM<+%b?6eAuv?ok_A^&i z^}fxD>EdJ!@z(0qk7%0Bv2pwB^K4`31`Sdg4(rr53yKU%_6-WClLkrk>RXG^8;Bw< zdERf$LU9@n`A~KS65s9!MwPp}FR96VHUwMFdUVBXlJ0*Ln=pQT{W?*oQgWjNA8Mb` zaQLL{ns9Ls!)!((ogEcmIdAF1~pmhYWzYifmLN6I3Xve4cRec(P*WOa7ArtgCdtUom}w(%X;`aGN@^%pmaB?wo9uc zH-%tgagX2lcGg&6lf!Nj3k><0#Lgfh9(B`A)38NLpZ`tO`sabqCX|N{Z^RZp+t1B* zjB{?>^^$b5<~6s>*N(__qUWSz->)_5No`9vU6RUs(moh*C(9w!F_GKA|8kPE#M&rc z=&5_jPLCgf?_Lb9 zmF!sZ0BWa1-{6irtUF3^;i$5RthVNhrh=XHBtKhlu1D}2R<40ebH*(fS{MRBy9lAe z@=}~6o4CmClYEy6>)CB(|{+C zbS-*xv*{zJNbcJVXLZMocDG(5b0ZhAT68{4z6d9$DvLP0Q5KB*W%U{2$wWWXWPx-P z>wV)|a`5^$B2L(TD|i?e8_-RyPX9s5&a7pMu8K_&D>joI3TB~ivi20@q%#{fIoHP_ zxyg0%P7imf-d9#?Ry%g;@tH&~MP3e13_l=d7_?(C8?K30O4b*Up{y$8D`Mtr6)?8$ zV(~YNrPg>CvACC!&27VRBl^1r5W7ZFw}5b?ied%5F5oe zGQ<~5SyfblIk5WDf_-tR+s+I>%)t`XdeaI!Qw@^A4dt0FTS4*avxh0|&eC@I>90DG z2bz06T~wG$1gj9Y4|0!OYFl+IUT09wTK6{9oo#Y8Tnl11Kx)JCMDVzbwel=ywqxSl z_7zX#OyW&R^F!7qEHa5RAZD2kf-%zfsJ{H2-XR0n4GOn!{c_r-Qv!8!sB>22_)U|_ z$I%Pp z=dEtfSE|Ow+*fWdp{!@F;!{my&sCM|Xtg<;m2U8zXYK)=PtgARAvtX2v@oe0-Gjt6 z_w62aEw@zL0cGUJa++-35ngrfj~6TV^L$z_?hTT`%Ge9*;!K_qNmj_P!)>$2d+i&k zG~Q{48}_c~ml)q~gRIS_=6$cfJ}82F9^-a340E{N-T>qTUbfZuWZTeL z19j8zHz*Lu8v5xT=SAx=Cm%8xLbm7`Uhau;*1veR1Izu$K4!)-nHv3=nMcn|C8^q| zxx1WFx}I8AXh?z$_QO=a&lx%uqRI`_&^>2e;nDTBVJ<$IAx;V-boNjf)4pwNzUSJg z%UiHMlRxss4izFWjpsjQ!9no?nyXIyK=mF}Gm*RG^|7tF`EiM$;Ok^iF=|AwB2j8+ zPPAmWFIe|F*NB!nv4<+$l(s+9XBpSTavW|JP}%c<_~zvo<2{Ewx=yod##_3&S;IZ* zaQVCfhs71@qHfFR$0$X6%ZlpEa&3(okD+I+h`tiXgrR1P07e=rXQd|1Y1r7_4cOsg z{IsRig+_23QJ%ZFIQE{j=Qf8D+&O{PA(mG5MpWFK)k%cSJMGH3Da|A$^@4Acp2J72 zB`o8NZc|ptIi7dd11otLCS!hhoxJxhjh;x$crFZ{OGLz@o6*InxGcTfK*^nwZ+w-u zBXgKpJt5w*e*a@ahAEuV95s(Wjfiob)%6?7Xs55Sq!WNCiVC;N8tT6;X2@6pZY^vWZMY*-{!zi?(5#3? zQeZ1quFHJL?;>w&d^f6zc7@vS$&bX9v_?F(>OhdID{PTi;arj}#Y>Y~7OmpN5T%(FIH9}*lW z@O_@00+@Kh3ljms@_Cuq{InhfGOB)iLBNaxP@o^dw=2$PO8b^6d_a zzMHFQR48@q`}~&3Y>7C*jP39$?Gw)Uhy3atn$6V(?D4O2wnM+xrPl@DXW^)W`HQs~ zlaADF3GIr#VOgG1ErZtGDRM8rE)N;#TbS(70K+_Ox=r@Eo>a_#n4+vI=#!zaInF95 zSD4?U1x(K*vrEgc1zg2N4TYeLK-eO0&v6K8ta{wH)E%FUaA#z+sI~DTA%*orF5A$! zsrp_`^NC7emRSyk{s>xpO#z%8muHn7&AgGcU@1LU%a3*2P~4rpOGTY>MOB`d$p`|w zvo5FbEo1Z^~isuT(DAS%j?q{$~rG5fh0Y_i5s?u&o9NVIiqb$VLqs#MuE#Ho9)^y$|; zYn^gvyeznmL;qO!dME#Zk$q8V2fu}$Rfb#qQ*XzLoQh;t&e|6D$LTejGXvHKm2 zR!3T*JGqDhJ@>{2jwD*&o4IK``@9_2YO&ee_2R0b?mSpdzmy}#b-ppsVePrM1oXR^ zveyL5X!n<36Hmh-{^dxj{5(p2_Lx^H7Ts&!ZF(#j(n*HyH$qKtPJty(RZ8EpDzN$+ zO*;kGmzvD(Sfip!;7B@0BMB>?o71G2gJ(~V(sz|3ip8;;16rv`gkol=g{?(i&9@@V zlK9@7n8C=9!wF7fMNB{Z{Gl$usrzf)J?CP4i!p5mULhx#on&;84pUawd;Mm%!V9=R zw@_fkW5Ns?R|n2CC2?QOd~;o+dg=vp*u!)aj1H+v{8ktsYsONBLuSB{cT(r}%L#rO zexD(48w=Cm!aTgM=o3K0nh~*u<{iQW^;oTH(m94#SRaN0=T4Fzw7I|6rW!i{HGkbG z=&#Ef(|Z)s?>6NkDVv#WwfC{#eQS1^bCSdv4EF|?qPCyS?Wi^m+1)nNiVV|04aa&n zNbnt>?AjWw;gT+a4`-eys0vfkezKmbk~{F&O0T}|8!sU874JhH>}&m`Dj1iKz6 z-_oUFehwT~Sip0TNMY_r?zh({37@;jJ0%A58SSyRMfIsr>YE%RE~)-lyBB};s{XBKYD$o^tWwY9|UBBCe!7Ft%_xmNI*TaFcSNxZ9N z-Ko6&@n@gk>bqRq zpItgS>-_44rP`wrlcfur(@(Vf4cm4-xiDwd)Q8@8dTTNTN&?3!%FmP6xaA6ZZo(>t zJjR}Ex_?u=W|_}FkTIYrFPI!@Yjaajo4;mJ3kZn8h#qd-hwu1yvt}&56UxZo@Yo5X z#I30N3YepT=K8={zhulv-OdI^LVBSHv7{KpJdaD8^m@zN-;5D;vX6Ta%G?mFN?pOK zS2uci4|c8K1{w)ptFoSU zkbgnec1C}{E2MPet*vMb;(g80FgMRTGBY&|`$|#ac=1r2cRK;;2J<|oK{rFC42R2z$QY;6Y-ZUgoIVqGt%Z2HRcHH6FK8&- zr!5@W+QyX;GeGW}!Tcv~rQON0NH3@4j!LL35=!?&z~I9x23ASiq2h*G1oZxs<=_II z&2@KqtBOdO*PwStDUHJj;TlSfwIRxZBYGlkD3X|!5iK99>96|a1OEkI8F(dsaE{oU)lC*rE? z-hGqoX8G+mVI?`WE!1iX*i*Fx4RD-1Vje-n(=;YS<%jE%+*}2#lV!`cy5KBiQhC|H zhX+565$x1|4@?N#J6-3m7r@T=ru|7tdcV4SW%pQN_;| zh4#^numi?c*^xwwkz$a*277DGL{Nf8I=H~b^KQQ!&{2~B;AMw!la>F1%1BAT?0f99 z_6(uSFQ?MQifLAF(>lqTCL@ZrD(6C;gMJ2betn`F2bwHnhoa8;iqE>#VgNrnd=+`Fztk zj7Cs?X6I5*xcsxcmu*np`>Cbks!j2PXW9Jo`(p;65B<6I*r{NiH~p(EKNRkNDLc7t zphfH%EL49MWN@}cget(8Z9omQ?`GfjfG-&sszO zasvIHClF{jSo$5^mEL7<-nwB#ZjMNa3e2*G;gHifV$R5 zb>T`JpHb@k!s3BZ#HU~GqyJYGUupr=MSre_e7zVVN?%d2&)72NNYzcZ58GW7KWF;> zR11-70Ly3zD@kf;Kgj!{{Jo&yIExU{E*{_%yEAV4NKPjmhk zAoq_}rPu?bgdlDHRCxqMcM;G@ZZFxWpF;cP2?9ikHzxebe);pypAObX;Pke~r+|AVt?;l+vlqKwh7EW^>&Q?HtneVGT- zgXBS|z7~*z81$y3md1i;#E(l~cvoLvpS zV2$}aHCu;y1;#m6T2MHpJ{H3V!tgVXypLbN)VF0Qgpew@G3&2R;rK(72g&$)YY)-4 z!io~SMU9#wCaN$^dJYA3 zQMmP+WK`_mhn4Q}np$RacRnaS;sL5qxzeRHOiM@^xPI@dzAtz^+<@y<-3waT6|eHC z!xZfgXw3=+Cd>NwTRX-Vhc27_69W2Mef-ILF-#$O!Q=WYnnT8kAB68(e(6$_<)P&D z8DR0Zyo0A|{@?)b6R7Dj-*`itA;wC|+pd{%#1!#Z!>QI-Gq!{*$yHDaIiO)~-mMHj zH3oPBF=BV641K1`E+^1#;Ui59rYs7jC|5pW0Tu9(rttX;E?zyQ^YR+N-aD*5p&4=G zHPi-M!woB{8WX2D$Ix;0J#+~<#qzu7XXr~U5O&5O*(KE+tpS#&q`V<&T-w+r4o|f= zyDxnQV2U@{4Nj+qKQE0c)3ke=N;|)8MJtmZx^C5#txwm_E+SVRS9uXA=g^fA>8v2; ze0qVQ87s9J%fVC1Z7HY#U67oaSyEU$bX`N%gMG`B1PXkHU5jd>zn6Vxn9PVn6DbSm zIl9XZKb&JlTIJ5| z5McrR_}lWv0sNg#rWXH)y|<2vD*EC_1xZCp5or{W?(RXPVUU&v>F#b(K}qQbrMp8K zrIGGN8io=WI^G>H(C_#AdvC4x{(NiAV%=fgx%ZsiXYbG1=Y887!-Tm|;@<1M0E!us zU&*^TuzF{&pBxMk&3IV8tNA>8b9dkQGnY;GYEn28neTz3ZKWj=BKL9KCZ&Ln^ha3S zNSXtSy*j$OvK`lp;RjT8fy0fs+lj9;of|MjS$4^)IAzO@R#ap3_nxz)+iR<`)l>BY z9U^w?0*KhYys7=z&WAPYT1BB64w#k-z_d7=p!9oOH}u;HHyUZSFg~kxkXcWBHf10Y zdHl)h5)3qJ;+>qMCNuv(eUmx>FBy;cDw6WQ?r?;?@ZhlT?}E{vIH4f|n5G7o8SDRw zGps6r5YI7~B=3LtVTAvG2(W1K|1&CVn%fy$%gW6oW8jB`iy~e36n|9H3222{TG2XU zT}wkp6**RdUNIgK6-P$V!!^wPFkUj0I9+-xc`Mvc(~e2b}jEddut>E1Z_=pYe$pHIqgy_ z?cuo6bks|2D<{XG8EVBvTVk`N>q6eOVFmE-x?V zui>eH(csx9qEo`T<-1x$D5N3ga22PMs0i?5>EAt!VG$wHv+O@|VO8&?=JCU(o|W(S z|N0q{XF9P`!S&`(OdoS5h-<9o~c2C0$Jkgok zDrJ2^88=YQ-FL97E12jyn+NFG>T31J8_lx7o!t&t+dl_Rw$$-VP(UN1c6N5|AHENb zL7D=rb_UA5h4e%FsTbCnnWQ6B(y72CW|_Pvt#*16o-@uKCh<_CXjsnXfSQ2AjnL7z>A=mJf@=j9^tAN(VRy~yxupC6hGZ2iC!AdFzgeX_4Gz$+meZb`zf&%984B#F5 z^3bOv^q9qCGBcHz`5H@p%NgcM)(yDT#P?8hXMie@t?KIK#ifpzU2sTf=%bRYuQa|L zsI7#XJjj>3CSdRA#+t=_upEF$_j^jrxK>@*H z>*^bGtiOok<#m7x%D(oN9TC0@*{l=!-ujetio|5ju`$y77MQN%TO;a*($k1~x>*1-Wd^jSo zMgAp_e?${@1w=+H8AL4i&W*%2>bL;Efb=|uXeqV@U{_Pjx*dD4-zYE%#oi%7sdNC*nnp%F2^K#${< zZ3)C1LZ*{&@6@P1XnT(_@`A#U2#VU?*;y7OPkx`^Y}}An^qKjYq@-R;DV2CLyV>|7 zpmFv_sZ_u4HJ5P+2GnxvZ9Mv)O+0#X+DE=Qiy8HYd719n=9@oC7Hp$5Xj=)n+w8u?Ofb3wfweHn@RZFY>~qHsRPx4sXuzgOKUZ;b^iDSgS822 zHFwCw?6R<3Swj`}q)ps5$iK6MN&{EVA2u-;<7#-OmT_^6%;})!Uozyyf%szh zYuvm5N$*733wAx!0T7fxYdD;x zPK({~xZ4Ys7`$dZp(HcMrg)r%^^-e3ThT{(d3ihiIhGx^47Jp86-sy*1e1@1h2Jon ztzdGwwdmL!k>j@YHZCd=t$lps={k!AIb5URr^DbsW&l8%%*Koc4oNOMgg|o%)7;&6 zsP^?*7w7b22DI{@%AZpjAq>_J=xjUt_oe$1dp^x)9PdjoKk69TIq)Tk(x*|vGd14| z6>Q<|Urw^Einndy#beH_C2^cNNUr(e;M!1MWsu=EzeLhmnicj8`tDCEwP6b2(G;IY z>7R8}!$WxCH)nII#il))pBI(u!(_Cq^088h$G%IgmO(h$V#^@&`R=xju1iJe;F;5u zq)z#so?x1kNDSG=ag50Pkow7k5Z<%xS|D%xg|@`Glik_l+*HZgRaKvVyY24I5eA3mx_*RScU4qWWUm;$nqo*nfCm+ zyZYP6mSwdtm~+!;ckj!=eSe!$%WQ_gKxu@G4a(Ht4l3$a;Zmt2a*)9vwd0f|#YAaa z&2VGRm&M@QPgOtt3|YKu+a12kP!IMv?wo-sc~b;XjInObLht6@SWpQ6{Ka7otvke-#&mOCWoJy1fi>#L2^!1rCoto|&+4;rv7cs|JKxk)*+;e* zOEY1pJ>z;oR@@$4Hr2P^Kz8w-$NplfKFm?`IBN2wRZH#2Bz=$1^TOBJt+l}8B`wtY zy*-#N;*+{X^&+woG3sw!f;)iCZELje+9?XYsG0g~#5K#{&&MSR1-_@jtw}*@ce$*xt zeupsRMHBD&ce?uG9noMyi(Hm7bJQoLU#YDatrM6^#`#Z<*mcE2g35(kVnZ1~1s7u)u-3tBVysZ*$n1ZV<+Kd=~yGXAv80LHt zqILAj?R$1-AUUs6C$+9fN$k)mVDOsx7=I*QocI=P+Aa&4P4yg~Aur^+ZsC?`mZJ*J&|Q$tyc!P)sHPi=W+rdXZz0JOzydvx6pIxB)R3NAA*$S*1$@NI_(^QLfmo2!CCilr12X}C& z4|85sCz$scDb(%ys4bLL+_zK89k6X~`L-}^R)03HwNPJo5J=BZyFJOWFnvP8eses# z@Rk`#$8fLzjnj{l!KPR%rrx4Si40o|8bkUlgFQYMhhquii(vlmlw3!zbwhXBuSnLg z3K)+B{->oFzioa48$9(5cSyk&>&S;hkI{un2aFZ1MzS zKy$N#`a9ol?+Vjlh2~4s^)ML>im6z9J5-uTk>RC@(sW9cO5puCpq8mGR(Ddy&>2;? zUkmQM!+2a^=phrwEDoGqiYph%Kus$ZBl84a^WLb%X&MMPl{^9JeonB36~Bq*XM5>3 zf^dwq8oG+4Q+0lM5g-WR)S3ke`M52{T|Dfm-OE<@n3CS{NjjI)bX&YLR#PT%pFxdE zp!%#E7_ODBy9u8uHwB@9p&rmKRmpegxPN~m9U{PBnB-CXS;W>}+9j&~aLn^u;Aj=2 z&b&UMZ<8lAFOQC%VW@FkH#kV`CXZsw*C#Ti#fmr7yWkZ~rE`>EPs>@N&n^U|yZ! zgT{UwgNCyJX9@?E3yzBo7w6sg2i&v=N1Y5zkbcDc>eUHmJ*&^*k@q?QAJJuoGkLMm z(i=JZsQ!(SDbdng^gYweV%{`4J!&xU35?OQvG zBNgXSnY-`QNHIfB&i4pnn9L<6sn}8uCs~$NoR6HHmAK;zrNlT1i@V3}5=GE35Kzuk zuKFv<;!t|djp269tIrqA?nOpLo$_x=j;K?aY?#z8E;L;fEkTvFbm)mfM@j6vvM9Pf z7!n`F#XIb%yMO*X4Gp$DH&9P#)NbIGfrl$V`4-PD$nUJ)6S>UU8oe?wbJ%(FXRTq9 z8Z$G`a>WIXt71RM;g8ED4I$Om5>QEl=A<%eVf&P!M(wW@QeiWVh)%1indZ}JFxeF@ zj1S9fW-_x0IUh{d8mJ*fwK5zOxmp69@J7l7PNg}AwS0vfYHAUfW? zdN zGK&WX9ntyfizgX_SCD9SbmYwZ&52Vx+g$rXPL`p-jEvg1-LGTwKm;)rRRU-L6uNn@ za%Zk&F{-{^d4JfU#;uDjWB)@$@m@N+A8m-X$o=o?$L75^yMI8 z`}DM%ugrZl4*j;x&*PVHffSWPBWd5WKfdH;MkW1S%?-qA$P7Z8{QdBgYz2NY}K zZ`yvEX<@)jYp}jxy>`49%wRW=z^}o*YbC;|Pv1K-jDPIYiFA0=OY<^`a0p8&FuaWc z|4AuaE*dJOXV;x=7yR(Tx(t%szR22)rWRR1;5V*1BP7ei5&Ml&VNkG;KQFP30?blc zlT*KovAA`*g;4D^^9$tAauDfxA$qb5Kjo-~5^!<;DQnyOd}sZTVz)(6B^n0K<$E!V z2I2Nn|Kk9v8U_FkGfko^3Vq%cU5=ctIKNb1*C1=2%JkQ}elI!!P~EG67>*@$cJG#S zzYWUB+`K%Q{{wmf_H<$`mwz^b&RW6pXaS{+m?(Own$%ZQC)EImJU}ka_wSqS9`=TT z>>N8C?!5-vyNl{q8?k3x#j0(7K$SY6P>$+%u<>)CkFwyK#?wk{v!#@m?fEn|HsDs9 zxHp!ovVC{2o}LOjc&kb{>yO{PT#+}7z`ujj4*U?ERSX!Yqkf2>sDN*jXSerG+b z=6T8j0zUaYv&iQSPU4dBrV3yB$I~@GW4~LHkT>;al`JYn>U>;b6^=&a9KJ_`udSH^ z7)4F)Su>edMH9l&&P>~5&LYB}0J2mefEL{Mvi^afG$_M!7v}Pq3kAUdM4eUavCmg3CWuWx6^V4o$^)IHU??1W{ZJ*BOB&Exiybm8 zL^zg?v>xb*07|b&@ro1Nw|OD9RT$Z-2^sxBaUABQQiU4MXEeFjQqcdUCoh#Y#^4(I zT8)Bhf^wO0%=!eomc-Y%)W#g&+!tM5E7 z|5%*i{CXjZh=GiP&~jQ7F@fju#RA8ibb+bZmoL(S6~&?31I~ZH)_W6Wr6HF(E_%3i z|EwI?>SzHOVCM8p2`{(cfFD5K3T@Q3i#qcw7yD@T;mh{@591a3TgaXf3DRWb73-;~ zpt3c8bXADQYH}(6$l@90Pd|(ce_Y>6|K9pPic%M-z}wcGU#gPi)OzH(99U4@ri(f^ zk4yCovX({ewBZzFuCUKQyS>EQb+cq9ZTu87FX9Pw8C|Z}v+D{`tcx z0zy_-^s!UjxI4h6XsUOSexfhdEs^z&X&7SUAcgBP6B3DphpkF2SF6CTERBullppZG zGae^Z327fx3Z_^(sDo3#M5WA908{Y5H~+WELhnZ}bp9N8Zu6O(QkS8v2`V<4t&oqO zX;LZmawo7h3MG`2C~xQAAFEbnr;mPo6pb$)5qkN>~AD5Dc z2bBI3tY2DOvFNvvo3(=@dZD;6Xj~@amZxGB7tnSAdi$1ummnNWm?QWQfJ~nWsZ{Hy z2gKQz;Q4`Zyk@$aZng&_AWPR-T<)5 z;8#8MLkm4(exy$KGI#cSbsn7wFYk|=Sz0y;X6A`>VL?^nXdq;t#>ck+2vIshR+!V3 zUn&IZP~|!y>jd64>QEHZzpx7+Aa}&=mA#ogz|ELcG-Hw z2k#8MiRzrkp5K&H&3ZE{Rr-M&efm3OGl<5?V=wdFy}t16B-Z;nx|L-Ih$2c#V&dYm z>Y}Z|1UUcTJxD{0;fMm14*I-}PBanIM%=aw2N`NLk?ux=@q^$R?L+IKC&g=1)z4J2 zqIL#Op3S7*`sG5aQljj9T#)zZ?L z){~{d!4L4Ab+iR5iMMZRwZ|TiyjL41i*S~Kr1Qcw)yolTF61Mw z{AbO3c@>I??el3rxfCy2^UxKKD)?QgNGQXTj8=FuA%;%Tt;yIOxOeY#`{p}7U-?9N zz(?`1#sA%W1_*xWLmr@&0U?7+*Q*JAy%q8k^3(xRM&4zOBd120T)aV-`(@eO)>8de zJXe)4t1LhlqRl2UsFO0G#6E~VH)<@P4nHX0FnBOzy8-RBr2xQ?kS5P9p65p|Ou?y4R(`%gYn7>XuXv-oV$dmM6HBl6)linol6OEe6kXm>z->$ek=; z@VrWx3`in%n08Ipm{-%P7OR^$Z0@Lzto+rNX0Hg41Bk)n?r2T(T&Au71fbz|M+{|s2*kYN%-@LRLvyZ(C!|;XFP9Iub=*o01(M{xacPH9ce&b(4fkY$x z#l>DVIM)z)WWgcLo>7h3m5Ud;RTY)KRvP+;d@3c|70f@P!&0!(*cjtf=q=soeOVxX!?75sP8o#YI7 z>fS7NqU}Lf92E1>deM&9O^y&9M%Qgitm(0V8VLQWad?CMY~D3c_P=-7Uw#Z~#S#OGj}9$%(h za00ViIf@&A)^#3MqPk&>4aQip*X$Zra>Tt(2olO5xTb~ogaQ|})5=y|y6$OYYh z@Sy?}ix0`YQRYso_!atsr|K^2<#dvjf$6w5xBOd90|PNDtAMIg^+K5vPnL6O+Ffsu zWUT^SEuDpPF!;UgWv`b8A($~?jkf#yh{SCluS9WE46&S2)$V!FnFZd5`cVwD#I^a} zZJV*;O(FvsR}+O*STxgH288_ift3FsLT0rA<*G7RB*Hc_x3V%dRuzTkDhsAS%;2Gx zlu^)SVoyvX)W)Y3>bWf@2u) z(n%JuUbvzW{C~q8_yM?9hGYIw4wGqBGji>|2d?d!R_Ut&mw?(CQx}-59LfVf6lhJ* zytW(%W}c7zTu`EHRa<|~<3&AN{u)N$#*1X$y$|c-MeX>eigLjfU`IDL!^;6r!u*JI z%3@#n(&Ca+siEENtI+03j+x1meIiWi4f^=7ji#fr)MPEo5yw9j8=eU%fm8#T0H7d@ z_%Od_t4=hL^C1F<*{Rp7a$h=*`{8EvwTwRSIMN6&bh+^ZY7Jt|580f~^!GCWvd;VHZ*Ibu3nn{x1a}z2*q?(V{Z&QcQ8i8bmgB(y!Y2T4u3ah0e^70ll_-u zm=*{n*UC?F5+l5G??o?SwRLao#NNmAUbW4O%d(~bnOldz z-p>0Fhzt@Rh;aWct4?a5OFi4=aH*c>-<(Q5?HbNCX4^Cwm@gPGcmlvaVcrTjLblY@ zH|Xu(Y@5dI6>M)x%s$PQ?tBdNot>i!;(LT?l*JLbe;9=mvbkc~NHfU@@)q;ck* z%8o`!Cl0L6z3qUC0yyJ|{om4qqNf1riB~*18!9l^(^Qx~fdBkKU&%_f?ClNvnP619 z?R=2=*?DUB9ZEXz|KTaA8bGKsY-}HP&J{P{!9Z;n2~zQhzzG@lHa;2g>b6zNF}?%8 zd2du%Icad)`{psl;syFSM&4*v)*E!Uu}w9h3^n z3}hVl*uM8J4bUQ}lRsB({bsCuCt4I=(rTRSrZ~snPbs*)l3cpBe2k%mX>7db61AH2 zu+R`f0GL7$AY&}>rW|IGXUL(R>BUQS1~pk_8l;nnkKceC5Mm!;shoeuH-6753G4R~ z$NP|nV~PG!;(q>_RfXfzRYJ~8IZ=MUP+88yT7wLaSlmvV*Q&X3)7uNLP{|bt!#VA| z$!UfkE6T~KQ#K2q!P5P|SNc=fmCN3(Y31eaL@8@T)eGTVtqu^?Th}?`RgYi?l7p(I zLF+gb%+rrrPvFzIs`K>u>@4lQREZ`Aj(LH;J}Y&gu6({?CubY0U7;|ZNQLBbN4-?+_N^bXnfDI)mrBUV9S56skbNp!TVB?6!8(6 z7{({C(1jV+DfDjk;6Ga$fc;iPeuF3JRdFL51X4tetDJr?Lk;nS%->9J@ z-uYTY$nbFPql+Hx9l;A@N0t&AXK++h^x>ACi`n!AA8!B!8CcGBtcDHhqc0=y!-;A= zYOC2|fC3p-9h^<>ef%qqxC*ko_27u2zujqqk7y^4kJ}XpX6rER94eSK-xW?XU))3m47EJoUKZPKs`RIrKPI_C+pcthU!TI$iXhMsQyj2VhJt zbjd!wS=7&$cb*1jfw|Z%XS|1fyjNe`)zXNa_WdGImMlnrX6!$CitG4!Pp`q|)rPyg z*3AU>z{kTm9n&Y<^4389nwgMn7TKFlkmA3^`Qan5??o%ZZ5ow1q{VUh4%8fV8oA8aN=$%Dt37u_eF z3+>BVTbp#0zFx}+!xp2ol1jNBnmb4Ajz^GuI*{AywH#xXk7ax(A2wXP-h4oz`nO~s zYJz%_(UAgxMNN4&A6>DX`?~Vhmiv>(0>|~4>sc5brx>vd+45nY3aLg!J|IrYP~AF8CXO@^kzLg}#qsZol$! zVO*JZhsvobTk>z0(Co#@fEFfJsurTMh zr%C!a>w>oSfX!gDBMLVMnkLlZb1P-%-H)?{(v#FI|;rdOSJqy^{Q%#K1#!NK)PUBl;-41;#N z`-~06cOLaHn1lcD5a{NGZwMPT^^b5@>RC z&Oc96!=Yuq^SW=RSrE5fAjuuD`J?^hv(d6&t7wJb5GEh>)~AXcN8OXW=*OlSGS($Q z=Q*QDS9@)2_ypl_?b~Z=`+t_TdQzn0OQ%};ioMPk#oBxr9^-Llg?jJ zHv;!vl+od4zh|~-N#-#D-T4rI+dz@RqpUYYS``d@MT+3)*wY+G4IzcPgD4=N^g{c#|YJRLKV>Uy|+qHQ~6j)l?-YKcO+c_SpJ7&N^z;{a95LwRK&QyoAH{w0* z$W|xX6;G{y^SJXaL(LPQ$AhC{{8foZ<-Yb3uwV1cqq=cXAEj#UL>E9jiJr>tzi}34#>?7LDdz(iY`z2YZHJs7*XN5 zT&*hnO&+?DD2kyS0?S-K#L%9^A!h{l&At5wXlO8*LCFv^aeXxtfa@*qNmrr(bLI-u zbMlu5*=v3YozSJRS!mfE@60L7gWgAPjznyi#+vBn8m+O)^s#?xM~*(qQGTDI>=TFJ zn*7qYP|0o{#V0Zk%)h0dE662WAx8C-NuR6D%(h*;8Lv5X6dNN_+k6X3y1lp5^)iVg z7U^I4bgy{Wu*KWm5C$`sg|>P>rVMeE7>%nUb!f7h(i zACEtAx`=r^!t2}f6h}+zNVi&IA^)N z`EP?KW{m8@m16g8^9RxzQ4ST7OE}&i#~)7*8z(XMng8}c-o&>?X9R{h4mgNIM6IfP zU+2?K>*X?OYP(T>Y}MM@NDz-O6p*>Bi8aK)yJN?fBgZSMl2B~2#dMFfu4923KEtm` ze>`(lBAJ+>T`Q%|80g->qWfcOR%qbPH2coa<;sK?xBSsU`zP346O^k#V|j zdmNiS@~>FFnlawJHWw?^`mDk&MeZLjpeoC0Yo3P7auF0j8MvRJcZ@*D9lS9l>E5%( zI~5wV19jg2Lnss@xU)LB`iy`jX+{rYH{~RQEgkQ(K8amNRK9%xSmj!IVh2NoZkK|T zd>n&6?1l`(SAKq4+q~p=oLVF%pgvDrg&i#Wek%HHf<+> zhF=Xhs1Sw7x#FbCNjeukghBl!2y${U()N1bwhm&6|2S2`_n>U;)b7qz0m$?0B~@G$ zLKLZD)vOl2p2}X0ws?%mfCk+_+W6R&-+JpKeLv1`UI1HvMt#D#`Cc9m zJ^KC%Z8{>mgbtIQXX+L>#}!i4?Z8t>0;31W0I`@jzT3<(6WBivoN_t#+L)-+K}g`* zo?_4v%z>Hj&!&PQ?wo{?8-epIGY>XHaJ*~Hb@kh}_o3;~5zt&0PlpU`E7PUW+9Dpa za^}G+Abg5HX%_6n1XjT_yD`txexE|qAOOGbm5L6|anC$ezaVw0$#A_{l8ZsMu4^Xa z8t=6U6T&*Im4Vq(%kY0Ulz_$o?sdQb6U@kW;vVs+skm~Rx4A3yoi|wF@j+?(=1oW- z{3h5Hm&lo44aV4hbN^BV8b036ypcA(?%koVx-`dver7P(n*q<0(wa_aI7G>}#66X9 zXL0FLV2rVVHSK*7>falFt|E}ObT4#;wc1!?H9*?4jCJsyy7fG}i#T&|wUV5)gMsPRj~ok%@F2c23cHt+ zHpDLKcL{Rq?_=*?L1L_uZd~YATYfXTB=hA&V1Iz7Dn!xcTZ)Xfy@lHwx?nLqvtTJ$^Qv-0yoSIS;mDMeQwzZr`& zQ2!+F`#HKXTi1#l>4V6I5Sni)1N+v4x)Y1gdzZ_4t2`j*KY~tl=TZfK<&+UlsX`t^ z4+~0_DK|<($441ElQ`+up)DMulT9cRlxd17!#Oo6f^#j%;tO=M4!V z)`}6?tXDbt3RpqJly~*cUt%-s3`dkIg{Hoyi!-ZG&<__;T&GjM%r`mS82CX&j?1AO zCjmED!1)NQlVSa3dEIjaCfM8 z3n8aMr}^JXh#+S|r;}7KJHl+|1Ek&xqT~DH++kDWr2*;-``YOeK;HpAKBsZVG^Q8d zRc=?<=dw*|eIdJ;!p~9gHs;IEw*2W;W~E_eKSE`fKYR9IHt`S)LS_Y;j1uMM)1Bs) zzBxYXZhA*Fjn5}~%fE9za<_N>8R_^tGLbl#Tl)qeE4t(9*#6GGqv$;cAv13Xt~Qk> zM({Wt+Kr9686c?%4NYOam~s0Q5N(HFl3wj2jCW;V5i;Bv+wA`CGqjxz5`{D2yE{@x z!Ug43A&G$~-fBHCwOzQ&Y;ruLq^%m5KumJtdn;%Q<<4b6RSb5<6wtZ-pK~xkTDM1i z;(@Y8vWWoDpt_jLMnQ{X!117fomfJJYd%MbQ8oA-F6V7z zJy}7)LY*y*kA8s^z!)uy5Btr-@$l4r_B6im6~iha_%6zR4};(qV+7COhB8;6bc(eWE@4{#KL^ zsu|vlC|);E4msfb2F`2iqKRPNu742F;Bqpv{F5H}y(huOe(9I~PH0PsJu?{nfyi{M zk;o#*_wK+KwZqQwHYdG}rYO5Z(i`x==Un>6T&ZUPg8?$^+w~8eFsMoThw~2MlH_aI zAHs~%`1^+ADjseiYm@f&&AbP~8gKcZ`*PSul@%TrgXy^FOYdC%e%2L%6nrurtNrZy z)2^<&NE^OT@Z{X+u*OPn#`Wg5KfDvJ>3o0a^)vPqLxm|7F7ME{Q>zUzc%7=8cQf_# zKp2VJFuW{v!)u6#=6D-?_&Mlh*r1Q#bzS})H0BDz3$!7k z+iA4wJhtz$L}l%vVjbgq3~Si2OSvfhvJzIPAt)~qOvm2 zYk6M{=@`6LIlb>0_e84$cu$M&Qr-c7S`T5#Jn@=`#77!LK034=bwL#Z`(6n?iWxj7 z7ttsrc+BT-5%cnzx!WuJJm)#UJ~{g&8QI;45Y~{F#{$`4S()V6-WTHrYiZpT_rbUvGNu!Pl@0gyFd+-l-)eQk+l#E>WoF6U!O-rE zbQJ~tR^wwTlb{Ur>bLJDyVK?pEafT+1L0bODcstIqq67dKZSdo-4S{8)W0X5^IKhs zWU@6e;ZL1l1k_{{`Cne%fQJ+G5|%ZDXOl@3R&2kU)CqZHFJ*@O9^ZyxW2!9lWv55# z;cNn2W1gQJr7t)+Trf=fhYEr*R!Ux--vF8zZVJ>2)bRDO;H46)V|#IKU}G>}eY?)v z(|2BeDYPKl7j7{reuMF?Usz9ut!%c6s4dYp#`%-DM?KQe1<$GEq7dvezI8B#b35Uu zQKMJg$n%W}ZhC`zvYuOK_4bNdH{hji%(3pn{iW+Ly$3a5Y4;6MOWj83zRN-~EI%09 z>LF1drbuwt_#kM8vdZlt`D+V`>>>dL*>Mwp4-aX}jy%~D zdAL1s19mfhvlu^LU@c+3R8-f8i%p;x^B1GzUv72;f2<6uz+ZGQ zOOP%af>1rQVL(*GA%MDX$ViJlUQ}|(aGTJU*lo&O-LR}`vWGWA@EUC-(xsS?IcozIVD+`uDm)`)$;^7c zi=yxIr==1eVaQd|iN;#u)Kjx2qDR=L&Bc1WB_+yO8f|>UswQk?8ox}7EAtdXvPSWV zFZfDM#tDHpn_ILqYX65Z^Nu7Xeaccnr?U^O^c$FyR15P-=ptb7u&0A`1f9ZIkdErqqn>Ugq`lssKhR;dMr29 zHAST=X1A~$H{ z2Oa-f9>DYQ!QEF=0U2c6E*Q4Mim^|EtXLcBP<{2NAQsK37mYi!c6KNy!}aCrN(aB7 zagKQ<^o6jc3EnQX>Qj(kuXu#_=tOLO(MMxpVpUk|9Km$p9Z4$9^mTZp5C$l zPig=T+AsgneaU!=ZXGbLR!3ohmby}~TBmp&OVU7-b!|up<-6D~B{9kH!#~91-AzYT zCSzO7)gZ$oNr^$1E*lWIN=d-UR;NBk{|^x-B}Mf!qWMzXWd9((w0P(-`o0Mq;P|gq6d@i zdTeoZjerSi8#e-T~nW{pEwZXNqPuAG#{^N-YA!om(O&S=MX7uolBG$ux>klwLL%dX zv}dbQUKGP(*z*zCy+81I0DKU0@>F-(Yv+nWn^?WV>R8cv#@M(sszLLi6txm~??#r@ zAmUu6E<)D%hIC}+jmTH#6Hw?I)>Y)0+3XW{;>2X9eC3@oHuY%eQg?ER?3`M+6v{nK zZ$n3`x{!QD(@=8fu8md^cAr!YtaP3M%f~T#H>S0Efqs4LBYmBk3H5~ z=)uW50jy;rrfcEW5ttlHgeey7OIlfv4nVcS^CAf%jeQ%C1?4D`^nN}_)+1BL1YU56 zi?3s@-2B95DH`?$0()B8z^i7O%*xd8m%1YZc_W&0SgbiCc^RU_t{ofY`PDnvRp-EA z*7P%>h%+ZEwz2g_s2cWTZ|nx_mCN*$>4qJ=k8NhBkuP*gFPeQVWo;_*i8pdGD__5V z?>`iUw?XxUyCcOsrKns`yZcml?^tcCFFHlE-(QArvq&&1Dr!I=$+_KVtJuGL_eJ#` zw(yj?)SS%RRQd!SStH8nCAOy9M=)ylVk6jDD>v!$<<;?j4hWB8cBvI|MpSsA@M#)@ zob~WcEpTG`%le{K7me3Hop3Ta%B;Me;W66_ zA@T_&r^@AFbNcLM#x>q)dJmlZlNdAK+p2n?@9+4iI9Z>*`&^w_Rb11^&rR%z`liJ} zVbR3sV4~u=aJQx}cLK$X7?B8-tj6b4HWqwxa4R~Ys0O&MF>}JA0kw2FVIr`wL_p)o zOv@HRg8tY*ws|wh6I5FDs?f-bx<)BVdVaIFaRh$v z15yvstJPS@Fx z$LJI0NAdKr>@mmt5?OTGsH2l_|*UT}4 z~1FhXP!$<%zgmoDj$o0^-XnV$Vg zJ;fJOU-i>&YFw7a#r*0lMvqgWGV9`d&}yPUrrj3OdkH)dogY(~XKhppl@8^yX%k1m z)H5EjT)VBy1p4nEzi|JKIb`lNY>(L-$nU=s>5-N;bmx8sodYM3_IS4H@D-f?j9-Na zTZE`J9@)Bzo;`yK8Qq}Iv1D0ZR_EP-o8@Dq9O%_rmBzcHgIcw)jUJrDXpzfCVExnB zGNM*u2MAYoGte@30y*Z1b1wP0^=cDI2H#(v=@1);Mu^n|+fp0%hs`4FW;^S7O3i5K z(!b&L$UWhMganCo-fcVF7hiKfX?-Rkwr?W3waCT@nFY4K*Y^+&I& zQ;a!wN>y2i+^|(+*8K?h%LJ{*$2|g>mt`wAakFJz(;;{VSxnS@Jo<&$gB&XUkMglz z)au;rQYn;@{839PAogRvr=FSrvAW&#*xuLR`rhm^NS4Ids|04}M+qKlRQHI9!D;$w ztdQl;rTP$u@rtb*V}s(;fXx_a!xCD_&B~B__Uu_gyZ$oar!9l?Oya@Hz+3O%8?7XJ ziyWcOw|<6x)H|p^H9m zarQYZr$joH^V4y1l;nA!piUhV&G}$~@^T#xAzw+!)oMI}{$pvi6>Wnj&8_yyntbxc z<1zACq6c~@IEe!n(`O<5{p;nEo*Gr^dBS+m)hYjUaIDe3f`*2Wq;hU5*Y5qk#53f< zN+07-bG(XqNkggr)u!EnhK9?%c4cn~I5K24HTmxlFh{3nyEEza-l!Pv9Uq~E&ejUB zTc&;Wl{8*ok!_+lKiOZ^@AkQQTs4}VZS*}po)#hhg_-fDezc z6p4D`i0Sl~=Dmr2oEGk9uYF|?79Pib8eUuZ@b$Bw&qOJC;1c~|#C|qgXLmc(KByx9 z9qUE_6>DGlBff!}i%}A8eZ6(|o^q{IZ={jIBc0H!=plQpX z*T6PfX@Gmbs1VHOq}1{=s%ZG&<<~XGv-C8edq-6;xSN?$EKSrWe)dcfHBlc=jnZ_VMj<9jB||(PSKydX|Nmm_ zEu-RUmNw8p1PH+iB)D79;BEney9Jrx?kpz`G96J zqn+=>br8&r-k0OLXfy4#N5Ot--A|CBZ?jm*KDtqB&+YBl5rUe7oN)drIFQBpcCGkDvrjXE^~ zV5QKM`KwpEslk2oXaZ#qdC$j#DzFBKcS+>DZ}xF7cUp+K9b4?C)ZDK|UG{IipG1+m zoZ-GBH`eSF$OTGpS=iLH($iN#W72tB#(c?CVDiCwmPB{%%ikf&`h zUVe3Vx=8%%N!KIe70Mp^&)dskoBbKim5H#F^?kwn&+`0_%n^cPZBrwwo}9569@`zp zK-9Cth=2=_3Ne$w1J{)*z*J*7yYHH5oJ#iHX>`0D^Hd{KuS=4|0I^4Sk40*Sqx<^X z7B^Zit5Ao;naAhvQ7drk^TrriSh}zatT^zOpU$vqzW^1fA|XVHvT_Gfr)}pS#U#We zajXKLazZw1`c4SF1XM>uhIZR5hW6fqpWPVa>@?lkK1E73@fzW+N+_&ffy z`fY2woaiJ0av13z@ACOE#~Z_{joY>oih}o63}}>+gV#zPvXD^8Lr+*j-F2T{9p9}+ zNNtUN1UIKYA)brk5T;c-5n|3{G|NH-d8YTthji|Xl63&YT^JLAl?z^HpBAqA>r^yd zf0knL-n{5Rt%ikemh!2@%0Tp@I%Sa`c#G)oUqTu z=~_m*;#RLjP+zP(-dIp-V{_%s;A&QTS^+f~CqYV5kaEZUrh*olsT+En{EC)4r7OcL z>spbJ-22!kW%*+WKieh8ULfL#lzneQg)} z6V#br6X@)kLd}=m4m4uv?z#tsbi?*Bv;Sn4;d=t3I(5SC)0YAr zbtHPKAzV0@RXZ${y~RX(@WmczHDRiB-k~TH^W*$^(N$umo1gB}Dl~A;^+IxUM)H?3 z?GI(@8n;JG;csR*Kd3Vt`Q8>{oqOKJLtXDz$EQqAJ0z=ECX5M@rWl4~&aaknUb>x8Up@h)L6tWL^8T7b`y% zWYcCIT0e*^pl93H%@+!9p+_jIx9*5jz)4hbrqGQ zZnn%g0rm9OsF08!R{Q%yJNIw&YXn-I)dt|t#vO3q4Z<|hjkkNK`!X1p=bmSc$?y^Z zhf%w=x3H(;nB_nn;RvtCT7J*t+>d3XiRl`07MY5M$ho7~9uaw5*2)xmZ0t-AflJ#tb&cu97CEs( z{9wram0(fq%py&;g*RoEeD2!McTOAb5t_54Spt>dkkiRJOp&{$Z{wt_R&{%&(6a2LnP&`k5fC&J#Xq*&u4kCdqp3Y%7F%QZXk`5$arZ^?J(l z?s9d!O~mscv5!gMYLSs6u!M7Oj2q0xBc1&8OV+OPHl*&515X5e(gr=W@|RBtosV)T zNS8B7^KMdfUcM8Qv2!otsT=O5Y8iOCR>x!aOu{f$Q&r`NK^T4?f^sjpX#MmOG4&^x z_d>F<8OIOX-7-!d#6gKDJmGX+7YZi@osd0RDRdPG(P-OQ@xw4D$LQHetT*efw;zuV zaGsqLAAZy2fZ}8u7qo(v>khPNziBY)AGBkHoDL9i$eLB&j0(;_+<X@{vCC#fQ>Z zBDEer(GG=UqA8(KKZPjq^l`JITi`|2y8=%z}1}?@U@mtq|1BF#3}y2+&-rnn&@0 z3kd14Y`*bxkOgz{$vL-XZm+OAo(XLLo?#~vIJ@${f0=q?GXD4`3UO)@D7`e0XZ06( z_ZMadt45|oKbqfxZ($ekO=WpN>hWTZMO4yv*WzgUyB7dm=JheNR60B#1mnN~0*doI zHyA3l)o9DIPxLn9V`c&e?b1Hnf>D$SwUgvk56da6xbp;EP>-Q!L_=EF>~C$fKXHRs zbGk>7BlIo({AG=~99~*@=K_hBCAb|{a`|mm^LxPz;w&7}7&z)sWeuFH`L{I6Zg%Nu??LH zfS9IWyW!ly3S@irNGwhvmiY>md;~2aPI)>_q1E8+c14oh+j);8qvab9*WEAGv^CTl zuVVnY^H+vEf-|6szd@+)A}GWBe3U85)-5<9*lfrQ585tF3oSS8uOc*R3`` zaf0-)K8(pUPJ?tw^3)5b`d94PhfZp!mti-zA6iAe1e6d8%kkQ^KJ*$X+Er<)e^VDI z`^gdDxC`(q#vecid>vMi#a5cA8kQ8o{#gW zVs18PMV8L{yvLST@br;9Q2p#C2WJxk*?n@&hio50huif6z_jFzrvs0t{=)o=GaJ*YoqO!~Zl%QQa4&|&`v_kwGtX@@ z;Jjwkab7_;#~u)`Sd}5T&wB(-t|_3i({!=a|1{#3dpc)ke030S{>`KqV05-prr_7w z*x#CwD+d&K%I=&Rn}XQMN1+}2{+nN%Lt5La4RR4VpUtav0BujZ4V7Up18D;2s;Xyu z#iH$$8V6)g-({E8l!N1cm9|ViPo?E?`u6amF5^e{jA|V*CS{3j4}rO0FJsCJ32`jJ z;E9PD8sA%|pxh&XZr*eWfPFICJu+A7%16L?=B-h$bL}DupJKYgqt1M|8g)l}^hjji z#+~-#=_-%mTkACG?>f-;W_sx@u~w@%GuE}-1+DP_-jO^<5Kr;Xl?)rMxb~lmiGlmy(eAlKa{N7cV_{aK@l#2!vW9b`3^5fW1bpt3UD%6^X z4)h{kyaxGqA@{_+*QWDZ2)sBOrIGSp)td-i?ES#2W3+xrxgup1OB;y|lv_(w!<{4U z+M9;Afk-hMsR>V6V4L?*bhuxzwu9V4v z&rV9o^0HtHKl!JyP4;x#?(>7KJGa1O9LYok#On9BkK4X;%+{tIQowUfPb2&-%c$Gb zQ)R?Q$k?lGn(H}TA!KCh?=fQ z@~WUg{fM9O($6WHM^h*G=sroK58Nk(tc72%WNO|Z+^m1AuUSNWa?u-)D^6m=r8E+rK2TLLl9aE8JK?T(-@LBfD0y+zeMWU#B_p|9riR|> zPDrYT1YW9AQdNIBSt{!>!uho9p$P~yo!c=r&;d|N6*!+7Hj>Zos%lczm>@eA0u zux{=V4o;W~D_<~RC5f;jpQ{HyEgL+E1(rCwt!#*} z;olj5F%8Bj<@)F>iQCc64q9}gN=P|8eG|uKeV(331b2pdr(PUrQ zMtjl_rWO6=CA@F04=;zjSF-0FaFRxA+)&$%$905=Td!b#^#Z`;vwV8}0r*1PL z-M|%j^5276-e3{SHCw1)Lb&bjS!$gY<%WuOk%?XK339!BC-`Y6HX(K{PzmmTQ)|Bc z7=;fnCL7&pmJ#7C^L=Hlv1w!R?M1ko$CG$AYHO(GEL=?X&b!|t4NOL}@Nn9Y+dZ<*L zoYfL-ZoX!ZFnJmPtco@sR41Fys0*A=;CcVqHtbnyK;unX5gP<#RBL`rmFUFxpdgx< z&d#Dtg#L48)pJ`DZ?2=lEPD+w-X?SJBf1Axb`y|J_1pXmK5-w#LRy9w~^Ht~yg7$^um0 zPL-BF(7!;O@za=J*X>%ezz8o@BU?^WYt->4QPKG2w;F*IUK5x8iD`k28H*X{_-74^`Q`aG>NSs?> zU?NT)5!{z;={!cd(CCKT_PFCA4nX#P7!^)?RGr5*;gp>Bb=kgwOQ4sl>1;8af31AO zf7^>SVlHcB#PJoW_mf02t)Le)#0<0`Q%cQz-n$vXF*X)Fcy(txT0q7fw|03dVXnp$$CBe#wD=BKX!cHPL!CVB{FGlitaDwJxMT-|{ z%Lk-^pvn4zF$GX^EhMK!hXbFUy0lJ-bi&TKw7K-!q$BNT_FcWn7>A|I>C=VYkk)yg znX=YMP*OZTMxh!SIyUY?`N{aTDA}=}ysT;fwng78ee@i*@XpH~RaRcGa z5UsM@)bW9R8eyvW*8%;inInWnHDi|9WPAZb^xvUxL~I&J2Uw)|?ImBm!(ue-wxB4* zZ?f+z%d`dh=onW+_Av%6!ZYXcY82CmXA4t_)_PSfKpgqB{=ReP+f^6O_vfy!bPn`_ zH=IqKll-IRc9_&T@||$;u?&)8)@qH03B6Ie^VJg=0Y=!n2!rhXgQ8ciD4O(j&GbfL zsj{MM{pX@+P6NjDTf)vENY3@{UcmL8vH5g6wmh`QnEJI~NqnyeibC#)cONy7#?_S* zUqGMGsz9wC;{p!uAYHc*S{a9I#A{Sp)?fAfZayL7)Zu!xorjwR%N zoT&31pD75p-R`aA$Uvu>%@EqcdDjawob^(MiPFyFdWu$mp`s*xR1lPpI^bUVk=m$O zkbE9W(1PBFbZ^_6MJ{M!fo2u~)8vBC-KjzSk3Pg)^)T{i^HW|O*v?=eiQ4Pw_DH&)R*ta-I3Q<)c8%J6%LJJs zrAC{?=hmkQ2nfI%)v=qn&Ch}yg;n7DrPLAguRQ$pzq+ZtVsui9Aq=y@KlsT4oFbTl#&IAGj#8#yFhMyaH?2q+^dR!KZ3` zZ7|%I8X9wMT}^XZFeE?qmv7I#?O5GgE}FX%T;I6}0(p_gV%%JAzikn0?V ze^2i3>WJHPJh5!kJ|4Mx)9ak`8W}B~HWe+$hF@AQ_zNVKX&dF9XUb6Cb%1~56rl}< zhgUxd>IrAci-&Dqk8?fQyKkKrgfrQ@rq3PoM*p}Teoa22U)E@~&l_=mhRY3fzlt*~ z5C}W!7Ji*pE~l)O9%nW}gx%!@qpeWur&>x7q$A%MH*h}QbO4xj0hUTZ0OF3Ksm0xr zHWx4$@bDPLJ&9 z))h%VU|a+TVeBY((=gYVV>6eg{*n?6nplC(74Ex#G6dN1Hs{=z|^PA8Y>aqpljT>E=~r*)=| z*ogq0HsFK8Z+hpzZ5T>N9gJD<7$8-DFP_hhkrTL?nM6b$@y(ucP3t%yl~Ry`7HCqshEjHAh3b;kH}GL9Hu6`vA# zPb-u+@(;^Z>Rno9BwgbFlK#ssvdd7_>nZT5=S?zZk|3)bZq2CStw<1LD=B9tv16!e zpZGEFS?1mYsD^3E`w1e@*WZt4p|RTPk)MyJxkS{F54!|FqE2M z-|0{B+^yiAC*f;&_T~=6DO0^WX20B>R;I!;mTV+w;CGf;W@5+hk-Ed@agAotT>*J6 zd+ajwo1KzeQ67szo&p$~FU0+qGfx!(OFVWLm6Hr+i{VWdo;EFqPvJ4Mpeah+jLqDa z6#o@@`}ja#_$@Pq#*`yY$Ke!Vja*`i8cLh8A5o~xXw@$<%iP2HXT2FAI|ht9@(LaXOtwL+0qVs zZL2JdfeEkOAp9^Rii^urtEib~(c8o8Tma)LK8Khza~MooEj*Vv04elyMse5Y$=U2y z+;)B5bfc0f`hY1JFz34&9;9jCDpUplmYbpoZcTbMGd?E4E>%1D5OukO6|Cy4QXrfB zc{8%;K}=XWGanVDZk1;n&T`E7hoFj#jD*JUxjgjg@fXmz8gXhfUebp(Ds2I!E@^|? z>Vj5EyL}YBdNh=dSt{h`X-QCb$UNd0GVjILno4rC(AbLsLe_;!!qM}@=^`!lNLl1o z=xXAd?}@`zKmbn3P4Cv|PzFiE1Kx7cnG?iKNI9e9;Am?c!0;H=~pMyL_&$Hq&z~KIt=V2OVm!CpQCW*fN z6nS)bx@#dll5D?81b7nZ*snKXvU|GBrXg2renU8I>p@q%dZl65wi}tcKY?(n+OSQ+ zKWuc<1wCyN5$hcDH>>R*))|Q_UyhXQ_o=4rM4$af@C62 z-5YhovbuJ@TJHd&_+=ub6`yE&%%_C2GNDhPKd<$C7@S3TSGkagwo9Ws}Q zT6_<>QY$(xv9DCn1h66CRxxqg`$hxG!MxQHlj0_XFqxcJPfaEE=~Hl+o~&JE6caZs6T}>vmHeHAl71KSVZ7`-#6{nis>^QvTijl6KnVy zhU+7ZFe!X?^k9`0rosu|49qmo&FirJfmwxyzus#GQG^O(!IH~ll56Jl(lj_e(D^pn z9_kOJotGx}`UaN+iw-p*%B};3L5?|@S1=P&pg!Wrp&8@3jwS9nAdMRkn z_7Ha*M{rSc>vtZ^{(17eC=BzQoCm@@#ifu?6>tr7^iGc*@yzDE&8C)J9KW{}^|H-j z#dVoB3#=S-d&###PCar}ZJCe@Ai4#*ZthOp$vTfe8FL2 z)a`!${t;n)WEkPSHb*zVvkiBwc+Iw=;id~rj>nJj7b6>n!EMprB7iSn@-3U43(n4L z8v;8ya-`$S_F>d8K`(a$9p?}9RKBmV__Rac;KODa*5_6(#+F+muCZDu*qV^7cNMJ5 zSyrx(4QN?NySAUNxuVPkI_L6q6$^67z3MdPygn8b`Yu%|caX5hvSR6yA{&sK@945n zacOfkA2$r+%JnG5Z`YASL&HB_E4XPkVah0vfMV)&4K_|jnwmCk3($ZgmbkZHjT12K zMT;!-aqX`-sx+ko1bQ1=Oy`1EH339$%ET0 zqA|<0x(7X%mi_sR%cpc7lse~e%|>DZJiO9b$kiiPO9)l+6+=}Bjptbebe9{JpWypc z7t7+QjlVQ{yG0FoL6bfwLPBTpnC@P}vhOY7_gf$nEt$pRSSg#3Us226H3@zse>mMf z=xgKFEHG$@(Xq@IoLbEJdGU;29+oS+n~cZs>H`L2wguB`Gf;Bz>yJenUz_!CdZw1E z&hRII%&J5Sn-^^LjB*8n-tE=l7*gNc#J`tu$X7Wb^ztUx0g5mvI2^SkV3uluV8jLH!Boh3ca7%}DB zwNtB1KPtb4HJsvP+DlFBvKYW53DjW+6d8~9+HXO{3_$;?6 z4TtINEbeLkOnLlwCDUIt39K;bC{P(_qx}x!zk`*3B|G~NV|5Oi3F>Ogp!|^#)G3Hm z8F9d=>(yVmICh<{HGDh7^~K_G5BGnvxwG7Ur>{o=Qj5|XZVc#_>r&{D9TrBCSQP$L zM!PR=;9Nuz&>S=N`&0n$gK!JN%m0fvh5g9)8MY1xdUy89Z<`Q;nf^zS{o|wl1|46* zS8^XCm-w*!>l6MC!v6ZDkPj@Elkh8Ya~ z^FlaUP}u$!h82oub_=Ps6S)7!?sJj;DiS4#;5QGBC4j`r5efD`bkiXHkvUwWJdv;aml^Y%k&Zm&*MJRP-Zwf99`^!l?Ja}9#7t>eW= z|C-$yJ1qAfXeGu>^gq+}^`Y+E;dj6K>^!)BDLJ6ru~Ni1OoH{-3GhsYooIkAVfdd1 z=08guNxmX!d+*O7B(rvn>ID^%VBn44Uvq@>Ci7W^yPY!EXZ+`T{*S>gaYUgsYjWfO zz5maHDTv{tiRS%9cI4&%sGLqF#Odj2Hgh6jVc`h6sP4aBvWEOyv3Apaee+*$rSk0$ zwKwj21&@A;_w1Wx1=iV?u1z7s5v&B1iN{em>&L@EcJVO%kwcawGr)K)fUAqy$4kC_TmeM303RoteXGWyO?#B>L#w9O zhtT=&7wZ)4!Gjz4AqAw~tR{zSgGpm}bg!#W?7&kz8cY2v4h_ zorQ$o7HQApGmXa7Wh2qf#cX5k`iP5~+I7vAP8;Fx!UVoQjdAv$V)VDjA-clf1$q1G$xdy$Ck=CACvqHu z#e$=qDHyE|?JV$PsGYb0lch!&2yj$cr*BEK3nVo>EeIuXS2gitc19Xb>9HpgsPqy)e5u%RwQ3VBemrIZTEM ztE{Mo$wvb{pcXd%53L5P`F+Y7#{zAl1Wj@iS zV`@v13Lj+CA(YQxOV#7GcNb;zqzzdqsz@IH#90dIHgHz}O;2DG;@eE?!TCWkNk!0j z*^0^B-;c#M))8#@N(x<jqrRDqoh<()D(-a$15%_rqZf= zD6UqO<_sjpB#F4AWN{dkA%~def*{qJye1IkZ+ZzGPE~Xk{ zxvk;y8?*Mo2vl(MxF0?ER}?fZ>@soP&tUsNB4>d1U#5>O)dvxEGMXsS7WjBA=tZV= zE^dw+BgvxIgsm1YfwZI$-Fzue&rWB(8Q#qJiSoRUG4$#4x1OMxx`0Bi(&ukgFJ=P# zvJsRr^-L5iF>ka(9JSNagB?C1@Q>2?2*Q?g6@kw#ZCEu5dFo7KYqv0opA& zQteb#RTcXV{Q*b5WYId&3Lx5cRo>i zD9=j10423v$;V;MG@WUdg|%#vn-6-O!tIw( zw8GL(=oB21)%DQcmj`L!H<9B(e#{;wbZ<}+51%Dx&QqZH%E zzrMxw=LwGW!~hCKwcBS0oI5z1Al>p$JUUrZJy!bJ?{cN#$F5s)2QwP(VC8IiBTFJf zKZjiA>nn_$_X#AB>{!^2F9%UQbg$cwtV+hg(QJTJto|uB`09bCdUkp{;OeHpD%)7$ zjQ#I*Bv?!^)ofUs#XQdW?}|e~5)!{}GGZHK3bxJPzz(c59)})r*y-Z@e(|^MIGhwT zITvZfX1qd0KM)E%dp-`)pGtg}+*NLf`{DG73uoJPg=`E7H^jsGlj-2%3qyt`z;BVC zoP!nY{%8tIP?GD?gVki5Un}rW0@UQ-&g;O(<3-Xz@9;b>nGZk(4OIw;_@ zVrBg~Dk;86-FFcRXp6Vp@KpLVyXZ*d1fphPh$5tJu>C&HN32*O zhkD*$F+Mx2)nQTVU6-wwhO^PlgNs&Ib|J=ZNDf?a@-F$ySAY=@jJz)e5M2Xd#%tX6 z(}(|5)g)^!FFwVsg-B{ZxJN+i8`?ZK10SZ@J;}v_=7NhKPy<+gjFFmsYLcHiIfBEU zd5}7Y;rp5AN?Q8q=b1d+Bl`zU*5%#G-jb4%2wPay$Y@GU^fkcH7hN6O+L>IAfM6S)hRB!;u^51{5YUL`C0V<)fZ&ad#AE^FiTI&r;&m zUEY^AltZghEs1DZKes;6RJA;Wyn_++3P9 zqww^f{@B?wxZ7W&vV%d^*Ln^M80GP?@rjkvT915rpUO#kq^0qiW%@%A zYdXue;bfoLJa_|{9JbKwTJ1+3%b=dt-G;J<6iibhvAK^xi!)s!l+|5`I+6TyaR5yH zC(d)$@di)HQi6D{zRu=2HRh=Q;j;eiYn*YzlgXTQQjD};E!5p(NTDttIc(ZQzy+vm zE5CjaLQu2LPil8j2#Q=rITz{g?j`_Z`O2Y5zrQJy@B#U!pEx8janp_(^9nqgzd9cL zY1QU?r!aosIZ$^nGzLw`mw6{4x!lZy=zOP81_g|ZHaa2x)ZJa7r1#MET!DJ12}muA za@38H087=|#|vJKsz7cTu;&js4&r|Gv=)G252bMr@vjc#`>p%<$p4OeVu$^N{}uQ6 zxF7|8?rIAa`VpjAx;8Z#a*0J5D3V)KF6U{>Gjrq?U4N34C8x-nQ65`OrY6*gPF8j} zoB@KgAWo+B>j^NlnGJXi4KrCUcinwGg|dS8!Nfa?9dVyFvDwkSLmIs#Qz{ccK4@~( zB!Lu%ov|~Jwr_6ZV6**l;hG|8#1rtWtlrWtL{LP_IXzcS5nyuU^mz3Q9NWgwo?&c- z@S8r8fWKZ%{)l3D`w=aK% zG|Y>){RYz|mM{M$9f)6HR%YRD{mVukrJLg!#3Sx~lq#G|k)5)$P&a+vXSX{T)p7>!rwcA_AQ6{-p)3k&aX_Qu)UDR& zNKEj;e4XJi3tGk|({Z8(n~p;g$d_qpm%rt{aoi(;`U^5Wd>NzMaIDO8WL{%rcwgyf z6}O!_9wUEN({*wp?uopN3f?5ssLZUte<_8Me2DLVm80m0rX|UnAgK3R6#byJrm=dp ziF5w2desf(rYi^l{dk9(z>pPgR&CdFVC{r)U7juZiZ$H0SNpn3_)41Xe#n zpF?gF)m_k zIvdm9Kd}cEecLZ<`N+S-nt}z-3n9*q>bP6kVz@W5 zDs7+kUv-36%O}{CKH+Q}=S(l-Ww*<83Bnxm@getB!z$Rmq=3$lVnpVMz#5u#G9gWW z6OVpeaN&>~bV&$e`}^Ga=3|+Du3U?CToz5_XnQ{G7$yYzg;MJf0Lx|#79X4KFY8zM z$pFt|f{{1>bO0qbTRfp}SP=S=k2MD*0c|6hn`!DIz+7Bc_-+LVH!N!ic9={S;_zmn zt!KOSmvv@Ri-phOA3t{t1MD;#nZ8p-xT7KH8_$&HJ6^*(gdoPc@K6VMJJZkot{J}QhxvbOl5l}auQoq>zO z`sO(mR)B;wjwkH>f)wc3IFhPu)JnFtmFF+x5vTc7n}~1LYgs7&njI{G@`5x8A=_Js z<7JpCaZkVFhf*c`z0ETQl8cuh=q0oP4b5O+xwu z(GtQZ%|gb(T&Xi^$ILgW|Nj1Fm04L7S8?G$epI=wn(?TIJ;JAQN>eH+pjp*ocIvLS zP1b^-E=Be$IPy(O&DSd0l%a*-aYEa7BIs z5{sOymb{$wd_E*FCQ|NedC!;eav^XyhS*)A}~vD zWD_5VF?Yp2iKW_5Y>Ag(F3=f-+PWPJjQZgOzgxX^6vc5STu@Ch$~m}~DU2FX z0EWVdHF}w~{*-1LtY}EyQpKZJ4N!(6AkcmLNIXowshxYsE7`_uy~0kDphl?T{~sBt0QoC}}a(yH}vvBbU@saez#wq$T*>mEC~5>|$^)LK?@RV_yb8+h*coGMt_+di&@v^t~rM2Y%{E z+*?l|Msl|e5-JIv;$v=i8)|UdSbS+NFsSI^5HGpMsryIgE*N{VCC>EpZ2AdqQfw2tVCdA{{inh|{9*` z7bX@A(n7kRjT)L!y+eH2!G=2qUY>s-uSXct__fQ--U%h;_z8Vs?~QUdj^ed1R+01t zi9y??*_j8GuBh8-?k?%kXCLlCIGStDYvW&<|270R_E z(U{ySn>JU+7%IKf$aigjxx7L!lm`N$pFGyQrJ)S$9;+QMZ!b$LMr)UyS_q=ccFrEO>i|U}VxfH=HBla)L?2P?2>jtv)eBJJ|oY<8JR7 z0paC6a(nJSEO_@g09>Igo*nN6wqJpsk;B3R-M0m9*X1h;l0=D{sU;_+cKm31FnL`i zA+aGbV#5Rh`A4=X7@gMs$p>Xi_h~i3`61$ob1(_=mR=U+zI^S=wIH_WWVU5 zo?NL1=&;SKFxomKUD^c#1DFMDu+EyfMzI{P$Hn9wuA(HYdskisJi-8~1M0Pdo|r97 zptbDefz5mFf0Wt@W;A55S>s0#mT5+d><{e^Sf4{Qps>;CmPnF{Z8j{%uF*hEqS3ju+!Fg9)biftoMzf*Y7B7s4 z-wEJ;j|^zmbikQhpS*as$neOr%#PnM@vG~31aQnEB#3;rqx`pow|mL8XZS-~D=N_Y zcTwO4NaYT(`cfIvUv>W@DSvEJ$}?o_BgY>i-9gopMHV;W+2$ZC5)dbnBjSQEFXw3f zifBIG;c#ZWVH+jEUS{Su1mt9bl^Pqtulqhp=Vba=R8NN{S!jFHE;LG16(ckWkEPS)6Vk;DjQl=+E!lGQl z0UF7es=gZ*v{OHyaM*&muaTu&tskN1(9AH-@@t^oX+R(m2HOddICKM7I@E|EZckt2 zNAk~MFa>AEd-H!`+&=Q?=-8U0tFToR z#z(nu<>3Cca(}U!G;lanbNeCzL~@~WU{i0?(knzq)OqosYDkjBDEarg1lz-iawqqM z+uQIz zC0;@HC2Kp^3?Gj?V5bOPSt#}jqZ8OJ@bNR+Gg!>`{Ok9>D9OL@ohOP;_?NuPySBT( zA{YeLK_)7b4>kxBsjSjE*H@h_*Y<)HW+^@+8xY?my5j2j-C~#PRn52k@A8>wL9q`X zml(`Fgpi%82aN2v%K@5hVz8!P@`wa<^bTCyqf^x<&jpiK=`gcDAOykT7e<+8dpj?u*0W#6`^9n9Ekw)VX#>`tXkn z@-_`h%uJ(f2VU`^du&yk-fgTaG<%uXB76ZqP>~HC8>1TLl4(dT0f5N`M-Iy-U^I)T zxq}L2v>Uf$?&$5afbgT2a0U_5&4PE;r*76O&ErsV2|%WD)(XtB=`gn^P{OhUjBc}? z{w2+(81Q5&8V`)$TeNZoEpnE5gOoZ9TiW(-4~t9Z#XZOHJTA6!ifJ_>xp^7pYkM1$ zz8>HZOR;?SJ+Go7wXg737??JEpj={$v8qTINqy+<$!IWHxemVB4F-n|kMNIKjLLaF zrB!W~UINR5+MF`~AFjSLtf{T*RuK!LA|jw5peP`{N$*XRs#K|=Nbe=|fT&0l5D-EO zNbexMgb)GgCDK9%si8*_AOu2kbH4X}_x0RA`{5Vad(Ab+EMu&>{2$!3S$z2JtWDx+ zJ`LdUulgksmenw4GSa0yt;a>x|juTJYWr~51nB(&h8bTc9nIXg8C z)>ngysC=%;dL}#cK)+!Ooa!c!4=^$wZGRx5xG($QtaMMxMT6T79@le7T_}8seOP|+tnlM4@YJt#+sBS>K^&Dc zmX)j-_f)wdQo}VBCND3G@ADXg49a+;TK!6LmqG6xec_%NEqPgaogX%5^=%JVENQM9 z(({h9F6qN*QEBfjUOk+CCZ%l3h>{#CE}AJ&KhCA7uD&dNcq=?_MbEU&_cA1aP($WL z_CF9?Np_(|16lifXKlb6QB8c|if}{|pGEzCIT>ruwg;@t{~b%NTx8%~2Jt0SKHyh8)UEH`L*>qFk1v5*XFe22fNo9`r@~ueSBa-axkPFb!l1bA=Z9r4i~5} zuP3iis0c%x5jw5j@jrhk6iPzcoc#LVQDXn`u7I3(0tPSA)JGq=RvTYUuK4OHyjNod z%Xdn^YfRe}XC6*}uOmbWX=`Xz<-sitv?X$^^W7n3akU9ydfMG~$A8{^_2e*O?(fNA z)+x_pbZ5^Hnh$ku6)z^&^E`{Ip9g~}Lv|pkxQ)2%|0+z#UAAw-v?aPCAcWt{^dg{%&qg8|P<%%zG-uY;@YX=iC|1Hv!((hEiXXTVU~TP@1-`r8Rx> zsACRuGQ1Reo@qfNF)W zAp+fmHcJezxh`h7?+2QYjPAeS^({j*HSA+6h4$W|MSksLFT#IcyrmeddGGfVA<)0S zLxu9qcPp+=HDG^{(S1;o$eyrJw*Vgk;DBRv|DK>NvGuwleRPuvfU|v}=K#HyWxOjT z+zd!s<=$~TdexO3eVqJ@VD;RKf!a`1HboTdJ zEgO=nMqljJBhn>HVLnUpg}N-F;*@?TOkJbIfEHc8j3y%f(FclZhKK(OD}^T zdgaiOa`gz*Q)sVdG1NI|ti*Xt_eE3ebxwwg8U8sN3DTp=1E;OR%-v4U1j?7dLtY-2 z%iO(L8@)mP4Pks5h-;6|m7>?n5L=oVOYOa8-wl5eA-uzMDXbn#kxUafDH_e6(Arw> z0l}xoxrsL98;`%Wq^_qs$B6N`y)h^LA-CfM}dv>QFiP&)mw>t!tm8# z++``{SCtkNw5gv^1$y|%SSzY7C*GpD<9W9ozfVjc;meDdnD0&Jf36xH9wpt$s4M!) z8dU9PzVRgF$t$Dp!}p@E`K(9)1FqK5h&7a%9ZlPN`ea4tV*TZBHD zBG#;t0sYxiF}-r7G6+*fQ@rCw%qyVbFFDlQW|o)mExQcn=vb;EbwQe8w140&c7;J*PK(|vJ7j%ZRw{>g=Zs~tabMS)ALW- z$>h+@?C|;G;(cuR&}|W+^6|3Y7=d6QA0FW%XIfO$P&5`M zg26Og+mk_Ubc#ujytTem-+!K#p!zBMk%dpi%x_VLAZRgZ*%pTRLoJMsi2pD)%UA2? zl``a7m5KlrYivilQ|cbuvazktj@RO>A;JQG* zVv)#OT&JZp=Qu&uB)RN+q1_P4iqPk9BB5g6#k>3 zNE5JV0*M@GzjW0Omkq=G+yECKWRl(sg;Idd57r1~ZY?KJIekYNqnxJDmQZ(MmH5&Q zVcaaZkT=#NpD)YeacetWjP66WosffI?bzFWkPEz8`$GW~6t~}z1!5O2UQ@h4k^9i9 zQ_am#<3d(nJm_durF-2f>@Z|oA;ck$FhYN+*4ASv__a;SP&)0=&!t0_@#Cx*cEEXn z!6Cr`l(_P>M;gkJ18eVxl5ZMW8-d>=R>lBGYkxrI&=Q@)(_icTWoyB>P50rbp`5Lf zmC`vn2A3$`o3z{WBPAZ6pXe;u7WJ!-&f7 zMQ5ku2>zyEI_sst$%tC_BTRh}<4De4q4B^vqwCjULHEQtbhB4Gh3)Kz;)$^6<5UDS zSkgitlHqd{o*448$M#r8g5<0G(a9wYml?dyEV00uAX_t2`@BK?Idd^pO1}J?-xQ45 zFnR4X)_eE9#8H70fW(JZI!B|Fx61#MttHvt${zFA})j zxd#<^TtA`F`IBG{YJams=v`s}yNs|BnK|e_^Lq?mJ?HeGXZ)U5Q-Qs_d&^Men-%5l zV(L$+F^~SU@&9AZ2Na{uXsx*buUVd6qgngs>zWchYlwE4hYPUD#g_3>!L-I_z3X9? z%!$a-<nb*PtbE*$=)BiIi6k*xh1W8wOon+tx&+ z%D3%?n((aw7g_r9C5r!qd+{oeK81&t&Xw$NVx6kuj3N8!KU;& zh}6;Lz1cTPcqaYHv}YCjSgcoC;SL1T2HuedWZ%7K$Z`AH6zMxpxTNjJ|L4QE-zjEa zOOw>M=%$|Pi8TO31q`CD*bR=z2L>8zIk$ni8yi&H^3|E@r2XEu?V$)Ed}oXl#KZlo zYsOcfB0lWdEafc7HzMU_HW zlK)%n?PeNiv0yyxAc=FQ^~Q}G1A;mK{JZ;L$XT}x+GMShu6%u-Zo3V4^@bd7hF1U{ zQe_r;U|{YS5H^(|rS^6>k4MVG0y31InpDk-*$#1b(J~T@>XRbNl=qz0Mj3P=lVKx6X>(%9=JUN<~P$ZX&P9v$R7H`F17-DQD3DqB6a@O zWNeX>bXb|WFz3B-+CaVrnt2?4|kP%Hs_T^p1u6>vq zPImQQD3&w-_K~U~y=;nQyzrrx*^)XYkau-9+7jgu;6PmR)m8pdRk@Yqf_VAhGNxxS z6rW%16l&n!{N$WhcBvJr*&Z4h^NV|H>m~YQrr^@NAmHpnGhYt6bW-OemFwinpu$O3 zp9Fe4xtgG3Zq&qu+)xL6?oSB2fAn!VjY~&{KHxQdkw+^R4RiF&2=&L zcGuCIu*5?0Nl#ZCxF8$ktyvwiQhs_h+W-KV;l^~Gt!DpT! zqlXqBI<9IerTLw;IaD{nYCm?yFL(snpj}H#qX&B3o1e!&*!yY`d^~Urfv!gwH}#tZ z)5J?Mfvi`;Rn*r~rWU^-?~ltV1yliud*B?wYFChobiy7(=<<4H?bb@&x}!Q+_Gn(S z)}N%5KKAUTc#wmo1ab;*gFAH6U;EMVn24?9A5XIJ;bR4Zn;b1HYEPRvh*dkla_}Gv zPX38{f?sqhY;9hYfNBj2l6y^18-4st$FxqFGZ@-+6cOJ#7c}T1^ZbFPuzQbh#)tI+*=Jzr# zga}=fp^;VcpJ{6*Y+Nq&pevcqyq%%8=oh3VUKKwOo_{HOdIzLp=dUVHlGFW0e5;M& zXwsEhm#B#9CpQfXi#=YohXGP{7XkbLXdQrf>fdu5*|iiF95;{g%$X;?nAq_#m&Y?N z4gw*J2drB$gAVY@&Y*^{u<@R}3~Hjm#zYYJ~vV;1p8)JSbD zLShB8yJLvS<$Z1mK5B7Q5#I@E1irpSVa@R+(2&N(V~g=`<&-C17mJ?0@5fpA6xKI!sIGG_9^4PAd^0P+ z2=Qr!(-FA*7Zi49##`rbyd=WH+c*>?u-4oYd4gxJz6M&sY_Ow7y%cY1_I8R0x z$au0u+`$#pi9Rw|JR9s?6J>)dIlH*DS3 zNj@px@*wHMN9ht{b>sVs7t?3eLNJ&#!Uo_7FPH_x9=Nx7t0?~>X4Nc(7Yt`V(qeLN%AHh5&Nrc&uLPUz#ZpSH`A!6wXpTumexIn;LQ zSp}!TALEsMjFtRGJ`YWO?KxapD)DE4$NXY4_)6S>M2l_uOLW_f?q<9-4nC!W=8LVm z6>}<3Oh)>4+HY@}|&mnsA3_;rLO0VtB!p$M9zdiU5tjBouuxqL8aY%A zo6o5$+LAotbEc&qb;*ye4gG|(O~L6sr=WZ&Bu_zL^9vyaF#Wwl>2$2DzL1c*Cr|FS zT>6lBSY4Qa4B7eYv^cm|l{yD|%o%$05%;O)HYL59ghfz%Sff|f!YKImC$Y`_H56cW z8vqYp6>C?l6cm^^*p`#{dC3XpAkzixt%|7AF$2po&SGk7E?wdt^_a%QBkgT`zq=Y8 zQL+vANY5>h0^P-{C*yiiUG*dW!467hbtd(eB}!nWJ9`*%~mue47t%rZHP z62=WJ_9P1cWq%ZGE=7yy-=FmZXQWN-{qA555(knM!#g3lr%JHfPoIU~&{WFJEC~IV zD?ZGjw7ImXS%@)t1dPc3VP&{4TGhE)6pKhirjM_4`O6FC+PY>+XjV1<;UlSqw)m;` z()K@OUpLhi9)QL#F|(mhd}Ld$dQ2k6}p8VU&051=RLigaX?!OjWXidQe_eyLovDniJJf2 zp7qDkxb@3kDs>NyeZbX?gSamf-TDs&5-^0rW03XA`X7WlP>kx z3+XA2SgRX4r86G9Ipxk&CsYaQukRAh0Sy%iEL=WY#=-Q(-QP&K9<0W*2-D(zu6z@! zq=D4>8P3+#nHC2-aB&@fVUhIx2`~0>2~3bX&kB1MyH|yjr;Km{mDI^RdXLDF(JX_Z z7Jki&3~OsR7_anQ2Ic0p6NK)~ZXmAPYrl{-?OZv016n+X-RhEF+JSJK-oV5cBkuVY`wP`0H13A3Mev|$WVUGJ2_Y*F@Qta> zIOyGw+V5Kj71)Tq`wc1&;pDOqJD5ECfBPZ-DGOgwRK2mjd35u08}IOd^rA$^x;({BlcA3*^h{0!IPeyp>CxVxVC%1I3Dx_bgt|r6Lnk)mx12H8pxn{? zV5oV7WAObI49A`g``*L`XCSG;m}3x{$dw(~p}XBOIg8-d=fwBMn1}2;VWMf;)QNu{ zPjT%89!3v`&M@iTCH?V$>2Cy`{}Lh>V}y>#MP9a6A`2#-SMU#(6Qdp%+}le|i)Psk!(>ah9M8YZbI@@)!J?0g zsk)7G5^ooW9V!~Q2N!5c!+c5%Pe6g{IU$E=>GfH`<07hABjTLD+IqMH6!zHjiW;Ee z$ut3@0clY zR@TXfUmI?;_*n>K(Pa7(@eOfj%EEiFD>|6`1{GzFi3e3!wVkIom8`NTC6TsS7Xlyr z3m3J&`TsbR23~|8wA%uP7zG;9%!mH*!#O7W)TV9V_F;$KW7T1he}!d6f>`#;zJVeD zPgXllLI5nY4|>BId>SZqz9u#!o2sAQQfF4s&^>o^H@bi^2b95QDJfWtYWN<9sMwg% zv5C_)n67n$)(6TYHvp1ht5V`s02H8uxG6Orbhp=YncNJZhs}RecWpa99eIl+=k+gx z=N_a>Rhr1-N@?&m4bc<*$~tR|H1eEW74kav0qb*f8v|^hL(qst;>(*i7i-uS?@!k> z%bskGd#@bu+NDb9RxZYhDx9|a7p6?A7A?%ET&I`J?>YPMvDWYW+Yjyd($kQWkfKl2 z4I@hgD+BjX&rL4|WMqQ*jNlYR;$`;CEHAmd`SL{`H2iJ|k|>EI>QXK~l*qR8OWHhL%5(DO}CI;I`bO$=Uw_;fFsWAUrnN za)J^TH0oQr&Tze*GcHVRkeLPV@A;;o0e}gptIXk_J5#kSL4uD8!hZ8!vOKf!Mgg7> zzeBCnVCH@rk%Zlvk`hVc9<-vGiZ-MxCan!y!RgZOC{Au(j!J8)+`e};d^yag_ceEd z^1rgP2resS?F#20C8qJ}7o^oaNVaD#8?&Cwq=6YB%jZ8lqmJN^u~%&l+Cp_8hrvVZd{oHsXh z;S0ogliru_CoR^Y--V#m6|{Lt|8&CG{#ZJe+B9FGD*`Olm~9NZAB~?c22Qx2%xX9F ziCHd@%jV*asG%7S-sj6WG9#!k$r(Y<-NKZu-}HZ4qQ8MSSaIq zV#(v6gBnEL^v*@%9iMOuIaJqu%Hf;C1M!TmfaNP0p^rbNl358dCv5Q8<@i=|7^S$F22`?^^;s#OD9;+S74?k0u z-GUZFBWofLss8rnz$aD?4bCY{O)dikLAt+Rf*y|8Ca+cvoVtQ0!H^kxoS&V0@BvB$ zj$Z0n(E0uz4z283O0mb2GybtR#vFpK)f#k6p{MvOqZV-tBd1*-Z{sA`7^DJCZ2Tb$ zydNj49d~pjZ~BLoj?i)Ffw)zJtxJ5&2qGr6`x561)vcF|{2RCJlv9sK>3zF?q0CRM z)Gl#gM|a{!IO1aM|R0f9N(x)(nhM3Nq*}sWn<<)1aH|1@&dU}FP>aD5{gYphs=KNx^?c_{<`IH)0zu8s5 z4x~yv4|xuK5b;xlV$IP6>F^0f&q(=1L^8sn-7?BtYoy-#oL+tCA8uHx7zeY3S~z zSDgONaKsn7ez4{FDGlJ0Z;cI7Gdu286hj*IZy)crv*beS)vEbEY$xf9MvWae6LXK6 zADlWP=sS%Dqyg9bCQM8zYe_c+D!oR{{!U51-VE2GfKV|yGiMgP3>!9xK4cr1O9L#F zIs|a~F@jdMucQleGz3@74$9ja!u;1OrFaG+6oIN6f-e<5brBwcoi!>e;zz6clQUHT z*8(;@)k|-FAjXHk+b7D0u6y0j;bUBy@}eZ&wzbtaivr3&ekIbS^i6pR@A;#cv77Uq zq=hSadd~mwIR9Dka9LWRW##gn&75u6L&2~W-(pzoKsj_|t~*uxmrqXE;XBr?#FMmx z)vLCcO-&YW z*2c^i^TSH!Xs7K4|4+ z-I-XDegHOO+dtl>mkOxYK-SX?6c$eepzNpcfTd$*V5n?U<>H;umo zarJ#mOS9{+Hs_>G>hkB;Wngs*VF7^c$35o=&Xu~N9yu@RgSB(S&-HAFJnuo3OT8nN zI$s0riu>{fj|bhtj2=rY%y9!?77^3yMwqd(ex*hN`%s~xM|u2isAUv%J)ynGR{N{5(ix*} ztd`3*&hjfgJt%kTCL>o+LFb`1PIY~sYlW!eySvSY;E?-kB(`nb?hn0Xv{h z?oQ-7MEc>3f*ro}tU(;q-Xc1hW&c$4saI?4W>~`8p11Q{@?O9ThxOL9*E>&zHxtHn z$>b@~89$ZNO*YABk6ke`P_SV;1un%&5q9wWK-KpE5MRh~rR`EJX-a#cT}aO1lQF90 z!yAe9icBzxQJ@47iI91pKva2eQeu9p`*{K#k|R9lId$m%iX(R4m~moS^t2 z1RrUUC-aTQ&mfq+!P2xTrU~Xf=_HKb8)Rx@>82WOENwT{k<&@2`js!IY9#o1pnvd_ z!oW(k!o<^L=CbozI55|Pz^1u@9Do5BqMx|q19@jvtv7bOghx z4b}40Sl0~L|H;R}U?OKVf?(Tik%*C9S3 z_+Gs#aWCO{VX?w!^}-^4F0+Z_<8G|3#*x_$lWx?M7T5$k^_gcPt~gFet~?adKP6V( z+G<*)tErI0p#>@y#6J>p+kR`(+AOz)-Jnx~_vyMUmvKlw*G2_HXr`jJ;_j5xlTTMf zUXUq1_}3SIy>OA9!<7*NG{(-mgrQ~A4WM1_sNrl_k8T!pTmGjdqoPIJq5VY~^@^H=*Pq7$a7ZE9@+DG&ZwT9xGXDp1HYor|eU)9r00 zKFE}xOL_6&YzsLxBl=Jjmaiq9z;aPGY~$4dv{0%}5;QU!gns%(9*&I6Mkiu*9lr$U zARo)IkIC~2^fugt2g_Efm^?WKB9f$fH!Nc32o491{fsp=WevX!*iz(Df249;gxF>V zvwV{wxra*Ku0FVCg-w_8WK+6c&7ldu! zMbU_5jA#mfiY#+7zIBF!8U-G>y@|R1Nikej&OrU5|MQtfFnpTh{Ad;mCaW z(>8G=dx(AOjr0CC%NLLN^piA9wV24w~5R zgZ!IPrdZ}WzT=`|rnek)%+h(0QvoP1njpdW&jYK~hbMWhi%=^IqMtU+^KHA)GXDZ9 zpg3uR2ASjiUApMEfF27t&TwyFHMQRs;g)#mYC>w)m-{O36jf9pS-_stda0?v>aV{~ zTjN^NcG?=E`B}p?%uuoFsi~b>4{?=Otyyn^{%#j5UcTdb`7=z;E%1@&Z%1?Dse<&| zv-TmI@2u#9pQ%54qwRb|(OLU4enf8pmLQOB84L%=x>M8;ucEHLwERFeHb_Y`FCnNR zGG?yh4>C86O(Ih#Ua`Zvz%c5h*{vLj$~Z{7$T@X7|8R6Z|Nh(q@GUeS%Di*_erYQ! z=rzJk=c8P96d_JV-==20+|5}FRMCPeW!*|B{)rhkLUJVRoy_|O*^$L59uie2f?kB> za|k9L(Yr=10Xzvbo$8r9>c^0lnrty_@ZGP_oZVCfynV6joM_vxicBd9NR?PYJX_1| z#PT4Q#>O$W@AtvWT%DYHDMV%J7+K+AVf$ct$nXP(uoHbfG$70%GyvXnE^&voTXy_;7NWop!LfxJPUsIP?`ii7+nUDRs052Hno)PvrZ z4TL-%hv^}F&XoTea5yC4zy05 zKTIzvImz0J2zTT6!q+V^ebt5WTBISbDEQjJ1cl62N1oe9KbX@p7ws%s5nP;p$ZYf^ z{`ad6lZY)R?Ms*~7d;+tp!4RPxPTSx(WH$`W5YstIQa+uL2E=?@WV=7)91Z^Ug}Dc zc8|2PPYR`?J&T%xPub*+IHmx%aU+xQ{WHD2Yqpsyn3g522@{1O?mIjm%fDAG*Xmy> z5Z^Y)CCakb zs*yxUz4(CF@b{XOvf;fj+d^rL(|;|N$RjJZvUwUa28nXzkxV&FtoTY4t~3|uY!L5K zo^os=W+fePBAndxb4JBQsm6oCM(RtNm|Oi+txu2D zTM0fTH2y_?&O0WPOK^!teS$d>zF`UN4>4$WZGy0(zZptDP5xQ)8~b5hh=iN`w^gq$ zPrQ4&Uc%hH;i+M=1pb*s>gk_Nk}!pjgLVo>EQ8T}BJ0KlC55RFEU*r5iK=wl{dwC8 zl5=mrp6M3FjGMwWb->o;zoX^D+Yi4fN9@&#jw-vo-7sX26u+vG{2=bfF-RC+&bGyx z?cCzwlTcwM`w&WFz!H4l#>N8yL`@YN`i#RMn8`VP2OBs#j}ST}ZP1`p6zH=(;vtlc z%oWkxd^6k&bnK|v(J@^xZ1tPe3k2b+2V4(Rq_Qs8IdDd7{Z1bjpgoGvxVDdew?nGH zu8W?fw2y!hS|Uj`x2;fzZ%Phs{QaiNsz2y?wfdaWp?b&Ny8yrZiI$BY{I6`B zw%9RWnyMXPhKw~-U<+mZ4`mhpsqniJ$%^g&zN}C#rFo6=D$nMSlY-%5kbO)2bJ`Lg zNY-<7cY+JUB!0>fu^l*HsjtqPa(13S#z}4DrV;b2Luv%pGX_%bb$?$U&)%neZgF`# zWe_|-UG1985_~IV--@>xRo7-Q?%*!j4S>6{_@HLh^6@DQ<_tZN!1j9BJMsgSu!xGh z&>OTC`MBY4&B3=4O06{E8fE6DfLWccbTr2O&k`|DM<<&}=AM)U_gMOEJM6xAA~ymC zi1)$*!Lg?>ORh?jN3@7L8VNs=8ckm2=$iG)KAMGK$CziPgIwWr;(nFgD^4MAP`y_q zDRpZ`BCYOhc7CM$4cMj1p^*M-IWB}B&A*GT1zA>rSED38B)m{3K92;_yz{NbQbdR#l&q!>_;c?{&o=^sapS*BKac>NaSe zu&Pz?rb|`FYfM()IMt*x)$2G!<0*g>lFi7ET687Vt!uJQ*&?Nia^Ge{=t{^sDJQNf zozpg%oPAlBwz2mz_OZ-#s|8L-{2lBK@*`8I)$9dD)ObXJ=E7e;diyCw_%|!-&InVw z9ZU4$tB={gROPR=E&9}Id01pLs+gi)e~@WPJ@zo@qrn21s|LG57F^99-J)pvR1?VY z-O8wLC`V!nQ0=kz$Z-A^}pk1R(gI~aFNePb&39SNGf~N z?%>)(9mWJPex<+I6S5@s{d=`n&40#y6rO%~9WVWK`pH`E%B6z0;`r5 zeIV8$tsoyNYY|Fzxj_$|`?UW>F~tblYu6d1L+JP?GJcQCx@ET^LG}@&+>qt=#U`Z< zetA*u7tr^~!%kbDi~h&~LGvr*8230aYRK6w@mNaq`qF*VdvxI(ZlZR>+w|>-oe=W! zgtQtl|MD%o!VDD_W=$3MtH3TF-$vp+5j3#Odt{5#bwP~&CHxhl;4~s{qS#|Gbc%#6 zFEvt}J|XT$Zg>RIi&a`z+QWW9Y9d2y&s5=cxPtkup1u%S$D@FR%XP(u4+}kM0{t}W z%tM!@UMkIQ3~!8YOh2d9G7Bv<1t)jMJ=zJ8guMsKXJM7AIkPX2sU^fkxxcOcqnRqr z)0RELgpT)_+W~Tw^d_hb^%<(o(?=5?;9I83NU-z{_04uAzBe+PkX4qx2u{Ygn9jvP zx5lsqcBfwtBVTCW3*X>QUR$Y?AX{MLB}zD%r29r)1^NAaA4+r|`kaYZ*a>OoOaRK8 zW0gEQ)yT7)|M}x@-1{OyQT5LHeZ)*xauvAah3(>OUS18|w3KI|R)(x7_rT19QZZrY z-3Bl^xu@sICl-1``$QJF=bb*$hab286Ezu&8kpGNZb!@!rn6=qWK0sBv%aLi^U`y< zF--PvdvV&93M`!xL|ik1d~CjS=VoyO&xi! zz1!Bagn8H3()#b?rkSj=L`=?DtROVKlyxJKwyc|K0aOolBK_Sr@BeoXUZC{m6w2~k zz7Avne0NT6L;CxTxcyNKz2=IRdCgGO@`zh&XMSeB`MrLqDKEm*`@o;R1TpOy^I&Sx zG+Ri+%3#l@crXH$wMDA=u^{Z$jy{FSG;s*k=lPA=t%}qgb&*4k8YJUUT+IlLlJXVG zPq!7bSl@rV@h|p(=Av=)_hw#mKJ&ASGmHKj_#4ft&ue>wx!2no;5m2m-E>^zCrrOL zn+*1HUc1NG(4pBv7MdHF;mX4s_kUHzC{RbT<+t5gp9NM*FDLk zK84jhYbP5(w37TFZ+^`LvK6+5@5}wIB>oXa`MxurijmWRa<8p{4Qz4F_4y5#1XkS& z5RyJ*e!f*8w0HfbxN+5Fs+e|P{JR?J)0XH7XF>R%2PTpZrhfE#&hwNTjpBo35d@YD z1y}v!{~XK*c4Ur3C$$?%$mRWTZ0>9+|6}@ns;=r z)Wwr7%}h46+MH-jDB^m-ef5T6BC3kssGb#Psu@}#qbi_OMoy+snbSfy^g_6_%#YQl zVokuZw)0wS5z?9Rl5f&g*GG$-!Vd#MF7sOZJ_5^#yD z8(~D!y+KhAf@cSl$yNv);mv>lmxAZV7f7ViK_@-GR&yqhzy%X6(fwqZP1Uvq5#HNR z6JHd+DlUQKV<(R{8g8BcTxz;nfuz){YyHp)5>O9WdmeN+7SvO}pXQei#eVb3WX|NR zG+h0-OGO!YU$a4Jv2p+Vhyy|boK%5r`IW~D{C#Exn+>T>nM^fylO$V%} zbML8~&2JI!j}J&N#c`_X(W(Eld6h@E?(Bc`p0Gl$WQgZTxcK~#Mn4{$qe0@^atrdV zKOuLn!;?q8`~}QBvG1rDoIil680@txT+FaaGfZ<&J|vzFyiY-mwj;x;hAgnbP85kE zje)QB$u)?@FG*`x%J;jU%T2L94I4Z5g7O~u6=pSxOibH7NFiN3WxR_=3a@}PSO1jV z9;PX9G}3is=)H(PMbAicD{_5*d%=ToBBG=;GW)ANDObf_TYW5)1c!#QCiHd-42R(-D={Znv$v%1{M8-B z2)PAWyQB)!XX-kpO`P0XWOA3KAANu)NDjRSt;U%zHA(Ierl;#h65`B+vuFQ@gPq@% zup{-DLMz0cv&%AgNz3{u>HdZGF^WIrn_cvon#z-YZvCE)3#Xz_-wj8>pH_~7V}(=- zmwu8X-yNs3kGPHid%ch1uXQRzg~VOhG8SkC-P;bGw05uU;ub>YU4Qi&W+7#b3)=VM zgY9~=Rp?~i-Eji_6AhaW4AN(1yBUin;o4usUEr6h5Si7P{E5q-S~EAWvoEp!Q&&Js z+I1ri3S?}Ysmq8;B8O!q(5@T1P6C8Q_b*uZ`Y?Q1zS;P_WaYTn{E2p(XTF)s`N*maV@jGR5g9Fs_(yp=8b866_a3>)|md+4M7r*m`l?|M;7=i#; zt-$6ZuI>;vKXbNHt{kc&6y5h8>!5mK|LzrY=qM_Ln0=?&cIH*fLe|jq{s>63TE2dd zfjnHBzEtW2Ez+Bvfp+V&DzOsZhHrKm zZko(^ftuZu@$0Y74t%{hA1p~?;az4jv)4*Aj71F|l*ePwWu9ud1U*@r%3Z}q_*}pS zx^*1+$Ckrg=8wW+$?KZUh{O+>cc#Tkvhm75{Y$|d(c{vU zU0y=V>`zT8$(N3tr`Aiza~jsfiyS6B_+-G6;8SK zy3+(3i1l)Fk_;dD=>+pQ$O(p)`0vZ{us{|fcHUA=nCsJ}T&~MlPr@QJPD5U$-8zNi zp(ZSx@_>_m@tmpDA@m0%<(3wlx&qs~5e01jGm?Q~AXj8J>VHf=(qX(OG^z66?DS*o z4^K8EuXYyFr2l6p#v)gFF#X+fPjGPjz_Kyv<;H|8W7SImJ&)sF@PO4|@LSWtqb-D*zUrl_lEDzl!lixxw2^9T1DCqLy`Kt2hp9Hg zP0}66O;WeiBd&_Cfj%g*iH6Y&EaTgA9hwlD9Kl8MXtCDD5--h6_|?jD`80Ih2pQ24 zX4t7aE55`x4EdZtw`^V&-TXi8U3oav-5xJZmRF3WYt7PzWRPttyOeFvDl^uWF@|PB z41+Kw5?QX-G6)q?jD09Xk|o>N_a#mCEhaRU+@JS-?(64$p8My$e_el_=b7Jgme2W~ z&-s2o=X;KwZH3gzlLsB|Km2syTFBR;Q+c0HsnzOJIQ}63uli`ZK%~23XV+dMvizEX zm*jn}_TTpJ>QnOXdt|iO7kGyMC4kY{{q*etWIuo8=rUad@$Bb}k}xB}$6cikT%y^n9(Vsf@!Rwk!{_qA3NxK7feOW9fu&W2xKhjCdg2{rpDKgBD;y*Oy4zh#f)B33%u=P zckpQ&%Zg6!9pQmTiKY6!qCt`w;%a2XxRdR7CEn`n;gYv~)ocXgi5x35o-Pnl%N^Ln ze__7GzQ~B+p%C-twV?4#d6!XsA7nDM`B)2qi`%An0-HblE(yUFvegw{^9~pYNmCgTl=T)`VxgXG-?NBlo@<5_tZXf)s`)~ImqlQnJ z2>>Hpg5lKSD>u{C)39HJv9CwuujRWuAv}!oKGUjg$6a&%^Mh;Gr5~aBUpzdLl$g8v zAg;je{26%8D*NbRd#wc&<3{25fYV&NkAUZb^DnwNZY6yEv`p|>?{AIZ@C~7B6Gyfa`rg7p=V;Yo%Gh##JqkFRz(_EzH5;+UE%IznzJx`UaR_SN{7nD)3j|F>pzfY zfS*_K7r)30NoulFYV{@ysN_ZkAqlfQ_E_~i&n)-ytHJdaHdO7&oDuxtSTCMw6@Ik*`E z18B6ypb!-t)3-b>PV|_WaVsh`@V>dv?VDrCkCkP?KvNaID2KZk_j5S?1Q93njRB3V zdhX?}RP%^qdTfoX{?H=E_*RvdF6)JK;&C9CE(SG76`{G4%`v4D?44EfAt6|IagX zGn-Z9#{vg?-AtX)D`7R8tl?u;hpfCIO@h=30g2`k(@aj3PYYn|76V=$GirT>o|W$I z9wwF2maBDa#|0$5=l-%pl$Lr^dm~fp+&cA-@-62i7*h4KYRrM_cE-T<%7UBB%Ui;X zj#Q8Hn9#(o0=&l0>YBs=$KRE9732PS;XlN(blCZJ;lo;X9)0&)XzJmid=EUSA zyP^_QNKFlp^U5Y=7W68U6zKRn>}o|#7pk=&a7i-N&!OsT&cgJ2#EW~13h~_CH?R~M z&Y%PTn5ah$a#WdiSa)Tp_ps6v2)U_04YS)#Z79nAG z7e}-IY#IffDR28Qt_KJZ+q_MftaRibk@f})jzES*WI%|ytdL_~QH`n{0}`XPtS+$b(DxqF10KcvkNW#f z%AS(FZge-ip_(+Z(PJn2?KQ4=ztwU?mc@N8C5k{Z47_a@uz4816MnIxdlT&#H%y(a zDK#+MuR9jVuww}4GhBEgoK{Jk4IZ;fUOpLL>^qY(T;e6AK6oE)M;FPSw;!zh98qw@ z{vOT`gY}F|c(vM$LQ)A>rv2cOwP+Z|7}~=Ib6!40~ zfGUilOF^-K@HI`YgJVtKIH_h zq11vdGRxF|k}_uYVccr7<*S;5sZ|Av(TrI9q6w!g@9*di@=@rm7%nVFSTF`R5ZJ70 z7>4Ks>%DJst1&U4xrCXXj_drR9lH(-EvrA9VcM4wMwT90EI8XLYF|l?@u1YI_A){a zY9HQ1(gUOtdC0YCuw10GpEnP>pv$YE)S|YTcCe&8wQB;VAVmAUTLZX&b#Yrvd^BoI z0eMM0nWtG+bVnd;CTzNn6|t_An0$=t9MF?Faw=D``sM!jaO=To&jl;-VmFR>?f4W_ z|M3?@g0>^oT9MX1uUS$N^%cJk1hX`xhNJS(y@C8Cy!c|naloi6oTemsn|qXUs7fo@ z8ADzfMVkCYRRja$velqatIhfQjnzQh^yoMcNbhzo_K=<&{o?l)K6*GFgDtFbODOhX zZEdjhJ}v6o(y*UlU@~*BO36Y{faSu6WnRW5I1M(j=Anom>qKedZPga-%kXCt-%>|o zsTy(+YnGgd_)1oW98S%$Wm7D#loFO6Txfy$?x*NqRHP*#$DbXo0zhNA4b7Oz+%9Mw zS>}WN_{9dxN541O|Ps+sO9#=#-0L!9;GVx@9)~$ z@ir*6cyal=X}<3b0zSAvtR<93JQ)|fTNVA}Su=*th5+$G&0%2hhgyoj z$pWM&Knewf$#<-PG+nH2&AiiaU{#LE!_LRP7R~fg1TKYVJVej-A<)V(&{)pyiD8MU zWUKJgkb>i1)~>dC4*B$T$Kl@HnQqBI6wd+odwJ?500P*^Pm|hVUVsTCO<2hK5AryK zk=&1N@(9J~w2s)=L5DdlGFFF{<~Q4tJsO=fdX}mtjLu04vXD1mla1ttZ|${)Xins+ z;hY=bQq?~Nm>pj(13qKjPIdTTsHbcvz`P+lpbw9VLNXv%YIs|3zpX0oRVN zU3=T`T6hm{z?qreO z({HZTpGea}F%7B2(PBk=q{oxTT& z0P50`e(K9YWpmX_rl+9dYtq_2Z5h zjrB0G9dIO#?EMDxi1*i5ZYS(?EI$SoZM0d}g`D_L)IdK>nP#?&jd3LZ(^YrNZ z)O}!UlsQ7Gs_OJ7!E!8epQ#s{;BZen^nD#@rHu72*EqI4p^%&;O!*Um1 zoh0ra-&Rpj6&#X^34n;-?)#G*!12Q9uU~j1c{a4kiQ@9&nGbHW1Nd*B2m>43zgLOQ zBFAKKZ0h74?79v=La;Kfh<(Q{6#4e9`zOY5WWXdu&44kFCJB0jQrIp+SjZ43oWP}0 z_V3u8*QUNj=|}-*G`8Z2X>T+DE@;`O{|00xGBzx_B$NT)hUBfA9#i4}O#Vv@A}t-^ z+1Nt4xW62N#!73R0t`|*NSy*=qrk@j_q~M80*luVPb-1rgnFHTtrBzq-&Z*xgfQo} z0p$9Mi4~6KxPLn{vR0-bL}erPm$SzUX)sZjrvPj?E(Ib M&YS7y=-EH`7j~=PA^-pY diff --git a/docs/images/onchain_architecture.png b/docs/images/onchain_architecture.png deleted file mode 100644 index 91492938c961427eb576ead2db3558450b8cbb07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885367 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