From 95d20008f461b2a654a6e64ddf780f1a93394f51 Mon Sep 17 00:00:00 2001 From: Michael M Date: Mon, 13 Jan 2025 17:57:48 +0200 Subject: [PATCH] adding 4626 --- .github/workflows/certora-GSM-4626.yml | 71 ++ .github/workflows/certora-gho-505.yml | 10 +- .github/workflows/certora-gho.yml | 10 +- .github/workflows/certora-gsm.yml | 46 +- .github/workflows/certora-steward.yml | 10 +- .../non-4626/otakar-getAmount_properties.conf | 40 - .../GSM/mutations/mutants/Gsm/Gsm.sol0.sol | 558 ------------- .../GSM/mutations/mutants/Gsm/Gsm.sol1.sol | 561 ------------- .../GSM/mutations/mutants/Gsm/Gsm.sol2.sol | 561 ------------- .../GSM/mutations/mutants/Gsm/Gsm.sol3.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm0.sol | 558 ------------- certora/GSM/mutations/mutants/Gsm/Gsm1.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm2.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm3.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm4.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm5.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm6.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm7.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M1.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M10.sol | 560 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M11.sol | 560 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M2.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M3.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M4.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M5.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M6.sol | 561 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M7.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M8.sol | 562 ------------- certora/GSM/mutations/mutants/Gsm/Gsm_M9.sol | 560 ------------- .../feeStrategy/FixedFeeStrategy.sol14.sol | 71 -- .../feeStrategy/FixedFeeStrategy.sol16.sol | 75 -- .../feeStrategy/FixedFeeStrategy.sol17.sol | 75 -- .../feeStrategy/FixedFeeStrategy.sol9.sol | 75 -- .../mutants/feeStrategy/FixedFeeStrategy1.sol | 75 -- .../mutants/feeStrategy/FixedFeeStrategy2.sol | 71 -- .../mutants/feeStrategy/FixedFeeStrategy3.sol | 75 -- .../mutants/feeStrategy/FixedFeeStrategy4.sol | 75 -- .../FixedPriceStrategy.sol10.sol | 64 -- .../FixedPriceStrategy.sol12.sol | 64 -- .../priceStrategy/FixedPriceStrategy.sol7.sol | 60 -- .../priceStrategy/FixedPriceStrategy.sol9.sol | 64 -- .../priceStrategy/FixedPriceStrategy1.sol | 60 -- .../priceStrategy/FixedPriceStrategy2.sol | 64 -- .../priceStrategy/FixedPriceStrategy3.sol | 64 -- .../priceStrategy/FixedPriceStrategy4.sol | 64 -- .../priceStrategy/FixedPriceStrategy5.sol | 64 -- .../priceStrategy/FixedPriceStrategy6.sol | 64 -- .../priceStrategy/FixedPriceStrategy7.sol | 64 -- certora/gho/specs/summarizations.spec | 2 +- .../conf/gsm/FixedFeeStrategy.conf} | 4 +- .../conf/gsm/OracleSwapFreezer.conf} | 4 +- .../conf/gsm}/balances-buy.conf | 14 +- .../conf/gsm}/balances-sell.conf | 14 +- .../non-4626 => gsm/conf/gsm}/fees-buy.conf | 14 +- .../non-4626 => gsm/conf/gsm}/fees-sell.conf | 15 +- .../conf/gsm/finishedRules.conf} | 14 +- .../gsm/conf/gsm/getAmount_properties.conf | 37 + .../gsm/gho-assetToGhoInvertibility.conf} | 16 +- .../conf/gsm/gho-fixedPriceStrategy.conf} | 6 +- .../conf/gsm/gho-gsm-2.conf} | 16 +- .../conf/gsm/gho-gsm.conf} | 16 +- .../conf/gsm/gho-gsm_inverse.conf} | 16 +- .../conf/gsm/optimality.conf} | 14 +- .../gsm/conf/gsm4626/balances-buy-4626.conf | 37 + .../gsm/conf/gsm4626/balances-sell-4626.conf | 38 + certora/gsm/conf/gsm4626/fees-buy-4626.conf | 37 + certora/gsm/conf/gsm4626/fees-sell-4626.conf | 36 + .../gsm/conf/gsm4626/finishedRules4626.conf | 40 + .../gsm4626/getAmount_4626_properties.conf | 38 + .../gho-assetToGhoInvertibility4626.conf | 38 + .../gsm4626/gho-fixedPriceStrategy4626.conf | 27 + certora/gsm/conf/gsm4626/gho-gsm4626-2.conf | 40 + certora/gsm/conf/gsm4626/gho-gsm4626.conf | 38 + .../conf/gsm4626/gho-gsm_4626_inverse.conf | 37 + certora/gsm/conf/gsm4626/optimality4626.conf | 37 + certora/{GSM => gsm}/harness/DiffHelper.sol | 0 certora/{GSM => gsm}/harness/DummyERC20A.sol | 0 certora/{GSM => gsm}/harness/DummyERC20B.sol | 0 .../{GSM => gsm}/harness/DummyERC20Impl.sol | 0 certora/{GSM => gsm}/harness/ERC20Helper.sol | 0 .../harness/FixedFeeStrategyHarness.sol | 0 .../harness/FixedPriceStrategy4626Harness.sol | 19 + .../harness/FixedPriceStrategyHarness.sol | 0 certora/gsm/harness/Gsm4626Harness.sol | 122 +++ certora/{GSM => gsm}/harness/GsmHarness.sol | 0 .../harness/OracleSwapFreezerHarness.sol | 0 certora/{GSM => gsm}/munged/.gitignore | 0 .../specs/GsmMethods/aave_fee_limits.spec | 0 .../GsmMethods/aave_price_fee_limits.spec | 0 .../aave_price_fee_limits_strict.spec | 0 .../specs/GsmMethods/aave_price_limits.spec | 0 .../{GSM => gsm}/specs/GsmMethods/erc20.spec | 0 certora/gsm/specs/GsmMethods/erc4626.spec | 13 + .../specs/GsmMethods/methods4626_base.spec | 80 ++ .../specs/GsmMethods/methods_base-Martin.spec | 1 - .../specs/GsmMethods/methods_base.spec | 1 - .../GsmMethods/methods_divint_summary.spec | 0 .../specs/GsmMethods/shared.spec} | 0 .../specs/gsm/AssetToGhoInvertibility.spec} | 0 .../specs/gsm/FixedFeeStrategy.spec} | 0 .../specs/gsm/FixedPriceStrategy.spec} | 0 .../specs/gsm/OracleSwapFreezer.spec} | 0 .../{GSM => gsm}/specs/gsm/balances-buy.spec | 0 .../{GSM => gsm}/specs/gsm/balances-sell.spec | 0 certora/{GSM => gsm}/specs/gsm/fees-buy.spec | 0 certora/{GSM => gsm}/specs/gsm/fees-sell.spec | 0 .../specs/gsm/getAmount_properties.spec} | 0 .../specs/gsm/gho-gsm-2.spec} | 2 +- .../{GSM => gsm}/specs/gsm/gho-gsm-Buy.spec | 0 .../specs/gsm/gho-gsm-finishedRules.spec} | 2 +- .../specs/gsm/gho-gsm.spec} | 0 .../specs/gsm/gho-gsm_inverse.spec} | 0 .../specs/gsm/optimality.spec} | 0 .../gsm4626/AssetToGhoInvertibility4626.spec | 322 ++++++++ .../specs/gsm4626/FixedPriceStrategy4626.spec | 99 +++ .../gsm/specs/gsm4626/balances-buy-4626.spec | 241 ++++++ .../gsm/specs/gsm4626/balances-sell-4626.spec | 193 +++++ certora/gsm/specs/gsm4626/fees-buy-4626.spec | 216 +++++ certora/gsm/specs/gsm4626/fees-sell-4626.spec | 268 ++++++ .../gsm4626/getAmount_4626_properties.spec | 454 +++++++++++ .../gsm4626/gho-gsm-finishedRules4626.spec | 537 ++++++++++++ certora/gsm/specs/gsm4626/gho-gsm4626-2.spec | 193 +++++ certora/gsm/specs/gsm4626/gho-gsm4626.spec | 184 +++++ .../specs/gsm4626/gho-gsm_4626_inverse.spec | 742 +++++++++++++++++ certora/gsm/specs/gsm4626/optimality4626.spec | 252 ++++++ ...ication_Report_of_GHO_Stability_Module.pdf | Bin 1052915 -> 873699 bytes src/test/TestGhoSteward.t.sol | 415 ++++++++++ src/test/TestGhoStewardV2.t.sol | 767 ++++++++++++++++++ 128 files changed, 5788 insertions(+), 14356 deletions(-) create mode 100644 .github/workflows/certora-GSM-4626.yml delete mode 100644 certora/GSM/conf/non-4626/otakar-getAmount_properties.conf delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm.sol0.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm.sol1.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm.sol2.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm.sol3.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm0.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm1.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm2.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm3.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm4.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm5.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm6.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm7.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M1.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M10.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M11.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M2.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M3.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M4.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M5.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M6.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M7.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M8.sol delete mode 100644 certora/GSM/mutations/mutants/Gsm/Gsm_M9.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol14.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol16.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol17.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol9.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy1.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy2.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy3.sol delete mode 100644 certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy4.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol10.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol12.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol7.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol9.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy1.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy2.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy3.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy4.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy5.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy6.sol delete mode 100644 certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy7.sol rename certora/{GSM/conf/non-4626/otakar-FixedFeeStrategy.conf => gsm/conf/gsm/FixedFeeStrategy.conf} (80%) rename certora/{GSM/conf/non-4626/otakar-OracleSwapFreezer.conf => gsm/conf/gsm/OracleSwapFreezer.conf} (82%) rename certora/{GSM/conf/non-4626 => gsm/conf/gsm}/balances-buy.conf (68%) rename certora/{GSM/conf/non-4626 => gsm/conf/gsm}/balances-sell.conf (68%) rename certora/{GSM/conf/non-4626 => gsm/conf/gsm}/fees-buy.conf (72%) rename certora/{GSM/conf/non-4626 => gsm/conf/gsm}/fees-sell.conf (69%) rename certora/{GSM/conf/non-4626/otakar-finishedRules.conf => gsm/conf/gsm/finishedRules.conf} (68%) create mode 100644 certora/gsm/conf/gsm/getAmount_properties.conf rename certora/{GSM/conf/non-4626/Dominik-gho-assetToGhoInvertibility.conf => gsm/conf/gsm/gho-assetToGhoInvertibility.conf} (64%) rename certora/{GSM/conf/non-4626/Dominik-gho-fixedPriceStrategy.conf => gsm/conf/gsm/gho-fixedPriceStrategy.conf} (73%) rename certora/{GSM/conf/non-4626/Martin-gho-gsm.conf => gsm/conf/gsm/gho-gsm-2.conf} (68%) rename certora/{GSM/conf/non-4626/Alex-gho-gsm.conf => gsm/conf/gsm/gho-gsm.conf} (67%) rename certora/{GSM/conf/non-4626/Alex-gho-gsm_inverse.conf => gsm/conf/gsm/gho-gsm_inverse.conf} (65%) rename certora/{GSM/conf/non-4626/antti-optimality.conf => gsm/conf/gsm/optimality.conf} (69%) create mode 100644 certora/gsm/conf/gsm4626/balances-buy-4626.conf create mode 100644 certora/gsm/conf/gsm4626/balances-sell-4626.conf create mode 100644 certora/gsm/conf/gsm4626/fees-buy-4626.conf create mode 100644 certora/gsm/conf/gsm4626/fees-sell-4626.conf create mode 100644 certora/gsm/conf/gsm4626/finishedRules4626.conf create mode 100644 certora/gsm/conf/gsm4626/getAmount_4626_properties.conf create mode 100644 certora/gsm/conf/gsm4626/gho-assetToGhoInvertibility4626.conf create mode 100644 certora/gsm/conf/gsm4626/gho-fixedPriceStrategy4626.conf create mode 100644 certora/gsm/conf/gsm4626/gho-gsm4626-2.conf create mode 100644 certora/gsm/conf/gsm4626/gho-gsm4626.conf create mode 100644 certora/gsm/conf/gsm4626/gho-gsm_4626_inverse.conf create mode 100644 certora/gsm/conf/gsm4626/optimality4626.conf rename certora/{GSM => gsm}/harness/DiffHelper.sol (100%) rename certora/{GSM => gsm}/harness/DummyERC20A.sol (100%) rename certora/{GSM => gsm}/harness/DummyERC20B.sol (100%) rename certora/{GSM => gsm}/harness/DummyERC20Impl.sol (100%) rename certora/{GSM => gsm}/harness/ERC20Helper.sol (100%) rename certora/{GSM => gsm}/harness/FixedFeeStrategyHarness.sol (100%) create mode 100644 certora/gsm/harness/FixedPriceStrategy4626Harness.sol rename certora/{GSM => gsm}/harness/FixedPriceStrategyHarness.sol (100%) create mode 100644 certora/gsm/harness/Gsm4626Harness.sol rename certora/{GSM => gsm}/harness/GsmHarness.sol (100%) rename certora/{GSM => gsm}/harness/OracleSwapFreezerHarness.sol (100%) rename certora/{GSM => gsm}/munged/.gitignore (100%) rename certora/{GSM => gsm}/specs/GsmMethods/aave_fee_limits.spec (100%) rename certora/{GSM => gsm}/specs/GsmMethods/aave_price_fee_limits.spec (100%) rename certora/{GSM => gsm}/specs/GsmMethods/aave_price_fee_limits_strict.spec (100%) rename certora/{GSM => gsm}/specs/GsmMethods/aave_price_limits.spec (100%) rename certora/{GSM => gsm}/specs/GsmMethods/erc20.spec (100%) create mode 100644 certora/gsm/specs/GsmMethods/erc4626.spec create mode 100644 certora/gsm/specs/GsmMethods/methods4626_base.spec rename certora/{GSM => gsm}/specs/GsmMethods/methods_base-Martin.spec (98%) rename certora/{GSM => gsm}/specs/GsmMethods/methods_base.spec (98%) rename certora/{GSM => gsm}/specs/GsmMethods/methods_divint_summary.spec (100%) rename certora/{GSM/specs/gsm/Martin-shared.spec => gsm/specs/GsmMethods/shared.spec} (100%) rename certora/{GSM/specs/gsm/Dominik-AssetToGhoInvertibility.spec => gsm/specs/gsm/AssetToGhoInvertibility.spec} (100%) rename certora/{GSM/specs/gsm/otakar-FixedFeeStrategy.spec => gsm/specs/gsm/FixedFeeStrategy.spec} (100%) rename certora/{GSM/specs/gsm/Dominik-FixedPriceStrategy.spec => gsm/specs/gsm/FixedPriceStrategy.spec} (100%) rename certora/{GSM/specs/gsm/otakar-OracleSwapFreezer.spec => gsm/specs/gsm/OracleSwapFreezer.spec} (100%) rename certora/{GSM => gsm}/specs/gsm/balances-buy.spec (100%) rename certora/{GSM => gsm}/specs/gsm/balances-sell.spec (100%) rename certora/{GSM => gsm}/specs/gsm/fees-buy.spec (100%) rename certora/{GSM => gsm}/specs/gsm/fees-sell.spec (100%) rename certora/{GSM/specs/gsm/otakar-getAmount_properties.spec => gsm/specs/gsm/getAmount_properties.spec} (100%) rename certora/{GSM/specs/gsm/Martin-gho-gsm.spec => gsm/specs/gsm/gho-gsm-2.spec} (99%) rename certora/{GSM => gsm}/specs/gsm/gho-gsm-Buy.spec (100%) rename certora/{GSM/specs/gsm/otakar-gho-gsm-finishedRules.spec => gsm/specs/gsm/gho-gsm-finishedRules.spec} (99%) rename certora/{GSM/specs/gsm/Alex-gho-gsm.spec => gsm/specs/gsm/gho-gsm.spec} (100%) rename certora/{GSM/specs/gsm/Alex-gho-gsm_inverse.spec => gsm/specs/gsm/gho-gsm_inverse.spec} (100%) rename certora/{GSM/specs/gsm/optimality_antti.spec => gsm/specs/gsm/optimality.spec} (100%) create mode 100644 certora/gsm/specs/gsm4626/AssetToGhoInvertibility4626.spec create mode 100644 certora/gsm/specs/gsm4626/FixedPriceStrategy4626.spec create mode 100644 certora/gsm/specs/gsm4626/balances-buy-4626.spec create mode 100644 certora/gsm/specs/gsm4626/balances-sell-4626.spec create mode 100644 certora/gsm/specs/gsm4626/fees-buy-4626.spec create mode 100644 certora/gsm/specs/gsm4626/fees-sell-4626.spec create mode 100644 certora/gsm/specs/gsm4626/getAmount_4626_properties.spec create mode 100644 certora/gsm/specs/gsm4626/gho-gsm-finishedRules4626.spec create mode 100644 certora/gsm/specs/gsm4626/gho-gsm4626-2.spec create mode 100644 certora/gsm/specs/gsm4626/gho-gsm4626.spec create mode 100644 certora/gsm/specs/gsm4626/gho-gsm_4626_inverse.spec create mode 100644 certora/gsm/specs/gsm4626/optimality4626.spec create mode 100644 src/test/TestGhoSteward.t.sol create mode 100644 src/test/TestGhoStewardV2.t.sol diff --git a/.github/workflows/certora-GSM-4626.yml b/.github/workflows/certora-GSM-4626.yml new file mode 100644 index 00000000..3d891b67 --- /dev/null +++ b/.github/workflows/certora-GSM-4626.yml @@ -0,0 +1,71 @@ +name: certora-GSM-4626 + +on: + push: + branches: + - main + pull_request: + branches: + - main + + workflow_dispatch: + +jobs: + verify: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install python + uses: actions/setup-python@v5 + with: { python-version: 3.9 } + + - name: Install java + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } + + - name: Install certora cli + run: pip install certora-cli==7.14.2 + + - name: Install solc + run: | + wget https://github.com/ethereum/solidity/releases/download/v0.8.10/solc-static-linux + chmod +x solc-static-linux + sudo mv solc-static-linux /usr/local/bin/solc8.10 + + - name: Verify rule ${{ matrix.rule }} + run: | + certoraRun certora/gsm/conf/gsm4626/${{ matrix.rule }} + env: + CERTORAKEY: ${{ secrets.CERTORAKEY }} + + strategy: + fail-fast: false + max-parallel: 16 + matrix: + rule: + - gho-gsm_4626_inverse.conf --rule buySellInverse27 buySellInverse26 buySellInverse25 buySellInverse24 buySellInverse23 buySellInverse22 buySellInverse21 buySellInverse20 buySellInverse19 + - gho-gsm4626.conf --rule enoughULtoBackGhoNonBuySell NonZeroFeeCheckSellAsset NonZeroFeeCheckBuyAsset + - balances-buy-4626.conf + - balances-sell-4626.conf --rule R1_getAssetAmountForSellAsset_arg_vs_return R1a_buyGhoUpdatesGhoBalanceCorrectly1 R2_getAssetAmountForSellAsset_sellAsset_eq R3a_sellAssetUpdatesAssetBalanceCorrectly R4_buyGhoUpdatesGhoBalanceCorrectly R4a_buyGhoAmountGtGhoBalanceChange + - fees-buy-4626.conf + - fees-sell-4626.conf --rule R3a_estimatedSellFeeCanBeLowerThanActualSellFee R2_getAssetAmountForSellAssetVsActualSellFee R4a_getSellFeeVsgetAssetAmountForSellAsset R4_getSellFeeVsgetAssetAmountForSellAsset R1a_getAssetAmountForSellAssetFeeNeGetSellFee R2a_getAssetAmountForSellAssetNeActualSellFee R4b_getSellFeeVsgetAssetAmountForSellAsset R1_getAssetAmountForSellAssetFeeGeGetSellFee R3b_estimatedSellFeeEqActualSellFee + - gho-gsm4626-2.conf --rule accruedFeesLEGhoBalanceOfThis accruedFeesNeverDecrease systemBalanceStabilitySell systemBalanceStabilitySell + - optimality4626.conf --rule R5a_externalOptimalityOfSellAsset R6a_externalOptimalityOfBuyAsset + - optimality4626.conf --rule R1_optimalityOfBuyAsset_v1 + - optimality4626.conf --rule R3_optimalityOfSellAsset_v1 + - getAmount_4626_properties.conf --rule getAssetAmountForBuyAsset_correctness_bound1 getAssetAmountForBuyAsset_correctness_bound2 getGhoAmountForBuyAsset_correctness_bound1 getAssetAmountForSellAsset_correctness getAssetAmountForBuyAsset_optimality getAssetAmountForBuyAsset_correctness + - getAmount_4626_properties.conf --rule getGhoAmountForBuyAsset_optimality + - getAmount_4626_properties.conf --rule getGhoAmountForBuyAsset_correctness + - getAmount_4626_properties.conf --rule getAssetAmountForSellAsset_optimality getAssetAmountForBuyAsset_funcProperty + - finishedRules4626.conf --rule cantBuyOrSellWhenSeized cantBuyOrSellWhenFrozen sellAssetIncreasesExposure buyAssetDecreasesExposure rescuingAssetKeepsAccruedFees rescuingGhoKeepsAccruedFees giftingGhoDoesntAffectStorageSIMPLE correctnessOfBuyAsset giftingUnderlyingDoesntAffectStorageSIMPLE sellAssetSameAsGetGhoAmountForSellAsset correctnessOfSellAsset giftingGhoDoesntCreateExcessOrDearth backWithGhoDoesntCreateExcess getAssetAmountForSellAsset_correctness collectedSellFeeIsAtLeastAsRequired collectedBuyFeePlus2IsAtLeastAsRequired collectedBuyFeePlus1IsAtLeastAsRequired collectedBuyFeeIsAtLeastAsRequired sellingDoesntExceedExposureCap whoCanChangeAccruedFees whoCanChangeExposure + - finishedRules4626.conf --rule giftingUnderlyingDoesntCreateExcessOrDearth + + + + + diff --git a/.github/workflows/certora-gho-505.yml b/.github/workflows/certora-gho-505.yml index 0b86ebd6..bebf9208 100644 --- a/.github/workflows/certora-gho-505.yml +++ b/.github/workflows/certora-gho-505.yml @@ -15,17 +15,18 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive - name: Install python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install java - uses: actions/setup-java@v1 - with: { java-version: '11', java-package: jre } + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } - name: Install certora cli run: pip install certora-cli==5.0.5 @@ -42,7 +43,6 @@ jobs: touch applyHarness.patch make munged cd ../.. - echo "key length" ${#CERTORAKEY} certoraRun certora/gho/conf/${{ matrix.rule }} env: CERTORAKEY: ${{ secrets.CERTORAKEY }} diff --git a/.github/workflows/certora-gho.yml b/.github/workflows/certora-gho.yml index 87750d77..c546c621 100644 --- a/.github/workflows/certora-gho.yml +++ b/.github/workflows/certora-gho.yml @@ -15,17 +15,18 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive - name: Install python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install java - uses: actions/setup-java@v1 - with: { java-version: '11', java-package: jre } + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } - name: Install certora cli run: pip install certora-cli==4.13.1 @@ -42,7 +43,6 @@ jobs: touch applyHarness.patch make munged cd ../.. - echo "key length" ${#CERTORAKEY} certoraRun certora/gho/conf/${{ matrix.rule }} env: CERTORAKEY: ${{ secrets.CERTORAKEY }} diff --git a/.github/workflows/certora-gsm.yml b/.github/workflows/certora-gsm.yml index 85f061e4..463abfab 100644 --- a/.github/workflows/certora-gsm.yml +++ b/.github/workflows/certora-gsm.yml @@ -16,22 +16,17 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive - - name: Check key - env: - CERTORAKEY: ${{ secrets.CERTORAKEY }} - run: echo "key length" ${#CERTORAKEY} - - name: Install python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install java - uses: actions/setup-java@v1 - with: { java-version: '11', java-package: jre } + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } - name: Install certora cli run: pip install certora-cli==6.1.3 @@ -44,8 +39,7 @@ jobs: - name: Verify rule ${{ matrix.rule }} run: | - echo "key length" ${#CERTORAKEY} - certoraRun certora/GSM/conf/${{ matrix.rule }} + certoraRun certora/gsm/conf/gsm/${{ matrix.rule }} env: CERTORAKEY: ${{ secrets.CERTORAKEY }} @@ -54,18 +48,18 @@ jobs: max-parallel: 16 matrix: rule: - - non-4626/Alex-gho-gsm_inverse.conf - - non-4626/Alex-gho-gsm.conf - - non-4626/balances-buy.conf - - non-4626/balances-sell.conf - - non-4626/Dominik-gho-assetToGhoInvertibility.conf --rule basicProperty_getAssetAmountForBuyAsset sellAssetInverse_all buyAssetInverse_all basicProperty_getGhoAmountForSellAsset basicProperty_getAssetAmountForSellAsset basicProperty_getGhoAmountForBuyAsset - - non-4626/Dominik-gho-assetToGhoInvertibility.conf --rule basicProperty2_getAssetAmountForBuyAsset - - non-4626/Dominik-gho-fixedPriceStrategy.conf - - non-4626/fees-buy.conf - - non-4626/fees-sell.conf - - non-4626/otakar-FixedFeeStrategy.conf - - non-4626/Martin-gho-gsm.conf - - non-4626/antti-optimality.conf --rule R3_optimalityOfSellAsset_v1 R1_optimalityOfBuyAsset_v1 R6a_externalOptimalityOfBuyAsset R5a_externalOptimalityOfSellAsset R2_optimalityOfBuyAsset_v2 - - non-4626/otakar-getAmount_properties.conf --rule getAssetAmountForBuyAsset_funcProperty_LR getAssetAmountForBuyAsset_funcProperty_RL - - non-4626/otakar-finishedRules.conf --rule whoCanChangeExposure whoCanChangeAccruedFees sellingDoesntExceedExposureCap cantBuyOrSellWhenSeized giftingGhoDoesntAffectStorageSIMPLE giftingUnderlyingDoesntAffectStorageSIMPLE collectedBuyFeePlus1IsAtLeastAsRequired sellAssetSameAsGetGhoAmountForSellAsset collectedSellFeeIsAtLeastAsRequired collectedBuyFeeIsAtLeastAsRequired correctnessOfBuyAsset collectedBuyFeePlus2IsAtLeastAsRequired getAssetAmountForSellAsset_correctness cantBuyOrSellWhenFrozen whoCanChangeExposureCap cantSellIfExposureTooHigh sellAssetIncreasesExposure buyAssetDecreasesExposure rescuingGhoKeepsAccruedFees rescuingAssetKeepsAccruedFees - - non-4626/otakar-OracleSwapFreezer.conf + - gho-gsm_inverse.conf + - gho-gsm.conf + - balances-buy.conf + - balances-sell.conf + - gho-assetToGhoInvertibility.conf --rule basicProperty_getAssetAmountForBuyAsset sellAssetInverse_all buyAssetInverse_all basicProperty_getGhoAmountForSellAsset basicProperty_getAssetAmountForSellAsset basicProperty_getGhoAmountForBuyAsset + - gho-assetToGhoInvertibility.conf --rule basicProperty2_getAssetAmountForBuyAsset + - gho-fixedPriceStrategy.conf + - fees-buy.conf + - fees-sell.conf + - FixedFeeStrategy.conf + - gho-gsm.conf + - optimality.conf --rule R3_optimalityOfSellAsset_v1 R1_optimalityOfBuyAsset_v1 R6a_externalOptimalityOfBuyAsset R5a_externalOptimalityOfSellAsset R2_optimalityOfBuyAsset_v2 + - getAmount_properties.conf --rule getAssetAmountForBuyAsset_funcProperty_LR getAssetAmountForBuyAsset_funcProperty_RL + - finishedRules.conf --rule whoCanChangeExposure whoCanChangeAccruedFees sellingDoesntExceedExposureCap cantBuyOrSellWhenSeized giftingGhoDoesntAffectStorageSIMPLE giftingUnderlyingDoesntAffectStorageSIMPLE collectedBuyFeePlus1IsAtLeastAsRequired sellAssetSameAsGetGhoAmountForSellAsset collectedSellFeeIsAtLeastAsRequired collectedBuyFeeIsAtLeastAsRequired correctnessOfBuyAsset collectedBuyFeePlus2IsAtLeastAsRequired getAssetAmountForSellAsset_correctness cantBuyOrSellWhenFrozen whoCanChangeExposureCap cantSellIfExposureTooHigh sellAssetIncreasesExposure buyAssetDecreasesExposure rescuingGhoKeepsAccruedFees rescuingAssetKeepsAccruedFees + - OracleSwapFreezer.conf diff --git a/.github/workflows/certora-steward.yml b/.github/workflows/certora-steward.yml index 023144c7..b7bc01bf 100644 --- a/.github/workflows/certora-steward.yml +++ b/.github/workflows/certora-steward.yml @@ -15,17 +15,18 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive - name: Install python - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: { python-version: 3.9 } - name: Install java - uses: actions/setup-java@v1 - with: { java-version: '11', java-package: jre } + uses: actions/setup-java@v4 + with: { distribution: "zulu", java-version: "11", java-package: jre } - name: Install certora cli run: pip install certora-cli @@ -42,7 +43,6 @@ jobs: - name: Verify rule ${{ matrix.rule }} run: | - echo "key length" ${#CERTORAKEY} certoraRun certora/steward/conf/${{ matrix.rule }} env: CERTORAKEY: ${{ secrets.CERTORAKEY }} diff --git a/certora/GSM/conf/non-4626/otakar-getAmount_properties.conf b/certora/GSM/conf/non-4626/otakar-getAmount_properties.conf deleted file mode 100644 index 9d938d72..00000000 --- a/certora/GSM/conf/non-4626/otakar-getAmount_properties.conf +++ /dev/null @@ -1,40 +0,0 @@ -{ - "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/ERC20Helper.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "src/contracts/gho/GhoToken.sol", - ], - "link": [ - "GsmHarness:GHO_TOKEN=GhoToken", - "GsmHarness:PRICE_STRATEGY=FixedPriceStrategyHarness", - "GsmHarness:_feeStrategy=FixedFeeStrategyHarness", - ], - "packages": [ - "@aave/core-v3/=lib/aave-v3-core", - "@aave/periphery-v3/=lib/aave-v3-periphery", - "@aave/=lib/aave-token", - "@openzeppelin/=lib/openzeppelin-contracts", - ], - "assert_autofinder_success": true, - "optimistic_loop":true, - "loop_iter":"1", - "optimistic_hashing":true, - "rule_sanity" : "basic", - "hashing_length_bound":"416", - "solc": "solc8.10", - "multi_assert_check": true, - "msg": "GSM properties", - "prover_args": [ - "-copyLoopUnroll 6", - "-depth 20" - ], - "verify": "GsmHarness:certora/GSM/specs/gsm/otakar-getAmount_properties.spec", - "rule": [ - "getAssetAmountForBuyAsset_funcProperty_LR", - "getAssetAmountForBuyAsset_funcProperty_RL", - ], -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm.sol0.sol b/certora/GSM/mutations/mutants/Gsm/Gsm.sol0.sol deleted file mode 100644 index 6e67153f..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm.sol0.sol +++ /dev/null @@ -1,558 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - /// FunctionCallMutation of: require( - SignatureChecker.isValidSignatureNow(originator, digest, signature); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm.sol1.sol b/certora/GSM/mutations/mutants/Gsm/Gsm.sol1.sol deleted file mode 100644 index b64bc5cb..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm.sol1.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - /// RequireMutation of: require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - require(!(!_isFrozen), 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm.sol2.sol b/certora/GSM/mutations/mutants/Gsm/Gsm.sol2.sol deleted file mode 100644 index 37499cd6..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm.sol2.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - /// AssignmentMutation of: _currentExposure += uint128(assetAmount); - _currentExposure += 1; - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm.sol3.sol b/certora/GSM/mutations/mutants/Gsm/Gsm.sol3.sol deleted file mode 100644 index 6364170b..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm.sol3.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - /// SwapLinesMutation of: require(!_isSeized, 'GSM_SEIZED'); - _; - require(!_isSeized, 'GSM_SEIZED'); - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm0.sol b/certora/GSM/mutations/mutants/Gsm/Gsm0.sol deleted file mode 100644 index 6e67153f..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm0.sol +++ /dev/null @@ -1,558 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - /// FunctionCallMutation of: require( - SignatureChecker.isValidSignatureNow(originator, digest, signature); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm1.sol b/certora/GSM/mutations/mutants/Gsm/Gsm1.sol deleted file mode 100644 index f0739a91..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm1.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - /// RequireMutation of: require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(!(ghoToken != address(0)), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm2.sol b/certora/GSM/mutations/mutants/Gsm/Gsm2.sol deleted file mode 100644 index b64bc5cb..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm2.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - /// RequireMutation of: require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - require(!(!_isFrozen), 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm3.sol b/certora/GSM/mutations/mutants/Gsm/Gsm3.sol deleted file mode 100644 index dbf4aa90..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm3.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - /// FunctionCallMutation of: _grantRole(CONFIGURATOR_ROLE, admin); - admin; - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm4.sol b/certora/GSM/mutations/mutants/Gsm/Gsm4.sol deleted file mode 100644 index 37499cd6..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm4.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - /// AssignmentMutation of: _currentExposure += uint128(assetAmount); - _currentExposure += 1; - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm5.sol b/certora/GSM/mutations/mutants/Gsm/Gsm5.sol deleted file mode 100644 index 9b781aed..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm5.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - /// AssignmentMutation of: _accruedFees += fee.toUint128(); - _accruedFees += 1; - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm6.sol b/certora/GSM/mutations/mutants/Gsm/Gsm6.sol deleted file mode 100644 index 6364170b..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm6.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - /// SwapLinesMutation of: require(!_isSeized, 'GSM_SEIZED'); - _; - require(!_isSeized, 'GSM_SEIZED'); - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm7.sol b/certora/GSM/mutations/mutants/Gsm/Gsm7.sol deleted file mode 100644 index 6364170b..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm7.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - /// SwapLinesMutation of: require(!_isSeized, 'GSM_SEIZED'); - _; - require(!_isSeized, 'GSM_SEIZED'); - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M1.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M1.sol deleted file mode 100644 index 0553b407..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M1.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - // Mutation: rounding down instead of up - // uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M10.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M10.sol deleted file mode 100644 index 0890a020..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M10.sol +++ /dev/null @@ -1,560 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - // Mutation: not increasing the current exposure - // _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M11.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M11.sol deleted file mode 100644 index ce658a70..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M11.sol +++ /dev/null @@ -1,560 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M2.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M2.sol deleted file mode 100644 index e5f6a651..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M2.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - // Mutation: rounding up instead of down - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - // false - true - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M3.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M3.sol deleted file mode 100644 index 6a04af54..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M3.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - // Mutation: not setting aside the amount of accrued fee - // uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)); - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M4.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M4.sol deleted file mode 100644 index b80207e3..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M4.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - // Mutation: not setting aside the amount of current exposure - // uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)); - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M5.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M5.sol deleted file mode 100644 index 7657b3e8..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M5.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - // Mutation: sending to msg.sender instead of "to" - // IERC20(token).safeTransfer(to, amount); - IERC20(token).safeTransfer(msg.sender, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M6.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M6.sol deleted file mode 100644 index 92f129a4..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M6.sol +++ /dev/null @@ -1,561 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - // Mutation: not reducing accrued fee to 0 - // _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M7.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M7.sol deleted file mode 100644 index 81c1f160..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M7.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - // Mutation: rounding up instead of down - // uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M8.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M8.sol deleted file mode 100644 index 20521bf4..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M8.sol +++ /dev/null @@ -1,562 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - // Mutation: Rounding down instead of up - // uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - - _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/Gsm/Gsm_M9.sol b/certora/GSM/mutations/mutants/Gsm/Gsm_M9.sol deleted file mode 100644 index 4931e6d7..00000000 --- a/certora/GSM/mutations/mutants/Gsm/Gsm_M9.sol +++ /dev/null @@ -1,560 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {VersionedInitializable} from '@aave/core-v3/contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol'; -import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; -import {GPv2SafeERC20} from '@aave/core-v3/contracts/dependencies/gnosis/contracts/GPv2SafeERC20.sol'; -import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; -import {SignatureChecker} from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol'; -import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; -import {AccessControl} from '@openzeppelin/contracts/access/AccessControl.sol'; -import {IGhoFacilitator} from '../../gho/interfaces/IGhoFacilitator.sol'; -import {IGhoToken} from '../../gho/interfaces/IGhoToken.sol'; -import {IGsmPriceStrategy} from './priceStrategy/interfaces/IGsmPriceStrategy.sol'; -import {IGsmFeeStrategy} from './feeStrategy/interfaces/IGsmFeeStrategy.sol'; -import {IGsm} from './interfaces/IGsm.sol'; - -/** - * @title Gsm - * @author Aave - * @notice GHO Stability Module. It provides buy/sell facilities to go to/from an underlying asset to/from GHO. - * @dev To be covered by a proxy contract. - */ -contract Gsm is AccessControl, VersionedInitializable, EIP712, IGsm { - using GPv2SafeERC20 for IERC20; - using SafeCast for uint256; - - /// @inheritdoc IGsm - bytes32 public constant CONFIGURATOR_ROLE = keccak256('CONFIGURATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant TOKEN_RESCUER_ROLE = keccak256('TOKEN_RESCUER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant SWAP_FREEZER_ROLE = keccak256('SWAP_FREEZER_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant LIQUIDATOR_ROLE = keccak256('LIQUIDATOR_ROLE'); - - /// @inheritdoc IGsm - bytes32 public constant BUY_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'BuyAssetWithSig(address originator,uint256 minAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - bytes32 public constant SELL_ASSET_WITH_SIG_TYPEHASH = - keccak256( - 'SellAssetWithSig(address originator,uint256 maxAmount,address receiver,uint256 nonce,uint256 deadline)' - ); - - /// @inheritdoc IGsm - address public immutable GHO_TOKEN; - - /// @inheritdoc IGsm - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsm - address public immutable PRICE_STRATEGY; - - /// @inheritdoc IGsm - mapping(address => uint256) public nonces; - - address internal _ghoTreasury; - address internal _feeStrategy; - bool internal _isFrozen; - bool internal _isSeized; - uint128 internal _exposureCap; - uint128 internal _currentExposure; - uint128 internal _accruedFees; - - /** - * @dev Require GSM to not be frozen for functions marked by this modifier - */ - modifier notFrozen() { - require(!_isFrozen, 'GSM_FROZEN'); - _; - } - - /** - * @dev Require GSM to not be seized for functions marked by this modifier - */ - modifier notSeized() { - require(!_isSeized, 'GSM_SEIZED'); - _; - } - - /** - * @dev Constructor - * @param ghoToken The address of the GHO token contract - * @param underlyingAsset The address of the collateral asset - * @param priceStrategy The address of the price strategy - */ - constructor(address ghoToken, address underlyingAsset, address priceStrategy) EIP712('GSM', '1') { - require(ghoToken != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require(underlyingAsset != address(0), 'ZERO_ADDRESS_NOT_VALID'); - require( - IGsmPriceStrategy(priceStrategy).UNDERLYING_ASSET() == underlyingAsset, - 'INVALID_PRICE_STRATEGY' - ); - GHO_TOKEN = ghoToken; - UNDERLYING_ASSET = underlyingAsset; - PRICE_STRATEGY = priceStrategy; - } - - /** - * @notice GSM initializer - * @param admin The address of the default admin role - * @param ghoTreasury The address of the GHO treasury - * @param exposureCap Maximum amount of user-supplied underlying asset in GSM - */ - function initialize( - address admin, - address ghoTreasury, - uint128 exposureCap - ) external initializer { - require(admin != address(0), 'ZERO_ADDRESS_NOT_VALID'); - _grantRole(DEFAULT_ADMIN_ROLE, admin); - _grantRole(CONFIGURATOR_ROLE, admin); - _updateGhoTreasury(ghoTreasury); - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGsm - function buyAsset( - uint256 minAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _buyAsset(msg.sender, minAmount, receiver); - } - - /// @inheritdoc IGsm - function buyAssetWithSig( - address originator, - uint256 minAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - BUY_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, minAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _buyAsset(originator, minAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAsset( - uint256 maxAmount, - address receiver - ) external notFrozen notSeized returns (uint256, uint256) { - return _sellAsset(msg.sender, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function sellAssetWithSig( - address originator, - uint256 maxAmount, - address receiver, - uint256 deadline, - bytes calldata signature - ) external notFrozen notSeized returns (uint256, uint256) { - require(deadline >= block.timestamp, 'SIGNATURE_DEADLINE_EXPIRED'); - bytes32 digest = keccak256( - abi.encode( - '\x19\x01', - _domainSeparatorV4(), - SELL_ASSET_WITH_SIG_TYPEHASH, - abi.encode(originator, maxAmount, receiver, nonces[originator]++, deadline) - ) - ); - require( - SignatureChecker.isValidSignatureNow(originator, digest, signature), - 'SIGNATURE_INVALID' - ); - - return _sellAsset(originator, maxAmount, receiver); - } - - /// @inheritdoc IGsm - function rescueTokens( - address token, - address to, - uint256 amount - ) external onlyRole(TOKEN_RESCUER_ROLE) { - require(amount > 0, 'INVALID_AMOUNT'); - if (token == GHO_TOKEN) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _accruedFees; - require(rescuableBalance >= amount, 'INSUFFICIENT_GHO_TO_RESCUE'); - } - if (token == UNDERLYING_ASSET) { - uint256 rescuableBalance = IERC20(token).balanceOf(address(this)) - _currentExposure; - require(rescuableBalance >= amount, 'INSUFFICIENT_EXOGENOUS_ASSET_TO_RESCUE'); - } - IERC20(token).safeTransfer(to, amount); - emit TokensRescued(token, to, amount); - } - - /// @inheritdoc IGsm - function setSwapFreeze(bool enable) external onlyRole(SWAP_FREEZER_ROLE) { - if (enable) { - require(!_isFrozen, 'GSM_ALREADY_FROZEN'); - } else { - require(_isFrozen, 'GSM_ALREADY_UNFROZEN'); - } - _isFrozen = enable; - emit SwapFreeze(msg.sender, enable); - } - - /// @inheritdoc IGsm - function seize() external notSeized onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - _isSeized = true; - _currentExposure = 0; - _updateExposureCap(0); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - uint256 underlyingBalance = IERC20(UNDERLYING_ASSET).balanceOf(address(this)); - if (underlyingBalance > 0) { - IERC20(UNDERLYING_ASSET).safeTransfer(_ghoTreasury, underlyingBalance); - } - - emit Seized(msg.sender, _ghoTreasury, underlyingBalance, ghoMinted); - return underlyingBalance; - } - - /// @inheritdoc IGsm - function burnAfterSeize(uint256 amount) external onlyRole(LIQUIDATOR_ROLE) returns (uint256) { - require(_isSeized, 'GSM_NOT_SEIZED'); - require(amount > 0, 'INVALID_AMOUNT'); - - (, uint256 ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); - if (amount > ghoMinted) { - amount = ghoMinted; - } - IGhoToken(GHO_TOKEN).transferFrom(msg.sender, address(this), amount); - IGhoToken(GHO_TOKEN).burn(amount); - - emit BurnAfterSeize(msg.sender, amount, (ghoMinted - amount)); - return amount; - } - - /// @inheritdoc IGsm - function updateFeeStrategy(address feeStrategy) external onlyRole(CONFIGURATOR_ROLE) { - _updateFeeStrategy(feeStrategy); - } - - /// @inheritdoc IGsm - function updateExposureCap(uint128 exposureCap) external onlyRole(CONFIGURATOR_ROLE) { - _updateExposureCap(exposureCap); - } - - /// @inheritdoc IGhoFacilitator - function distributeFeesToTreasury() public virtual override { - uint256 accruedFees = _accruedFees; - if (accruedFees > 0) { - _accruedFees = 0; - IERC20(GHO_TOKEN).transfer(_ghoTreasury, accruedFees); - emit FeesDistributedToTreasury(_ghoTreasury, GHO_TOKEN, accruedFees); - } - } - - /// @inheritdoc IGhoFacilitator - function updateGhoTreasury(address newGhoTreasury) external override onlyRole(CONFIGURATOR_ROLE) { - _updateGhoTreasury(newGhoTreasury); - } - - /// @inheritdoc IGsm - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /// @inheritdoc IGsm - function getGhoAmountForBuyAsset( - uint256 minAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForBuyAsset(minAssetAmount); - } - - /// @inheritdoc IGsm - function getGhoAmountForSellAsset( - uint256 maxAssetAmount - ) external view returns (uint256, uint256, uint256, uint256) { - return _calculateGhoAmountForSellAsset(maxAssetAmount); - } - - /// @inheritdoc IGsm - function getAssetAmountForBuyAsset( - uint256 maxGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(maxGhoAmount) - : maxGhoAmount; - // round down so maxGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, false); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - true // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAssetAmountForSellAsset( - uint256 minGhoAmount - ) external view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - uint256 grossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(minGhoAmount) - : minGhoAmount; - // round up so minGhoAmount is guaranteed - uint256 assetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset(grossAmount, true); - uint256 finalGrossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho( - assetAmount, - false // TODO - ); - uint256 finalFee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(finalGrossAmount) : 0; - return (assetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /// @inheritdoc IGsm - function getAvailableUnderlyingExposure() external view returns (uint256) { - return _exposureCap > _currentExposure ? _exposureCap - _currentExposure : 0; - } - - /// @inheritdoc IGsm - function getAvailableLiquidity() external view returns (uint256) { - return _currentExposure; - } - - /// @inheritdoc IGsm - function getFeeStrategy() external view returns (address) { - return _feeStrategy; - } - - /// @inheritdoc IGsm - function getAccruedFees() external view returns (uint256) { - return _accruedFees; - } - - /// @inheritdoc IGsm - function getIsFrozen() external view returns (bool) { - return _isFrozen; - } - - /// @inheritdoc IGsm - function getIsSeized() external view returns (bool) { - return _isSeized; - } - - /// @inheritdoc IGsm - function canSwap() external view returns (bool) { - return !_isFrozen && !_isSeized; - } - - /// @inheritdoc IGhoFacilitator - function getGhoTreasury() external view override returns (address) { - return _ghoTreasury; - } - - /// @inheritdoc IGsm - function GSM_REVISION() public pure virtual override returns (uint256) { - return 1; - } - - /** - * @dev Buys an underlying asset with GHO - * @param originator The originator of the request - * @param minAmount The minimum amount of the underlying asset desired for purchase - * @param receiver The recipient address of the underlying asset being purchased - * @return The amount of underlying asset bought - * @return The amount of GHO sold by the user - */ - function _buyAsset( - address originator, - uint256 minAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoSold, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForBuyAsset(minAmount); - - _beforeBuyAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure >= assetAmount, 'INSUFFICIENT_AVAILABLE_EXOGENOUS_ASSET_LIQUIDITY'); - // Mutation: not reducing the current exposure - // _currentExposure -= uint128(assetAmount); - _accruedFees += fee.toUint128(); - IGhoToken(GHO_TOKEN).transferFrom(originator, address(this), ghoSold); - IGhoToken(GHO_TOKEN).burn(grossAmount); - IERC20(UNDERLYING_ASSET).safeTransfer(receiver, assetAmount); - - emit BuyAsset(originator, receiver, assetAmount, ghoSold, fee); - return (assetAmount, ghoSold); - } - - /** - * @dev Hook that is called before `buyAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired for purchase - * @param receiver Recipient address of the underlying asset being purchased - */ - function _beforeBuyAsset(address originator, uint256 amount, address receiver) internal virtual {} - - /** - * @dev Sells an underlying asset for GHO - * @param originator The originator of the request - * @param maxAmount The maximum amount of the underlying asset desired to sell - * @param receiver The recipient address of the GHO being purchased - * @return The amount of underlying asset sold - * @return The amount of GHO bought by the user - */ - function _sellAsset( - address originator, - uint256 maxAmount, - address receiver - ) internal returns (uint256, uint256) { - ( - uint256 assetAmount, - uint256 ghoBought, - uint256 grossAmount, - uint256 fee - ) = _calculateGhoAmountForSellAsset(maxAmount); - - _beforeSellAsset(originator, assetAmount, receiver); - - require(assetAmount > 0, 'INVALID_AMOUNT'); - require(_currentExposure + assetAmount <= _exposureCap, 'EXOGENOUS_ASSET_EXPOSURE_TOO_HIGH'); - - _currentExposure += uint128(assetAmount); - _accruedFees += fee.toUint128(); - IERC20(UNDERLYING_ASSET).safeTransferFrom(originator, address(this), assetAmount); - - IGhoToken(GHO_TOKEN).mint(address(this), grossAmount); - IGhoToken(GHO_TOKEN).transfer(receiver, ghoBought); - - emit SellAsset(originator, receiver, assetAmount, grossAmount, fee); - return (assetAmount, ghoBought); - } - - /** - * @dev Hook that is called before `sellAsset`. - * @dev This can be used to add custom logic - * @param originator Originator of the request - * @param amount The amount of the underlying asset desired to sell - * @param receiver Recipient address of the GHO being purchased - */ - function _beforeSellAsset( - address originator, - uint256 amount, - address receiver - ) internal virtual {} - - /** - * @dev Returns the amount of GHO sold in exchange of buying underlying asset - * @param assetAmount The amount of underlying asset to buy - * @return The exact amount of asset the user purchases - * @return The total amount of GHO the user sells (gross amount in GHO plus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied on top of gross amount of GHO - */ - function _calculateGhoAmountForBuyAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the highest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, true); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getBuyFee(grossAmount) : 0; - uint256 ghoSold = grossAmount + fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalBought(ghoSold) - : ghoSold; - // pick the lowest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - false - ); - uint256 finalFee = ghoSold - finalGrossAmount; - return (finalAssetAmount, finalGrossAmount + finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Returns the amount of GHO bought in exchange of a given amount of underlying asset - * @param assetAmount The amount of underlying asset to sell - * @return The exact amount of asset the user sells - * @return The total amount of GHO the user buys (gross amount in GHO minus fee) - * @return The gross amount of GHO - * @return The fee amount in GHO, applied to the gross amount of GHO - */ - function _calculateGhoAmountForSellAsset( - uint256 assetAmount - ) internal view returns (uint256, uint256, uint256, uint256) { - bool withFee = _feeStrategy != address(0); - // pick the lowest GHO amount possible for given asset amount - uint256 grossAmount = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(assetAmount, false); - uint256 fee = withFee ? IGsmFeeStrategy(_feeStrategy).getSellFee(grossAmount) : 0; - uint256 ghoBought = grossAmount - fee; - uint256 finalGrossAmount = withFee - ? IGsmFeeStrategy(_feeStrategy).getGrossAmountFromTotalSold(ghoBought) - : ghoBought; - // pick the highest asset amount possible for given GHO amount - uint256 finalAssetAmount = IGsmPriceStrategy(PRICE_STRATEGY).getGhoPriceInAsset( - finalGrossAmount, - true - ); - uint256 finalFee = finalGrossAmount - ghoBought; - return (finalAssetAmount, finalGrossAmount - finalFee, finalGrossAmount, finalFee); - } - - /** - * @dev Updates Fee Strategy - * @param feeStrategy The address of the new Fee Strategy - */ - function _updateFeeStrategy(address feeStrategy) internal { - address oldFeeStrategy = _feeStrategy; - _feeStrategy = feeStrategy; - emit FeeStrategyUpdated(oldFeeStrategy, feeStrategy); - } - - /** - * @dev Updates Exposure Cap - * @param exposureCap The value of the new Exposure Cap - */ - function _updateExposureCap(uint128 exposureCap) internal { - uint128 oldExposureCap = _exposureCap; - _exposureCap = exposureCap; - emit ExposureCapUpdated(oldExposureCap, exposureCap); - } - - /** - * @dev Updates GHO Treasury Address - * @param newGhoTreasury The address of the new GHO Treasury - */ - function _updateGhoTreasury(address newGhoTreasury) internal { - require(newGhoTreasury != address(0), 'ZERO_ADDRESS_NOT_VALID'); - address oldGhoTreasury = _ghoTreasury; - _ghoTreasury = newGhoTreasury; - emit GhoTreasuryUpdated(oldGhoTreasury, newGhoTreasury); - } - - /// @inheritdoc VersionedInitializable - function getRevision() internal pure virtual override returns (uint256) { - return GSM_REVISION(); - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol14.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol14.sol deleted file mode 100644 index 067cecc0..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol14.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - /// FunctionCallMutation of: totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR; - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR - _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol16.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol16.sol deleted file mode 100644 index 9c53839f..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol16.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - /// BinaryOpMutation of: PercentageMath.PERCENTAGE_FACTOR + _buyFee, - PercentageMath.PERCENTAGE_FACTOR / _buyFee, - Math.Rounding.Down - ); - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR - _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol17.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol17.sol deleted file mode 100644 index b20407e4..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol17.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - /// IfStatementMutation of: if (totalAmount == 0) { - if (!(totalAmount == 0)) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR + _buyFee, - Math.Rounding.Down - ); - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR - _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol9.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol9.sol deleted file mode 100644 index 4fcc248a..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy.sol9.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR + _buyFee, - Math.Rounding.Down - ); - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - /// BinaryOpMutation of: PercentageMath.PERCENTAGE_FACTOR - _sellFee, - PercentageMath.PERCENTAGE_FACTOR + _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy1.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy1.sol deleted file mode 100644 index 4fcc248a..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy1.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR + _buyFee, - Math.Rounding.Down - ); - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - /// BinaryOpMutation of: PercentageMath.PERCENTAGE_FACTOR - _sellFee, - PercentageMath.PERCENTAGE_FACTOR + _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy2.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy2.sol deleted file mode 100644 index 067cecc0..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy2.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - /// FunctionCallMutation of: totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR; - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR - _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy3.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy3.sol deleted file mode 100644 index 9c53839f..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy3.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - /// BinaryOpMutation of: PercentageMath.PERCENTAGE_FACTOR + _buyFee, - PercentageMath.PERCENTAGE_FACTOR / _buyFee, - Math.Rounding.Down - ); - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR - _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy4.sol b/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy4.sol deleted file mode 100644 index b20407e4..00000000 --- a/certora/GSM/mutations/mutants/feeStrategy/FixedFeeStrategy4.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {PercentageMath} from '@aave/core-v3/contracts/protocol/libraries/math/PercentageMath.sol'; -import {IGsmFeeStrategy} from './interfaces/IGsmFeeStrategy.sol'; - -/** - * @title FixedFeeStrategy - * @author Aave - * @notice Fee strategy using a fixed rate to calculate buy/sell fees - */ -contract FixedFeeStrategy is IGsmFeeStrategy { - using Math for uint256; - - uint256 internal immutable _buyFee; - uint256 internal immutable _sellFee; - - /** - * @dev Constructor - * @dev Fees must be lower than 5000 bps (e.g. 50.00%) - * @param buyFee The fee paid when buying the underlying asset in exchange for GHO, expressed in bps - * @param sellFee The fee paid when selling the underlying asset in exchange for GHO, expressed in bps - */ - constructor(uint256 buyFee, uint256 sellFee) { - require(buyFee < 5000, 'INVALID_BUY_FEE'); - require(sellFee < 5000, 'INVALID_SELL_FEE'); - require(buyFee > 0 || sellFee > 0, 'MUST_HAVE_ONE_NONZERO_FEE'); - _buyFee = buyFee; - _sellFee = sellFee; - } - - /// @inheritdoc IGsmFeeStrategy - function getBuyFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_buyFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getSellFee(uint256 grossAmount) external view returns (uint256) { - return grossAmount.mulDiv(_sellFee, PercentageMath.PERCENTAGE_FACTOR, Math.Rounding.Up); - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalBought(uint256 totalAmount) external view returns (uint256) { - /// IfStatementMutation of: if (totalAmount == 0) { - if (!(totalAmount == 0)) { - return 0; - } else if (_buyFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR + _buyFee, - Math.Rounding.Down - ); - } - } - - /// @inheritdoc IGsmFeeStrategy - function getGrossAmountFromTotalSold(uint256 totalAmount) external view returns (uint256) { - if (totalAmount == 0) { - return 0; - } else if (_sellFee == 0) { - return totalAmount; - } else { - return - totalAmount.mulDiv( - PercentageMath.PERCENTAGE_FACTOR, - PercentageMath.PERCENTAGE_FACTOR - _sellFee, - Math.Rounding.Up - ); - } - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol10.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol10.sol deleted file mode 100644 index 30cc05a4..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol10.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - /// AssignmentMutation of: UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - UNDERLYING_ASSET_DECIMALS = 1; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol12.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol12.sol deleted file mode 100644 index 7d568002..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol12.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - /// FunctionCallMutation of: require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - 'INVALID_PRICE_RATIO'; - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol7.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol7.sol deleted file mode 100644 index 3c3a75a7..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol7.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - /// FunctionCallMutation of: ghoAmount.mulDiv( - _underlyingAssetUnits; - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol9.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol9.sol deleted file mode 100644 index 73a72d61..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy.sol9.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - /// BinaryOpMutation of: _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - _underlyingAssetUnits = 10 % underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy1.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy1.sol deleted file mode 100644 index 3c3a75a7..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy1.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - /// FunctionCallMutation of: ghoAmount.mulDiv( - _underlyingAssetUnits; - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy2.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy2.sol deleted file mode 100644 index 73a72d61..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy2.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - /// BinaryOpMutation of: _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - _underlyingAssetUnits = 10 % underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy3.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy3.sol deleted file mode 100644 index 01ecb2bd..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy3.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - /// RequireMutation of: require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - require(!(priceRatio > 0), 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy4.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy4.sol deleted file mode 100644 index 30cc05a4..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy4.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - /// AssignmentMutation of: UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - UNDERLYING_ASSET_DECIMALS = 1; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy5.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy5.sol deleted file mode 100644 index 31ae00ed..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy5.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - /// AssignmentMutation of: PRICE_RATIO = priceRatio; - PRICE_RATIO = 1; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy6.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy6.sol deleted file mode 100644 index 78d69291..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy6.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - /// AssignmentMutation of: _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - _underlyingAssetUnits = 1; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy7.sol b/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy7.sol deleted file mode 100644 index 7d568002..00000000 --- a/certora/GSM/mutations/mutants/priceStrategy/FixedPriceStrategy7.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.10; - -import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {IGsmPriceStrategy} from './interfaces/IGsmPriceStrategy.sol'; - -/** - * @title FixedPriceStrategy - * @author Aave - * @notice Price strategy involving a fixed-rate conversion from an underlying asset to GHO - */ -contract FixedPriceStrategy is IGsmPriceStrategy { - using Math for uint256; - - /// @inheritdoc IGsmPriceStrategy - uint256 public constant GHO_DECIMALS = 18; - - /// @inheritdoc IGsmPriceStrategy - address public immutable UNDERLYING_ASSET; - - /// @inheritdoc IGsmPriceStrategy - uint256 public immutable UNDERLYING_ASSET_DECIMALS; - - /// @dev The price ratio from underlying asset to GHO (expressed in WAD), e.g. a ratio of 2e18 means 2 GHO per 1 underlying asset - uint256 public immutable PRICE_RATIO; - - /// @dev Underlying asset units represent units for the underlying asset - uint256 internal immutable _underlyingAssetUnits; - - /** - * @dev Constructor - * @param priceRatio The price ratio from underlying asset to GHO (expressed in WAD) - * @param underlyingAsset The address of the underlying asset - * @param underlyingAssetDecimals The number of decimals of the underlying asset - */ - constructor(uint256 priceRatio, address underlyingAsset, uint8 underlyingAssetDecimals) { - /// FunctionCallMutation of: require(priceRatio > 0, 'INVALID_PRICE_RATIO'); - 'INVALID_PRICE_RATIO'; - PRICE_RATIO = priceRatio; - UNDERLYING_ASSET = underlyingAsset; - UNDERLYING_ASSET_DECIMALS = underlyingAssetDecimals; - _underlyingAssetUnits = 10 ** underlyingAssetDecimals; - } - - /// @inheritdoc IGsmPriceStrategy - function getAssetPriceInGho(uint256 assetAmount, bool roundUp) external view returns (uint256) { - return - assetAmount.mulDiv( - PRICE_RATIO, - _underlyingAssetUnits, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } - - /// @inheritdoc IGsmPriceStrategy - function getGhoPriceInAsset(uint256 ghoAmount, bool roundUp) external view returns (uint256) { - return - ghoAmount.mulDiv( - _underlyingAssetUnits, - PRICE_RATIO, - roundUp ? Math.Rounding.Up : Math.Rounding.Down - ); - } -} diff --git a/certora/gho/specs/summarizations.spec b/certora/gho/specs/summarizations.spec index a5a02a83..14a86c91 100644 --- a/certora/gho/specs/summarizations.spec +++ b/certora/gho/specs/summarizations.spec @@ -4,7 +4,7 @@ function first_term(uint256 x, uint256 y) returns uint256 { return x; } ghost mapping(uint256 => mapping(uint256 => uint256)) rayMulSummariztionValues; function rayMulSummariztion(uint256 x, uint256 y) returns uint256 { - if (x == 0) || (y == 0) + if ((x == 0) || (y == 0)) { return 0; } diff --git a/certora/GSM/conf/non-4626/otakar-FixedFeeStrategy.conf b/certora/gsm/conf/gsm/FixedFeeStrategy.conf similarity index 80% rename from certora/GSM/conf/non-4626/otakar-FixedFeeStrategy.conf rename to certora/gsm/conf/gsm/FixedFeeStrategy.conf index af905543..11cef283 100644 --- a/certora/GSM/conf/non-4626/otakar-FixedFeeStrategy.conf +++ b/certora/gsm/conf/gsm/FixedFeeStrategy.conf @@ -1,6 +1,6 @@ { "files": [ - "certora/GSM/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", ], "packages": [ "@aave/core-v3/=lib/aave-v3-core", @@ -22,5 +22,5 @@ "-depth 20", ], "verify": - "FixedFeeStrategyHarness:certora/GSM/specs/gsm/otakar-FixedFeeStrategy.spec", + "FixedFeeStrategyHarness:certora/gsm/specs/gsm/FixedFeeStrategy.spec", } diff --git a/certora/GSM/conf/non-4626/otakar-OracleSwapFreezer.conf b/certora/gsm/conf/gsm/OracleSwapFreezer.conf similarity index 82% rename from certora/GSM/conf/non-4626/otakar-OracleSwapFreezer.conf rename to certora/gsm/conf/gsm/OracleSwapFreezer.conf index c14c639d..91be0a6b 100644 --- a/certora/GSM/conf/non-4626/otakar-OracleSwapFreezer.conf +++ b/certora/gsm/conf/gsm/OracleSwapFreezer.conf @@ -1,6 +1,6 @@ { "files": [ - "certora/GSM/harness/OracleSwapFreezerHarness.sol", + "certora/gsm/harness/OracleSwapFreezerHarness.sol", "src/contracts/facilitators/gsm/swapFreezer/OracleSwapFreezer.sol", ], "packages": [ @@ -24,5 +24,5 @@ "-depth 20", ], "verify": - "OracleSwapFreezerHarness:certora/GSM/specs/gsm/otakar-OracleSwapFreezer.spec", + "OracleSwapFreezerHarness:certora/gsm/specs/gsm/OracleSwapFreezer.spec", } diff --git a/certora/GSM/conf/non-4626/balances-buy.conf b/certora/gsm/conf/gsm/balances-buy.conf similarity index 68% rename from certora/GSM/conf/non-4626/balances-buy.conf rename to certora/gsm/conf/gsm/balances-buy.conf index 9ad9f7e7..ead81216 100644 --- a/certora/GSM/conf/non-4626/balances-buy.conf +++ b/certora/gsm/conf/gsm/balances-buy.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "certora/GSM/harness/DiffHelper.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/DiffHelper.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -32,5 +32,5 @@ "-depth 20", ], "verify": - "GsmHarness:certora/GSM/specs/gsm/balances-buy.spec", + "GsmHarness:certora/gsm/specs/gsm/balances-buy.spec", } diff --git a/certora/GSM/conf/non-4626/balances-sell.conf b/certora/gsm/conf/gsm/balances-sell.conf similarity index 68% rename from certora/GSM/conf/non-4626/balances-sell.conf rename to certora/gsm/conf/gsm/balances-sell.conf index c50ccb17..d7ad0e72 100644 --- a/certora/GSM/conf/non-4626/balances-sell.conf +++ b/certora/gsm/conf/gsm/balances-sell.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "certora/GSM/harness/DiffHelper.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/DiffHelper.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -32,5 +32,5 @@ "-depth 20", ], "verify": - "GsmHarness:certora/GSM/specs/gsm/balances-sell.spec", + "GsmHarness:certora/gsm/specs/gsm/balances-sell.spec", } diff --git a/certora/GSM/conf/non-4626/fees-buy.conf b/certora/gsm/conf/gsm/fees-buy.conf similarity index 72% rename from certora/GSM/conf/non-4626/fees-buy.conf rename to certora/gsm/conf/gsm/fees-buy.conf index 06dba493..01986850 100644 --- a/certora/GSM/conf/non-4626/fees-buy.conf +++ b/certora/gsm/conf/gsm/fees-buy.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "certora/GSM/harness/DiffHelper.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/DiffHelper.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -35,5 +35,5 @@ "-smt_nonLinearArithmetic true", ], "verify": - "GsmHarness:certora/GSM/specs/gsm/fees-buy.spec", + "GsmHarness:certora/gsm/specs/gsm/fees-buy.spec", } diff --git a/certora/GSM/conf/non-4626/fees-sell.conf b/certora/gsm/conf/gsm/fees-sell.conf similarity index 69% rename from certora/GSM/conf/non-4626/fees-sell.conf rename to certora/gsm/conf/gsm/fees-sell.conf index a63ba63f..d96ac352 100644 --- a/certora/GSM/conf/non-4626/fees-sell.conf +++ b/certora/gsm/conf/gsm/fees-sell.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "certora/GSM/harness/DiffHelper.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/DiffHelper.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -26,6 +26,7 @@ "optimistic_hashing":true, "hashing_length_bound":"416", "solc": "solc8.10", + "smt_timeout": "7200", "msg": "fees - sell", "multi_assert_check": true, "prover_args": [ @@ -35,5 +36,5 @@ "-smt_nonLinearArithmetic true", ], "verify": - "GsmHarness:certora/GSM/specs/gsm/fees-sell.spec" + "GsmHarness:certora/gsm/specs/gsm/fees-sell.spec" } diff --git a/certora/GSM/conf/non-4626/otakar-finishedRules.conf b/certora/gsm/conf/gsm/finishedRules.conf similarity index 68% rename from certora/GSM/conf/non-4626/otakar-finishedRules.conf rename to certora/gsm/conf/gsm/finishedRules.conf index 6c27317b..996653f7 100644 --- a/certora/GSM/conf/non-4626/otakar-finishedRules.conf +++ b/certora/gsm/conf/gsm/finishedRules.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/ERC20Helper.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -34,5 +34,5 @@ "-depth 20", ], "verify": - "GsmHarness:certora/GSM/specs/gsm/otakar-gho-gsm-finishedRules.spec", + "GsmHarness:certora/gsm/specs/gsm/gho-gsm-finishedRules.spec", } diff --git a/certora/gsm/conf/gsm/getAmount_properties.conf b/certora/gsm/conf/gsm/getAmount_properties.conf new file mode 100644 index 00000000..3f213c91 --- /dev/null +++ b/certora/gsm/conf/gsm/getAmount_properties.conf @@ -0,0 +1,37 @@ +{ + "files": [ + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "GsmHarness:GHO_TOKEN=GhoToken", + "GsmHarness:PRICE_STRATEGY=FixedPriceStrategyHarness", + "GsmHarness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "smt_timeout": "7200", + "multi_assert_check": true, + "msg": "gsm properties", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20" + ], + "verify": "GsmHarness:certora/gsm/specs/gsm/getAmount_properties.spec", +} diff --git a/certora/GSM/conf/non-4626/Dominik-gho-assetToGhoInvertibility.conf b/certora/gsm/conf/gsm/gho-assetToGhoInvertibility.conf similarity index 64% rename from certora/GSM/conf/non-4626/Dominik-gho-assetToGhoInvertibility.conf rename to certora/gsm/conf/gsm/gho-assetToGhoInvertibility.conf index c1f41916..136cfdaf 100644 --- a/certora/GSM/conf/non-4626/Dominik-gho-assetToGhoInvertibility.conf +++ b/certora/gsm/conf/gsm/gho-assetToGhoInvertibility.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/ERC20Helper.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -26,7 +26,7 @@ "rule_sanity" : "basic", "hashing_length_bound":"416", "solc": "solc8.10", - "msg": "GSM getAsset/GhoAmountForBuy/SellAsset invertibility rules", + "msg": "gsm getAsset/GhoAmountForBuy/SellAsset invertibility rules", "smt_timeout": "7200", "prover_args": [ "-copyLoopUnroll 6", @@ -34,5 +34,5 @@ ], "multi_assert_check": true, "verify": - "GsmHarness:certora/GSM/specs/gsm/Dominik-AssetToGhoInvertibility.spec", + "GsmHarness:certora/gsm/specs/gsm/AssetToGhoInvertibility.spec", } diff --git a/certora/GSM/conf/non-4626/Dominik-gho-fixedPriceStrategy.conf b/certora/gsm/conf/gsm/gho-fixedPriceStrategy.conf similarity index 73% rename from certora/GSM/conf/non-4626/Dominik-gho-fixedPriceStrategy.conf rename to certora/gsm/conf/gsm/gho-fixedPriceStrategy.conf index 5e440441..e003999b 100644 --- a/certora/GSM/conf/non-4626/Dominik-gho-fixedPriceStrategy.conf +++ b/certora/gsm/conf/gsm/gho-fixedPriceStrategy.conf @@ -1,6 +1,6 @@ { "files": [ - "certora/GSM/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", ], "packages": [ "@aave/core-v3/=lib/aave-v3-core", @@ -14,7 +14,7 @@ "optimistic_hashing":true, "hashing_length_bound":"416", "solc": "solc8.10", - "msg": "GSM4626 - getAssetAmountInGho and getGhoAmountInAsset are inverse", + "msg": "gsm4626 - getAssetAmountInGho and getGhoAmountInAsset are inverse", "smt_timeout": "7200", "rule_sanity" : "basic", "prover_args": [ @@ -23,5 +23,5 @@ ], "multi_assert_check": true, "verify": - "FixedPriceStrategyHarness:certora/GSM/specs/gsm/Dominik-FixedPriceStrategy.spec", + "FixedPriceStrategyHarness:certora/gsm/specs/gsm/FixedPriceStrategy.spec", } diff --git a/certora/GSM/conf/non-4626/Martin-gho-gsm.conf b/certora/gsm/conf/gsm/gho-gsm-2.conf similarity index 68% rename from certora/GSM/conf/non-4626/Martin-gho-gsm.conf rename to certora/gsm/conf/gsm/gho-gsm-2.conf index ec933f9a..dff08e5b 100644 --- a/certora/GSM/conf/non-4626/Martin-gho-gsm.conf +++ b/certora/gsm/conf/gsm/gho-gsm-2.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "certora/GSM/harness/ERC20Helper.sol:ERC20Helper", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/ERC20Helper.sol:ERC20Helper", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -28,12 +28,12 @@ "optimistic_hashing":true, "hashing_length_bound":"416", "solc": "solc8.10", - "msg": "GSM properties", + "msg": "gsm properties", "prover_args": [ "-copyLoopUnroll 6", "-depth 20", "-smt_hashingScheme plainInjectivity" ], "verify": - "GsmHarness:certora/GSM/specs/gsm/Martin-gho-gsm.spec", + "GsmHarness:certora/gsm/specs/gsm/gho-gsm-2.spec", } diff --git a/certora/GSM/conf/non-4626/Alex-gho-gsm.conf b/certora/gsm/conf/gsm/gho-gsm.conf similarity index 67% rename from certora/GSM/conf/non-4626/Alex-gho-gsm.conf rename to certora/gsm/conf/gsm/gho-gsm.conf index e7937a59..f71e7c7a 100644 --- a/certora/GSM/conf/non-4626/Alex-gho-gsm.conf +++ b/certora/gsm/conf/gsm/gho-gsm.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/ERC20Helper.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -27,12 +27,12 @@ "rule_sanity" : "basic", "hashing_length_bound":"416", "solc": "solc8.10", - "msg": "GSM properties", + "msg": "gsm properties", "smt_timeout": "7200", "prover_args": [ "-copyLoopUnroll 6", "-depth 20" ], "verify": - "GsmHarness:certora/GSM/specs/gsm/Alex-gho-gsm.spec", + "GsmHarness:certora/gsm/specs/gsm/gho-gsm.spec", } diff --git a/certora/GSM/conf/non-4626/Alex-gho-gsm_inverse.conf b/certora/gsm/conf/gsm/gho-gsm_inverse.conf similarity index 65% rename from certora/GSM/conf/non-4626/Alex-gho-gsm_inverse.conf rename to certora/gsm/conf/gsm/gho-gsm_inverse.conf index 082a026e..7f32649a 100644 --- a/certora/GSM/conf/non-4626/Alex-gho-gsm_inverse.conf +++ b/certora/gsm/conf/gsm/gho-gsm_inverse.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", - "certora/GSM/harness/ERC20Helper.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/ERC20Helper.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -26,12 +26,12 @@ "hashing_length_bound":"416", "solc": "solc8.10", "rule_sanity" : "basic", - "msg": "GSM properties", + "msg": "gsm properties", "smt_timeout": "7200", "prover_args": [ "-copyLoopUnroll 6", "-depth 20" ], "verify": - "GsmHarness:certora/GSM/specs/gsm/Alex-gho-gsm_inverse.spec", + "GsmHarness:certora/gsm/specs/gsm/gho-gsm_inverse.spec", } diff --git a/certora/GSM/conf/non-4626/antti-optimality.conf b/certora/gsm/conf/gsm/optimality.conf similarity index 69% rename from certora/GSM/conf/non-4626/antti-optimality.conf rename to certora/gsm/conf/gsm/optimality.conf index 6cf6248c..cea86a0d 100644 --- a/certora/GSM/conf/non-4626/antti-optimality.conf +++ b/certora/gsm/conf/gsm/optimality.conf @@ -1,11 +1,11 @@ { "files": [ - "certora/GSM/harness/GsmHarness.sol", - "certora/GSM/harness/DummyERC20A.sol", - "certora/GSM/harness/DummyERC20B.sol", - "certora/GSM/harness/ERC20Helper.sol", - "certora/GSM/harness/FixedPriceStrategyHarness.sol", - "certora/GSM/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/GsmHarness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategyHarness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", "src/contracts/gho/GhoToken.sol", ], "link": [ @@ -33,5 +33,5 @@ "-depth 20" ], "verify": - "GsmHarness:certora/GSM/specs/gsm/optimality_antti.spec", + "GsmHarness:certora/gsm/specs/gsm/optimality.spec", } diff --git a/certora/gsm/conf/gsm4626/balances-buy-4626.conf b/certora/gsm/conf/gsm4626/balances-buy-4626.conf new file mode 100644 index 00000000..1ec5afb4 --- /dev/null +++ b/certora/gsm/conf/gsm4626/balances-buy-4626.conf @@ -0,0 +1,37 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + "certora/gsm/harness/DiffHelper.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "4626 balances - buy", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20", + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/balances-buy-4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/balances-sell-4626.conf b/certora/gsm/conf/gsm4626/balances-sell-4626.conf new file mode 100644 index 00000000..54be483e --- /dev/null +++ b/certora/gsm/conf/gsm4626/balances-sell-4626.conf @@ -0,0 +1,38 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + "certora/gsm/harness/DiffHelper.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + // "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "smt_timeout": "7200", + "msg": "4626 balances - sell", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 30", + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/balances-sell-4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/fees-buy-4626.conf b/certora/gsm/conf/gsm4626/fees-buy-4626.conf new file mode 100644 index 00000000..d6f8a93a --- /dev/null +++ b/certora/gsm/conf/gsm4626/fees-buy-4626.conf @@ -0,0 +1,37 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + "certora/gsm/harness/DiffHelper.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "multi_assert_check": true, + "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "4626 fees - buy", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20", + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/fees-buy-4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/fees-sell-4626.conf b/certora/gsm/conf/gsm4626/fees-sell-4626.conf new file mode 100644 index 00000000..ea5e9dea --- /dev/null +++ b/certora/gsm/conf/gsm4626/fees-sell-4626.conf @@ -0,0 +1,36 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + "certora/gsm/harness/DiffHelper.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + // "rule_sanity" : "basic", + "optimistic_hashing":true, + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "4626 fees - sell", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20", + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/fees-sell-4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/finishedRules4626.conf b/certora/gsm/conf/gsm4626/finishedRules4626.conf new file mode 100644 index 00000000..e349f028 --- /dev/null +++ b/certora/gsm/conf/gsm4626/finishedRules4626.conf @@ -0,0 +1,40 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "finishedRuless4626", + "multi_assert_check": true, + "smt_timeout": "4000", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20", +// "-newSplitParallel true", +// "-smt_hashingScheme plainInjectivity", + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/gho-gsm-finishedRules4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/getAmount_4626_properties.conf b/certora/gsm/conf/gsm4626/getAmount_4626_properties.conf new file mode 100644 index 00000000..cd9b6b29 --- /dev/null +++ b/certora/gsm/conf/gsm4626/getAmount_4626_properties.conf @@ -0,0 +1,38 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + // "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "smt_timeout": "7200", + "multi_assert_check": true, + "msg": "gsm 4626 properties", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 30" + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/getAmount_4626_properties.spec", +} diff --git a/certora/gsm/conf/gsm4626/gho-assetToGhoInvertibility4626.conf b/certora/gsm/conf/gsm4626/gho-assetToGhoInvertibility4626.conf new file mode 100644 index 00000000..61d4bec2 --- /dev/null +++ b/certora/gsm/conf/gsm4626/gho-assetToGhoInvertibility4626.conf @@ -0,0 +1,38 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness" + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "rule_sanity" : "basic", + "optimistic_hashing":true, + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "gsm4626 getAsset/GhoAmountForBuy/SellAsset invertibility rules", + "smt_timeout": "7200", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20" + ], + "multi_assert_check": true, + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/AssetToGhoInvertibility4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/gho-fixedPriceStrategy4626.conf b/certora/gsm/conf/gsm4626/gho-fixedPriceStrategy4626.conf new file mode 100644 index 00000000..b3317b2b --- /dev/null +++ b/certora/gsm/conf/gsm4626/gho-fixedPriceStrategy4626.conf @@ -0,0 +1,27 @@ +{ + "files": [ + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "gsm4626 - getAssetAmountInGho and getGhoAmountInAsset are inverse", + "smt_timeout": "7200", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20" + ], + "multi_assert_check": true, + "verify": + "FixedPriceStrategy4626Harness:certora/gsm/specs/gsm4626/FixedPriceStrategy4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/gho-gsm4626-2.conf b/certora/gsm/conf/gsm4626/gho-gsm4626-2.conf new file mode 100644 index 00000000..4cf96638 --- /dev/null +++ b/certora/gsm/conf/gsm4626/gho-gsm4626-2.conf @@ -0,0 +1,40 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "src/contracts/gho/GhoToken.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol:FixedPriceStrategy4626Harness", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/ERC20Helper.sol:ERC20Helper", + ], + "parametric_contracts": [ "Gsm4626Harness"], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + "Gsm4626Harness:UNDERLYING_ASSET=DummyERC20B" + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "rule_sanity" : "basic", + "loop_iter":"1", + "optimistic_hashing":true, + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "gsm properties", + "prover_args": [ + "-copyLoopUnroll 6", + "-smt_hashingScheme plainInjectivity" + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/gho-gsm4626-2.spec", + +} + diff --git a/certora/gsm/conf/gsm4626/gho-gsm4626.conf b/certora/gsm/conf/gsm4626/gho-gsm4626.conf new file mode 100644 index 00000000..08274576 --- /dev/null +++ b/certora/gsm/conf/gsm4626/gho-gsm4626.conf @@ -0,0 +1,38 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "parametric_contracts": [ "Gsm4626Harness"], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "gsm 4626 properties", + "smt_timeout": "7200", + "rule_sanity": "basic", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20" + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/gho-gsm4626.spec", +} diff --git a/certora/gsm/conf/gsm4626/gho-gsm_4626_inverse.conf b/certora/gsm/conf/gsm4626/gho-gsm_4626_inverse.conf new file mode 100644 index 00000000..929d5cc2 --- /dev/null +++ b/certora/gsm/conf/gsm4626/gho-gsm_4626_inverse.conf @@ -0,0 +1,37 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "certora/gsm/harness/ERC20Helper.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "hashing_length_bound":"416", + "solc": "solc8.10", + "rule_sanity" : "basic", + "msg": "gsm properties", + "smt_timeout": "7200", + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20" + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/gho-gsm_4626_inverse.spec", +} diff --git a/certora/gsm/conf/gsm4626/optimality4626.conf b/certora/gsm/conf/gsm4626/optimality4626.conf new file mode 100644 index 00000000..83b3e9b6 --- /dev/null +++ b/certora/gsm/conf/gsm4626/optimality4626.conf @@ -0,0 +1,37 @@ +{ + "files": [ + "certora/gsm/harness/Gsm4626Harness.sol", + "certora/gsm/harness/DummyERC20A.sol", + "certora/gsm/harness/DummyERC20B.sol", + "certora/gsm/harness/ERC20Helper.sol", + "certora/gsm/harness/FixedPriceStrategy4626Harness.sol", + "certora/gsm/harness/FixedFeeStrategyHarness.sol", + "src/contracts/gho/GhoToken.sol", + ], + "link": [ + "Gsm4626Harness:GHO_TOKEN=GhoToken", + "Gsm4626Harness:PRICE_STRATEGY=FixedPriceStrategy4626Harness", + "Gsm4626Harness:_feeStrategy=FixedFeeStrategyHarness", + ], + "packages": [ + "@aave/core-v3/=lib/aave-v3-core", + "@aave/periphery-v3/=lib/aave-v3-periphery", + "@aave/=lib/aave-token", + "@openzeppelin/=lib/openzeppelin-contracts", + ], + "assert_autofinder_success": true, + "optimistic_loop":true, + "loop_iter":"1", + "optimistic_hashing":true, + "rule_sanity" : "basic", + "hashing_length_bound":"416", + "solc": "solc8.10", + "msg": "optimality of sell and buy - multi_assert", + "multi_assert_check": true, + "prover_args": [ + "-copyLoopUnroll 6", + "-depth 20" + ], + "verify": + "Gsm4626Harness:certora/gsm/specs/gsm4626/optimality4626.spec", +} diff --git a/certora/GSM/harness/DiffHelper.sol b/certora/gsm/harness/DiffHelper.sol similarity index 100% rename from certora/GSM/harness/DiffHelper.sol rename to certora/gsm/harness/DiffHelper.sol diff --git a/certora/GSM/harness/DummyERC20A.sol b/certora/gsm/harness/DummyERC20A.sol similarity index 100% rename from certora/GSM/harness/DummyERC20A.sol rename to certora/gsm/harness/DummyERC20A.sol diff --git a/certora/GSM/harness/DummyERC20B.sol b/certora/gsm/harness/DummyERC20B.sol similarity index 100% rename from certora/GSM/harness/DummyERC20B.sol rename to certora/gsm/harness/DummyERC20B.sol diff --git a/certora/GSM/harness/DummyERC20Impl.sol b/certora/gsm/harness/DummyERC20Impl.sol similarity index 100% rename from certora/GSM/harness/DummyERC20Impl.sol rename to certora/gsm/harness/DummyERC20Impl.sol diff --git a/certora/GSM/harness/ERC20Helper.sol b/certora/gsm/harness/ERC20Helper.sol similarity index 100% rename from certora/GSM/harness/ERC20Helper.sol rename to certora/gsm/harness/ERC20Helper.sol diff --git a/certora/GSM/harness/FixedFeeStrategyHarness.sol b/certora/gsm/harness/FixedFeeStrategyHarness.sol similarity index 100% rename from certora/GSM/harness/FixedFeeStrategyHarness.sol rename to certora/gsm/harness/FixedFeeStrategyHarness.sol diff --git a/certora/gsm/harness/FixedPriceStrategy4626Harness.sol b/certora/gsm/harness/FixedPriceStrategy4626Harness.sol new file mode 100644 index 00000000..f1a0958b --- /dev/null +++ b/certora/gsm/harness/FixedPriceStrategy4626Harness.sol @@ -0,0 +1,19 @@ +pragma solidity ^0.8.0; + +import {FixedPriceStrategy4626} from '../../../src/contracts/facilitators/gsm/priceStrategy/FixedPriceStrategy4626.sol'; + +contract FixedPriceStrategy4626Harness is FixedPriceStrategy4626 { + constructor( + uint256 priceRatio, + address underlyingAsset, + uint8 underlyingAssetDecimals + ) FixedPriceStrategy4626(priceRatio, underlyingAsset, underlyingAssetDecimals) {} + + function getUnderlyingAssetUnits() external view returns (uint256) { + return _underlyingAssetUnits; + } + + function getPriceRatio() external view returns (uint256) { + return PRICE_RATIO; + } +} diff --git a/certora/GSM/harness/FixedPriceStrategyHarness.sol b/certora/gsm/harness/FixedPriceStrategyHarness.sol similarity index 100% rename from certora/GSM/harness/FixedPriceStrategyHarness.sol rename to certora/gsm/harness/FixedPriceStrategyHarness.sol diff --git a/certora/gsm/harness/Gsm4626Harness.sol b/certora/gsm/harness/Gsm4626Harness.sol new file mode 100644 index 00000000..6d4584e3 --- /dev/null +++ b/certora/gsm/harness/Gsm4626Harness.sol @@ -0,0 +1,122 @@ +pragma solidity ^0.8.0; + +import {Gsm4626} from '../../../src/contracts/facilitators/gsm/Gsm4626.sol'; +import {IGhoToken} from '../../../src/contracts/gho/interfaces/IGhoToken.sol'; +import {IGsmPriceStrategy} from '../../../src/contracts/facilitators/gsm/priceStrategy/interfaces/IGsmPriceStrategy.sol'; +import {FixedPriceStrategy4626Harness} from './FixedPriceStrategy4626Harness.sol'; +import {FixedFeeStrategyHarness} from './FixedFeeStrategyHarness.sol'; +import {IGsmFeeStrategy} from '../../../src/contracts/facilitators/gsm/feeStrategy/interfaces/IGsmFeeStrategy.sol'; +import {IERC20} from '@aave/core-v3/contracts/dependencies/openzeppelin/contracts/IERC20.sol'; +import {IERC4626} from '@openzeppelin/contracts/interfaces/IERC4626.sol'; + +contract Gsm4626Harness is Gsm4626 { + constructor( + address ghoToken, + address underlyingAsset, + address priceStrategy + ) Gsm4626(ghoToken, underlyingAsset, priceStrategy) {} + + function getAccruedFee() external view returns (uint256) { + return _accruedFees; + } + + function getCurrentExposure() external view returns (uint256) { + return _currentExposure; + } + + function getGhoMinted() public view returns (uint256 ghoMinted) { + (, ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); + } + + function getDearth() external view returns (uint256 dearth) { + (, dearth) = _getCurrentBacking(getGhoMinted()); + } + + function getExcess() external view returns (uint256 excess) { + (excess, ) = _getCurrentBacking(getGhoMinted()); + } + + function getPriceRatio() external returns (uint256 priceRatio) { + priceRatio = FixedPriceStrategy4626Harness(PRICE_STRATEGY).PRICE_RATIO(); + } + + function getAssetPriceInGho(uint256 amount, bool roundUp) external returns (uint256 priceInGho) { + priceInGho = IGsmPriceStrategy(PRICE_STRATEGY).getAssetPriceInGho(amount, roundUp); + } + + function getUnderlyingAssetUnits() external returns (uint256 underlyingAssetUnits) { + underlyingAssetUnits = FixedPriceStrategy4626Harness(PRICE_STRATEGY).getUnderlyingAssetUnits(); + } + + function zeroModulo(uint256 x, uint256 y, uint256 z) external pure { + require((x * y) % z == 0); + } + + function getBuyFeeBP() external returns (uint256) { + return FixedFeeStrategyHarness(_feeStrategy).getBuyFeeBP(); + } + + function getSellFeeBP() external returns (uint256) { + return FixedFeeStrategyHarness(_feeStrategy).getSellFeeBP(); + } + + function getPercMathPercentageFactor() external view returns (uint256) { + return FixedFeeStrategyHarness(_feeStrategy).getPercMathPercentageFactor(); + } + + function getCurrentGhoBalance() external view returns (uint256) { + return IERC20(GHO_TOKEN).balanceOf(address(this)); + } + + function getCurrentUnderlyingBalance() external view returns (uint256) { + return IERC20(UNDERLYING_ASSET).balanceOf(address(this)); + } + + function giftGho(address sender, uint amount) external { + IGhoToken(GHO_TOKEN).transferFrom(sender, address(this), amount); + } + + function giftUnderlyingAsset(address sender, uint amount) external { + IERC20(UNDERLYING_ASSET).transferFrom(sender, address(this), amount); + } + + function getSellFee(uint256 amount) external returns (uint256) { + return IGsmFeeStrategy(_feeStrategy).getSellFee(amount); + } + + function getBuyFee(uint256 amount) external returns (uint256) { + return IGsmFeeStrategy(_feeStrategy).getBuyFee(amount); + } + + function balanceOfUnderlying(address a) external view returns (uint256) { + return IERC20(UNDERLYING_ASSET).balanceOf(a); + } + + function balanceOfGho(address a) external view returns (uint256) { + return IGhoToken(GHO_TOKEN).balanceOf(a); + } + + function getGhoBalanceOfThis() external view returns (uint256) { + return IGhoToken(GHO_TOKEN).balanceOf(address(this)); + } + + function getExceed() external view returns (uint256 exceed) { + (exceed, ) = _getCurrentBacking(getGhoMinted()); + } + + function cumulateYieldInGho() external { + _cumulateYieldInGho(); + } + + function balanceOfUnderlyingDirect(address a) external view returns (uint256) { + return IERC4626(UNDERLYING_ASSET).balanceOf(a); + } + + function getFacilitatorBucket() public view returns (uint256 ghoBucketLevel, uint256 ghoMinted) { + (ghoBucketLevel, ghoMinted) = IGhoToken(GHO_TOKEN).getFacilitatorBucket(address(this)); + } + + function getUnderlyingAssetDecimals() external returns (uint256 underlyingAssetDecimals) { + underlyingAssetDecimals = IGsmPriceStrategy(PRICE_STRATEGY).UNDERLYING_ASSET_DECIMALS(); + } +} diff --git a/certora/GSM/harness/GsmHarness.sol b/certora/gsm/harness/GsmHarness.sol similarity index 100% rename from certora/GSM/harness/GsmHarness.sol rename to certora/gsm/harness/GsmHarness.sol diff --git a/certora/GSM/harness/OracleSwapFreezerHarness.sol b/certora/gsm/harness/OracleSwapFreezerHarness.sol similarity index 100% rename from certora/GSM/harness/OracleSwapFreezerHarness.sol rename to certora/gsm/harness/OracleSwapFreezerHarness.sol diff --git a/certora/GSM/munged/.gitignore b/certora/gsm/munged/.gitignore similarity index 100% rename from certora/GSM/munged/.gitignore rename to certora/gsm/munged/.gitignore diff --git a/certora/GSM/specs/GsmMethods/aave_fee_limits.spec b/certora/gsm/specs/GsmMethods/aave_fee_limits.spec similarity index 100% rename from certora/GSM/specs/GsmMethods/aave_fee_limits.spec rename to certora/gsm/specs/GsmMethods/aave_fee_limits.spec diff --git a/certora/GSM/specs/GsmMethods/aave_price_fee_limits.spec b/certora/gsm/specs/GsmMethods/aave_price_fee_limits.spec similarity index 100% rename from certora/GSM/specs/GsmMethods/aave_price_fee_limits.spec rename to certora/gsm/specs/GsmMethods/aave_price_fee_limits.spec diff --git a/certora/GSM/specs/GsmMethods/aave_price_fee_limits_strict.spec b/certora/gsm/specs/GsmMethods/aave_price_fee_limits_strict.spec similarity index 100% rename from certora/GSM/specs/GsmMethods/aave_price_fee_limits_strict.spec rename to certora/gsm/specs/GsmMethods/aave_price_fee_limits_strict.spec diff --git a/certora/GSM/specs/GsmMethods/aave_price_limits.spec b/certora/gsm/specs/GsmMethods/aave_price_limits.spec similarity index 100% rename from certora/GSM/specs/GsmMethods/aave_price_limits.spec rename to certora/gsm/specs/GsmMethods/aave_price_limits.spec diff --git a/certora/GSM/specs/GsmMethods/erc20.spec b/certora/gsm/specs/GsmMethods/erc20.spec similarity index 100% rename from certora/GSM/specs/GsmMethods/erc20.spec rename to certora/gsm/specs/GsmMethods/erc20.spec diff --git a/certora/gsm/specs/GsmMethods/erc4626.spec b/certora/gsm/specs/GsmMethods/erc4626.spec new file mode 100644 index 00000000..d16a0bfb --- /dev/null +++ b/certora/gsm/specs/GsmMethods/erc4626.spec @@ -0,0 +1,13 @@ +methods { + function _.previewWithdraw(uint256 vaultAssets) external with (env e) => + mulDivSummaryRounding(vaultAssets, 3, 5, Math.Rounding.Up) expect uint256; + + function _.convertToShares(uint256 vaultAssets) external with (env e) => + require_uint256(vaultAssets * 3 / 5) expect uint256; + + function _.previewMint(uint256 shares) external with (env e) => + mulDivSummaryRounding(shares, 5, 3, Math.Rounding.Up) expect uint256; + + function _.convertToAssets(uint256 shares) external with (env e) => + require_uint256(shares * 5 / 3) expect uint256; +} diff --git a/certora/gsm/specs/GsmMethods/methods4626_base.spec b/certora/gsm/specs/GsmMethods/methods4626_base.spec new file mode 100644 index 00000000..2c3383d8 --- /dev/null +++ b/certora/gsm/specs/GsmMethods/methods4626_base.spec @@ -0,0 +1,80 @@ +import "./erc20.spec"; + + +using FixedPriceStrategy4626Harness as _priceStrategy; +using FixedFeeStrategyHarness as _FixedFeeStrategy; +using GhoToken as _ghoToken; +using ERC20Helper as erc20Helper; + +/////////////////// Methods //////////////////////// + +methods +{ + function _ghoToken.transferFrom(address from, address to, uint256 amount) external returns bool with (env e) => + erc20_transferFrom_assumption(calledContract, e, from, to, amount); + function _ghoToken.mint(address account, uint256 amount) external with (env e) => + erc20_mint_assumption(calledContract, e, account, amount); + function _ghoToken.transfer(address to, uint256 amount) external returns bool with (env e) => + erc20_transfer_assumption(calledContract, e, to, amount); + function getAvailableLiquidity() external returns (uint256) envfree; + function getCurrentBacking() external returns(uint256, uint256) envfree; + function erc20Helper.tokenBalanceOf(address token, address user) external returns (uint256) envfree; + function erc20Helper.tokenTotalSupply(address token) external returns (uint256) envfree; + // GSM.sol + function _.UNDERLYING_ASSET() external => DISPATCHER(true); + + // priceStrategy + + function _priceStrategy.getAssetPriceInGho(uint256, bool) external returns(uint256) envfree; + function _priceStrategy.getUnderlyingAssetUnits() external returns(uint256) envfree; + function _priceStrategy.PRICE_RATIO() external returns(uint256) envfree; + + // feeStrategy + + function _FixedFeeStrategy.getBuyFeeBP() external returns(uint256) envfree; + function _FixedFeeStrategy.getSellFeeBP() external returns(uint256) envfree; + function _FixedFeeStrategy.getBuyFee(uint256) external returns(uint256) envfree; + function _FixedFeeStrategy.getSellFee(uint256) external returns(uint256) envfree; + + // GhoToken + + function _ghoToken.getFacilitatorBucket(address) external returns (uint256, uint256) envfree; + function _ghoToken.balanceOf(address) external returns (uint256) envfree; + + // Harness + function getGhoMinted() external returns(uint256) envfree; + function getPriceRatio() external returns (uint256) envfree; + function getAccruedFees() external returns (uint256) envfree; +} + +definition harnessOnlyMethods(method f) returns bool = + (f.selector == sig:getAccruedFees().selector || + f.selector == sig:getGhoMinted().selector || + f.selector == sig:getDearth().selector || + f.selector == sig:getPriceRatio().selector); + +definition buySellAssetsFunctions(method f) returns bool = + (f.selector == sig:buyAsset(uint256,address).selector || + f.selector == sig:buyAssetWithSig(address,uint256,address,uint256,bytes).selector || + f.selector == sig:sellAsset(uint256,address).selector || + f.selector == sig:sellAssetWithSig(address,uint256,address,uint256,bytes).selector); + +function basicBuySellSetup( env e, address receiver){ + require receiver != currentContract; + require e.msg.sender != currentContract; + require UNDERLYING_ASSET(e) != _ghoToken; +} +function erc20_transferFrom_assumption(address token, env e, address from, address to, uint256 amount) returns bool { + require erc20Helper.tokenBalanceOf(token, from) + erc20Helper.tokenBalanceOf(token, to) <= max_uint256; + return _ghoToken.transferFrom(e, from, to, amount); +} + +function erc20_mint_assumption(address token, env e, address account, uint256 amount) { + require erc20Helper.tokenBalanceOf(token, account) + amount <= max_uint256; + _ghoToken.mint(e, account, amount); +} + +function erc20_transfer_assumption(address token, env e, address to, uint256 amount) returns bool{ + require erc20Helper.tokenBalanceOf(token, to) + amount <= max_uint256; + return _ghoToken.transfer(e, to, amount); +} \ No newline at end of file diff --git a/certora/GSM/specs/GsmMethods/methods_base-Martin.spec b/certora/gsm/specs/GsmMethods/methods_base-Martin.spec similarity index 98% rename from certora/GSM/specs/GsmMethods/methods_base-Martin.spec rename to certora/gsm/specs/GsmMethods/methods_base-Martin.spec index 52c719ed..5c38f9dc 100644 --- a/certora/GSM/specs/GsmMethods/methods_base-Martin.spec +++ b/certora/gsm/specs/GsmMethods/methods_base-Martin.spec @@ -21,7 +21,6 @@ methods // function _.previewWithdraw(uint256 vaultAssets) external with(env e) => vaultAssetsToShares(vaultAssets) expect uint256; function _.UNDERLYING_ASSET() external => DISPATCHER(true); function _.GHO_TOKEN() external => DISPATCHER(true); - function _.getUnderlyingAsset() external => DISPATCHER(true); // GhoToken diff --git a/certora/GSM/specs/GsmMethods/methods_base.spec b/certora/gsm/specs/GsmMethods/methods_base.spec similarity index 98% rename from certora/GSM/specs/GsmMethods/methods_base.spec rename to certora/gsm/specs/GsmMethods/methods_base.spec index e136cedf..04fdf862 100644 --- a/certora/GSM/specs/GsmMethods/methods_base.spec +++ b/certora/gsm/specs/GsmMethods/methods_base.spec @@ -21,7 +21,6 @@ methods function erc20Helper.tokenTotalSupply(address token) external returns (uint256) envfree; // GSM.sol function _.UNDERLYING_ASSET() external => DISPATCHER(true); - function _.getUnderlyingAsset() external => DISPATCHER(true); // priceStrategy diff --git a/certora/GSM/specs/GsmMethods/methods_divint_summary.spec b/certora/gsm/specs/GsmMethods/methods_divint_summary.spec similarity index 100% rename from certora/GSM/specs/GsmMethods/methods_divint_summary.spec rename to certora/gsm/specs/GsmMethods/methods_divint_summary.spec diff --git a/certora/GSM/specs/gsm/Martin-shared.spec b/certora/gsm/specs/GsmMethods/shared.spec similarity index 100% rename from certora/GSM/specs/gsm/Martin-shared.spec rename to certora/gsm/specs/GsmMethods/shared.spec diff --git a/certora/GSM/specs/gsm/Dominik-AssetToGhoInvertibility.spec b/certora/gsm/specs/gsm/AssetToGhoInvertibility.spec similarity index 100% rename from certora/GSM/specs/gsm/Dominik-AssetToGhoInvertibility.spec rename to certora/gsm/specs/gsm/AssetToGhoInvertibility.spec diff --git a/certora/GSM/specs/gsm/otakar-FixedFeeStrategy.spec b/certora/gsm/specs/gsm/FixedFeeStrategy.spec similarity index 100% rename from certora/GSM/specs/gsm/otakar-FixedFeeStrategy.spec rename to certora/gsm/specs/gsm/FixedFeeStrategy.spec diff --git a/certora/GSM/specs/gsm/Dominik-FixedPriceStrategy.spec b/certora/gsm/specs/gsm/FixedPriceStrategy.spec similarity index 100% rename from certora/GSM/specs/gsm/Dominik-FixedPriceStrategy.spec rename to certora/gsm/specs/gsm/FixedPriceStrategy.spec diff --git a/certora/GSM/specs/gsm/otakar-OracleSwapFreezer.spec b/certora/gsm/specs/gsm/OracleSwapFreezer.spec similarity index 100% rename from certora/GSM/specs/gsm/otakar-OracleSwapFreezer.spec rename to certora/gsm/specs/gsm/OracleSwapFreezer.spec diff --git a/certora/GSM/specs/gsm/balances-buy.spec b/certora/gsm/specs/gsm/balances-buy.spec similarity index 100% rename from certora/GSM/specs/gsm/balances-buy.spec rename to certora/gsm/specs/gsm/balances-buy.spec diff --git a/certora/GSM/specs/gsm/balances-sell.spec b/certora/gsm/specs/gsm/balances-sell.spec similarity index 100% rename from certora/GSM/specs/gsm/balances-sell.spec rename to certora/gsm/specs/gsm/balances-sell.spec diff --git a/certora/GSM/specs/gsm/fees-buy.spec b/certora/gsm/specs/gsm/fees-buy.spec similarity index 100% rename from certora/GSM/specs/gsm/fees-buy.spec rename to certora/gsm/specs/gsm/fees-buy.spec diff --git a/certora/GSM/specs/gsm/fees-sell.spec b/certora/gsm/specs/gsm/fees-sell.spec similarity index 100% rename from certora/GSM/specs/gsm/fees-sell.spec rename to certora/gsm/specs/gsm/fees-sell.spec diff --git a/certora/GSM/specs/gsm/otakar-getAmount_properties.spec b/certora/gsm/specs/gsm/getAmount_properties.spec similarity index 100% rename from certora/GSM/specs/gsm/otakar-getAmount_properties.spec rename to certora/gsm/specs/gsm/getAmount_properties.spec diff --git a/certora/GSM/specs/gsm/Martin-gho-gsm.spec b/certora/gsm/specs/gsm/gho-gsm-2.spec similarity index 99% rename from certora/GSM/specs/gsm/Martin-gho-gsm.spec rename to certora/gsm/specs/gsm/gho-gsm-2.spec index ec2fd925..2e437f8b 100644 --- a/certora/GSM/specs/gsm/Martin-gho-gsm.spec +++ b/certora/gsm/specs/gsm/gho-gsm-2.spec @@ -1,4 +1,4 @@ -import "Martin-shared.spec"; +import "../GsmMethods/shared.spec"; using GhoToken as _ghoTokenHook; using DummyERC20B as UNDERLYING_ASSET; diff --git a/certora/GSM/specs/gsm/gho-gsm-Buy.spec b/certora/gsm/specs/gsm/gho-gsm-Buy.spec similarity index 100% rename from certora/GSM/specs/gsm/gho-gsm-Buy.spec rename to certora/gsm/specs/gsm/gho-gsm-Buy.spec diff --git a/certora/GSM/specs/gsm/otakar-gho-gsm-finishedRules.spec b/certora/gsm/specs/gsm/gho-gsm-finishedRules.spec similarity index 99% rename from certora/GSM/specs/gsm/otakar-gho-gsm-finishedRules.spec rename to certora/gsm/specs/gsm/gho-gsm-finishedRules.spec index a5f83797..23b77f53 100644 --- a/certora/GSM/specs/gsm/otakar-gho-gsm-finishedRules.spec +++ b/certora/gsm/specs/gsm/gho-gsm-finishedRules.spec @@ -316,7 +316,7 @@ rule getAssetAmountForSellAsset_optimality() // @title Exposure below cap is preserved by all methods except updateExposureCap and initialize // STATUS: PASS // https://prover.certora.com/output/6893/14a1440d3114460f8b64b388a706ca46/?anonymousKey=bb420c63b5b5b11810d5d72026ed6cb6baec43ac -rule exposureBellowCap(method f) +rule exposureBelowCap(method f) filtered { f -> f.selector != sig:initialize(address,address,uint128).selector && f.selector != sig:updateExposureCap(uint128).selector diff --git a/certora/GSM/specs/gsm/Alex-gho-gsm.spec b/certora/gsm/specs/gsm/gho-gsm.spec similarity index 100% rename from certora/GSM/specs/gsm/Alex-gho-gsm.spec rename to certora/gsm/specs/gsm/gho-gsm.spec diff --git a/certora/GSM/specs/gsm/Alex-gho-gsm_inverse.spec b/certora/gsm/specs/gsm/gho-gsm_inverse.spec similarity index 100% rename from certora/GSM/specs/gsm/Alex-gho-gsm_inverse.spec rename to certora/gsm/specs/gsm/gho-gsm_inverse.spec diff --git a/certora/GSM/specs/gsm/optimality_antti.spec b/certora/gsm/specs/gsm/optimality.spec similarity index 100% rename from certora/GSM/specs/gsm/optimality_antti.spec rename to certora/gsm/specs/gsm/optimality.spec diff --git a/certora/gsm/specs/gsm4626/AssetToGhoInvertibility4626.spec b/certora/gsm/specs/gsm4626/AssetToGhoInvertibility4626.spec new file mode 100644 index 00000000..b7c4aa9e --- /dev/null +++ b/certora/gsm/specs/gsm4626/AssetToGhoInvertibility4626.spec @@ -0,0 +1,322 @@ +import "../GsmMethods/methods4626_base.spec"; +import "../GsmMethods/erc4626.spec"; + + + +methods { + function _.mulDiv(uint256 x, uint256 y, uint256 denominator) internal => mulDivSummary(x, y, denominator) expect (uint256); + function _.mulDiv(uint256 x, uint256 y, uint256 denominator, Math.Rounding rounding) internal => mulDivSummaryRounding(x, y, denominator, rounding) expect (uint256); +} + +function mulDivSummary(uint256 x, uint256 y, uint256 denominator) returns uint256 +{ + require denominator > 0; + return require_uint256((x * y) / denominator); +} + + +function mulDivSummaryRounding(uint256 x, uint256 y, uint256 denominator, Math.Rounding rounding) returns uint256 +{ + require denominator > 0; + if (rounding == Math.Rounding.Up) + { + return require_uint256((x * y + denominator - 1) / denominator); + } + else return require_uint256((x * y) / denominator); +} + + +// // FULL REPORT AT: https://prover.certora.com/output/17512/a9aea9e11c56465d8714999a162bfdfa?anonymousKey=441316ec25aa2588abfca22582854f51dda2f339 + + +// // @title actual gho amount returned getAssetAmountForBuyAsset should be less than max gho amount specified by the user +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule basicProperty_getAssetAmountForBuyAsset() { +// env e; + +// require getPriceRatio(e) > 0; +// require _FixedFeeStrategy.getBuyFeeBP(e) <= 10000; + +// uint256 maxGhoAmount; + +// uint256 actualGhoAmount; + +// _, actualGhoAmount, _, _ = getAssetAmountForBuyAsset(e, maxGhoAmount); +// assert actualGhoAmount <= maxGhoAmount; +// } + +// // @title getAssetAmountForBuyAsset should return the same asset and gho amount for an amount of gho suggested as the selling amount +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule basicProperty2_getAssetAmountForBuyAsset() { +// env e; + +// mathint priceRatio = getPriceRatio(e); +// require priceRatio == 9*10^17 || priceRatio == 10^18 || priceRatio == 5*10^18; + +// mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); +// uint8 underlyingAssetDecimals; +// require underlyingAssetDecimals < 25 && underlyingAssetDecimals > 5; +// require uau == 10^underlyingAssetDecimals; + +// mathint buyFee = _FixedFeeStrategy.getBuyFeeBP(e); +// require buyFee == 0 || buyFee == 1000 || buyFee == 357 || buyFee == 9000 || buyFee == 10000; + +// uint256 maxGhoAmount; + +// uint256 assetsBought; uint256 assetsBought2; +// uint256 actualGhoAmount; uint256 actualGhoAmount2; +// uint256 grossAmount; uint256 grossAmount2; +// uint256 fee; uint256 fee2; + +// assetsBought, actualGhoAmount, grossAmount, fee = getAssetAmountForBuyAsset(e, maxGhoAmount); +// assetsBought2, actualGhoAmount2, grossAmount2, fee2 = getAssetAmountForBuyAsset(e, actualGhoAmount); + +// assert assetsBought == assetsBought2 && actualGhoAmount == actualGhoAmount2 && grossAmount == grossAmount2 && fee == fee2; +// } + +// // @title actual gho amount returned getGhoAmountForBuyAsset should be more than the min amount specified by the user +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule basicProperty_getGhoAmountForBuyAsset() { +// env e; + +// require getPriceRatio(e) > 0; +// require _FixedFeeStrategy.getBuyFeeBP(e) < 10000; + +// uint256 minAssetAmount; + +// uint256 actualAssetAmount; + +// actualAssetAmount, _, _, _ = getGhoAmountForBuyAsset(e, minAssetAmount); +// assert minAssetAmount <= actualAssetAmount; +// } + +// // @title actual gho amount returned getAssetAmountForSellAsset should be more than the min amount specified by the user +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule basicProperty_getAssetAmountForSellAsset() { +// env e; + +// require getPriceRatio(e) > 0; +// require _FixedFeeStrategy.getSellFeeBP(e) < 10000; + +// uint256 minGhoAmount; + +// uint256 actualGhoAmount; + +// _, actualGhoAmount, _, _ = getAssetAmountForSellAsset(e, minGhoAmount); +// assert minGhoAmount <= actualGhoAmount; +// } + +// // @title actual asset amount returned getGhoAmountForSellAsset should be less than the max amount specified by the user +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule basicProperty_getGhoAmountForSellAsset() { +// env e; + +// require getPriceRatio(e) > 0; +// require _FixedFeeStrategy.getSellFeeBP(e) < 10000; + +// uint256 maxAssetAmount; + +// uint256 actualAssetAmount; + +// actualAssetAmount, _, _, _ = getGhoAmountForSellAsset(e, maxAssetAmount); +// assert actualAssetAmount <= maxAssetAmount; +// } + +// // @title getGhoAmountForBuyAsset should return the same amount for an asset amount suggested by it +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule basicProperty2_getGhoAmountForBuyAsset() { +// env e; + +// mathint priceRatio = getPriceRatio(e); +// require priceRatio == 9*10^17 || priceRatio == 10^18 || priceRatio == 5*10^18; + +// mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); +// uint8 underlyingAssetDecimals; +// require underlyingAssetDecimals < 25 && underlyingAssetDecimals > 5; +// require uau == 10^underlyingAssetDecimals; + +// mathint buyFee = _FixedFeeStrategy.getBuyFeeBP(e); +// require buyFee == 0 || buyFee == 1000 || buyFee == 357 || buyFee == 9000 || buyFee == 9999; + +// uint256 minAssetAmount; + +// uint256 assetsBought; uint256 assetsBought2; +// uint256 actualGhoAmount; uint256 actualGhoAmount2; +// uint256 grossAmount; uint256 grossAmount2; +// uint256 fee; uint256 fee2; + +// assetsBought, actualGhoAmount, grossAmount, fee = getGhoAmountForBuyAsset(e, minAssetAmount); +// assetsBought2, actualGhoAmount2, grossAmount2, fee2 = getGhoAmountForBuyAsset(e, assetsBought); + +// assert assetsBought == assetsBought2 && actualGhoAmount == actualGhoAmount2 && grossAmount == grossAmount2 && fee == fee2; +// } + + +// /** +// *********************************** +// ***** BUY ASSET INVERSE RULES ***** +// *********************************** +// */ + +// // @title getAssetAmountForBuyAsset is inverse of getGhoAmountForBuyAsset +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule buyAssetInverse_asset() { +// env e; +// mathint priceRatio = getPriceRatio(e); +// require priceRatio >= 10^16 && priceRatio <= 10^20; + +// mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); +// uint8 underlyingAssetDecimals; +// require underlyingAssetDecimals <= 27 && underlyingAssetDecimals >= 5; +// require uau == 10^underlyingAssetDecimals; + +// require _FixedFeeStrategy.getBuyFeeBP(e) < 5000; + +// uint256 maxGhoAmount; +// uint256 assetAmount; +// uint256 assetAmount2; + +// assetAmount, _, _, _ = getAssetAmountForBuyAsset(e, maxGhoAmount); +// assetAmount2, _, _, _ = getGhoAmountForBuyAsset(e, assetAmount); + +// assert assetAmount == assetAmount2; +// } + +// // @title getAssetAmountForSellAsset is inverse of getGhoAmountForSellAsset +// // STATUS: PASSING +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +rule buyAssetInverse_all() { + env e; + mathint priceRatio = getPriceRatio(e); + require priceRatio >= 10^16 && priceRatio <= 10^20; + + mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); + uint8 underlyingAssetDecimals; + require underlyingAssetDecimals <= 27 && underlyingAssetDecimals >= 5; + require uau == 10^underlyingAssetDecimals; + + require _FixedFeeStrategy.getBuyFeeBP(e) < 5000; + + uint256 maxGhoAmount; + + uint256 assetAmount; uint256 assetAmount2; + uint256 ghoAmount; uint256 ghoAmount2; + uint256 grossAmount; uint256 grossAmount2; + uint256 fee; uint256 fee2; + + assetAmount, ghoAmount, grossAmount, fee = getAssetAmountForBuyAsset(e, maxGhoAmount); + assetAmount2, ghoAmount2, grossAmount2, fee2 = getGhoAmountForBuyAsset(e, assetAmount); + + mathint maxAssetError = (3*uau)/(5*getPriceRatio(e)) + 2; + + assert assetAmount <= assetAmount2 && to_mathint(assetAmount2) <= assetAmount + maxAssetError, "asset amount error bound"; + assert ghoAmount == ghoAmount2, "gho amount"; + assert grossAmount == grossAmount2, "gross amount"; + assert fee == fee2, "fee"; +} + + + +// /** +// ************************************ +// ***** SELL ASSET INVERSE RULES ***** +// ************************************ +// */ + +// // @title getAssetAmountForBuyAsset is inverse of getGhoAmountForBuyAsset +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// rule sellAssetInverse_gross() { +// env e; +// mathint priceRatio = getPriceRatio(e); +// require 10^16 <= priceRatio && priceRatio <= 10^20; + +// mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); +// uint8 underlyingAssetDecimals; +// require underlyingAssetDecimals <= 27 && underlyingAssetDecimals >= 5; +// require uau == 10^underlyingAssetDecimals; + +// require _FixedFeeStrategy.getSellFeeBP(e) < 5000; + +// uint256 minGhoAmount; +// uint256 assetAmount; + +// uint256 grossAmount; +// uint256 grossAmount2; + +// assetAmount, _, grossAmount, _ = getAssetAmountForSellAsset(e, minGhoAmount); +// _, _, grossAmount2, _ = getGhoAmountForSellAsset(e, assetAmount); + +// assert grossAmount == grossAmount2; +// } + +// // @title getAssetAmountForSellAsset is inverse of getGhoAmountForSellAsset +// // STATUS: VIOLATED +// // https://prover.certora.com/output/11775/c75e493e2c494c2a8915efa5db311c6c?anonymousKey=04dc391cd1e3719c2302f38c2e045bcfa7907b76 +// /* Takes 7000 seconds, the counterexample may be required directly +// underlyingAssetDecimals = 11 +// sellFee = 1 +// minGhoAmount = 9 +// getAssetAmountForSellAsset(minGhoAmount=9) = (1, 0x1ada5, 0x1adb1, 12) +// getGhoAmountForSellAsset(maxAssetAmount=1) = (1, 0x1ada5, 0x1adb0, 11) +// */ +// rule sellAssetInverse_fee() { +// env e; +// mathint priceRatio = getPriceRatio(e); +// require 10^16 <= priceRatio && priceRatio <= 10^20; + +// mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); +// uint8 underlyingAssetDecimals; +// require underlyingAssetDecimals <= 27 && underlyingAssetDecimals >= 5; +// require uau == 10^underlyingAssetDecimals; + +// require _FixedFeeStrategy.getSellFeeBP(e) < 5000; + +// uint256 minGhoAmount; +// uint256 assetAmount; + +// uint256 fee; +// uint256 fee2; + +// assetAmount, _, _, fee = getAssetAmountForSellAsset(e, minGhoAmount); +// _, _, _, fee2 = getGhoAmountForSellAsset(e, assetAmount); + +// assert fee == fee2; +// } + +// @title getAssetAmountForSellAsset is inverse of getGhoAmountForSellAsset +// STATUS: PASSING +rule sellAssetInverse_all() { + env e; + require 10^16 <= getPriceRatio(e) && getPriceRatio(e) <= 10^20; + + mathint uau = _priceStrategy.getUnderlyingAssetUnits(e); + uint8 underlyingAssetDecimals; + require underlyingAssetDecimals <= 30 && underlyingAssetDecimals >= 1; + require uau == 10^underlyingAssetDecimals; + + require _FixedFeeStrategy.getSellFeeBP(e) < 5000; + + uint256 minGhoAmount; + + uint256 assetAmount; uint256 assetAmount2; + uint256 ghoAmount; uint256 ghoAmount2; + uint256 grossAmount; uint256 grossAmount2; + uint256 fee; uint256 fee2; + + assetAmount, ghoAmount, grossAmount, fee = getAssetAmountForSellAsset(e, minGhoAmount); + assetAmount2, ghoAmount2, grossAmount2, fee2 = getGhoAmountForSellAsset(e, assetAmount); + + assert assetAmount == assetAmount2, "asset amount"; + assert ghoAmount == ghoAmount2, "gho amount"; + assert grossAmount2 <= grossAmount && to_mathint(grossAmount) <= grossAmount2 + 1, "gross amount off by at most 1"; + assert fee2 <= fee && to_mathint(fee) <= fee2 + 1, "fee by at most 1"; + assert (fee == fee2) <=> (grossAmount == grossAmount2), "fee off by 1 iff gross amount off by 1"; +} \ No newline at end of file diff --git a/certora/gsm/specs/gsm4626/FixedPriceStrategy4626.spec b/certora/gsm/specs/gsm4626/FixedPriceStrategy4626.spec new file mode 100644 index 00000000..97e6ab48 --- /dev/null +++ b/certora/gsm/specs/gsm4626/FixedPriceStrategy4626.spec @@ -0,0 +1,99 @@ +// import "../GsmMethods/methods_base.spec"; +import "../GsmMethods/erc4626.spec"; + + +methods { + function getAssetPriceInGho(uint256, bool) external returns (uint256) envfree; + function getGhoPriceInAsset(uint256, bool) external returns (uint256) envfree; + function _.mulDiv(uint256 x, uint256 y, uint256 denominator) internal => mulDivSummary(x, y, denominator) expect (uint256); + function _.mulDiv(uint256 x, uint256 y, uint256 denominator, Math.Rounding rounding) internal => mulDivSummaryRounding(x, y, denominator, rounding) expect (uint256); +} + +function mulDivSummary(uint256 x, uint256 y, uint256 denominator) returns uint256 +{ + require denominator > 0; + return require_uint256((x * y) / denominator); +} + + +function mulDivSummaryRounding(uint256 x, uint256 y, uint256 denominator, Math.Rounding rounding) returns uint256 +{ + require denominator > 0; + if (rounding == Math.Rounding.Up) + { + return require_uint256((x * y + denominator - 1) / denominator); + } + else return require_uint256((x * y) / denominator); +} + +// https://prover.certora.com/output/17512/4273175adeae4a289be8401c82ab9e14?anonymousKey=3dd87914a5a95f469b25a2666ffa484f4b734c34 + + +rule assetToGhoAndBackAllErrorBounds() { + env e; + uint256 originalAssetAmount; + + mathint underlyingAssetUnits = getUnderlyingAssetUnits(e); + require underlyingAssetUnits > 0; // safe as this number should be equal to 10 ** underlyingAssetDecimals + uint256 priceRatio = getPriceRatio(e); + require priceRatio > 0; + + mathint maxError = (3*underlyingAssetUnits)/(5*priceRatio) + 2; + + assert to_mathint(getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, false), false)) >= originalAssetAmount - (maxError) + && originalAssetAmount >= getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, false), false) + , "rounding down then down"; + assert to_mathint(getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, false), true)) >= originalAssetAmount - (maxError - 1) + && originalAssetAmount >= getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, false), true) + , "rounding down then up"; + assert to_mathint(getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, true), false)) <= originalAssetAmount + (maxError - 1) + && originalAssetAmount <= getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, true), false) + , "rounding up then down"; + assert to_mathint(getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, true), true)) <= originalAssetAmount + maxError + && originalAssetAmount <= getGhoPriceInAsset(getAssetPriceInGho(originalAssetAmount, true), true) + , "rounding up then up"; +} + +rule ghoToAssetAndBackAllErrorBounds() { + env e; + uint256 originalAmountOfGho; + + mathint underlyingAssetUnits = getUnderlyingAssetUnits(e); + require underlyingAssetUnits > 0; // safe as this number should be equal to 10 ** underlyingAssetDecimals + uint256 priceRatio = getPriceRatio(e); + require priceRatio > 0; + + mathint maxError = 11*priceRatio/(3*underlyingAssetUnits) + 1; + + // Notice that even when we round down, we can increase the amount of gho due to rounding in preview withdraw. + assert to_mathint(getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, false), false)) >= originalAmountOfGho - maxError + && originalAmountOfGho + priceRatio/underlyingAssetUnits >= to_mathint(getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, false), false)) + , "rounding down then down"; + assert to_mathint(getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, false), true)) >= originalAmountOfGho - maxError + && originalAmountOfGho + priceRatio/underlyingAssetUnits + 1 >= to_mathint(getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, false), true)) + , "rounding down then up"; + assert to_mathint(getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, true), false)) <= originalAmountOfGho + maxError + && originalAmountOfGho <= getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, true), false) + , "rounding up then down"; + assert to_mathint(getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, true), true)) <= originalAmountOfGho + maxError + && originalAmountOfGho <= getAssetPriceInGho(getGhoPriceInAsset(originalAmountOfGho, true), true) + , "rounding up then up"; +} + +rule getAssetPriceIsMonotone() { + env e; + uint256 amount1; + uint256 amount2; + + assert amount1 > amount2 => getAssetPriceInGho(amount1, false) >= getAssetPriceInGho(amount2, false); + assert amount1 > amount2 => getAssetPriceInGho(amount1, true) >= getAssetPriceInGho(amount2, true); +} + +rule getGhoPriceIsMonotone() { + env e; + uint256 amount1; + uint256 amount2; + + assert amount1 > amount2 => getGhoPriceInAsset(amount1, false) >= getGhoPriceInAsset(amount2, false); + assert amount1 > amount2 => getGhoPriceInAsset(amount1, true) >= getGhoPriceInAsset(amount2, true); +} diff --git a/certora/gsm/specs/gsm4626/balances-buy-4626.spec b/certora/gsm/specs/gsm4626/balances-buy-4626.spec new file mode 100644 index 00000000..fe8cb925 --- /dev/null +++ b/certora/gsm/specs/gsm4626/balances-buy-4626.spec @@ -0,0 +1,241 @@ +import "../GsmMethods/erc20.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/erc4626.spec"; + +using DiffHelper as diffHelper; + +methods { + function distributeFeesToTreasury() external; +} + +// Issue: +// The exact GHO return by `getAssetAmountForBuyAsset(max)` can be greater than `max` in 4626 +// Description: +// The user may ask the amount of assets to provide for `buyAsset` by calling +// `getAssetAmountForBuyAsset(max)`, where `max` is the maximum amount of GHO +// user is willing to pay. One of the return values of +// `getAssetAmountForBuyAsset` is the exact amount of GHO that will be deducted. +// This value can be higher than `max`. +// Note: From https://github.com/Certora/gho-gsm/pull/18 + +// ========================= Buying ============================== +// + +// @title 4626: The exact amount of GHO returned by `getAssetAmountForBuyAsset(maxGho)` is less than or equal to `maxGho` +// . -[getAssetAmountForBuyAsset(x)]-> . +// exactGHO <= goWithFee +// where exactGHO is the 2nd return value of getAssetAmountForBuyAsset +// Holds: https://prover.certora.com/output/40748/0146aff66f2a492886c6dd89724b92ba?anonymousKey=32b3789b362a27460edce2d9bc86870646e65c52 +// (1) +rule R1_getAssetAmountForBuyAssetRV2 { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + require GHO_TOKEN(e) != UNDERLYING_ASSET(e); // This is inflation prevention (and also avoids an overflow) + + uint256 ghoWithFee; + uint256 assetsToBuy; + uint256 exactGHO; + address receiver; + + // For debugging: + uint256 priceRatio = getPriceRatio(e); + uint256 underlyingAssetUnits = getUnderlyingAssetUnits(e); + + + _, exactGHO, _, _ = getAssetAmountForBuyAsset(e, ghoWithFee); + + assert exactGHO <= ghoWithFee; +} + +// @title 4626: The exact amount of GHO returned by `getAssetAmountForBuyAsset(maxGho)` can be less than `maxGho` +// (1a) +// Holds: https://prover.certora.com/output/40748/0146aff66f2a492886c6dd89724b92ba?anonymousKey=32b3789b362a27460edce2d9bc86870646e65c52 +rule R1a_getAssetAmountForBuyAssetRV2_LT { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + require GHO_TOKEN(e) != UNDERLYING_ASSET(e); // This is inflation prevention (and also avoids an overflow) + + uint256 ghoWithFee; + uint256 assetsToBuy; + uint256 exactGHO; + address receiver; + + // For debugging: + uint256 priceRatio = getPriceRatio(e); + uint256 underlyingAssetUnits = getUnderlyingAssetUnits(e); + + + _, exactGHO, _, _ = getAssetAmountForBuyAsset(e, ghoWithFee); + + satisfy exactGHO < ghoWithFee; +} + +// @title 4626: The exact amount of GHO returned by `getAssetAmountForBuyAsset(x)` matches the GHO amount deduced from user at `buyAsset` +// . -[getAssetAmountForBuyAsset(x)]-> . -[buyAsset(exactGHO)]-> . +// ghoBalance_1 - ghoBalance_2 = exactGHO +// where exactGHO is the 2nd return value of getAssetAmountForBuyAsset +// Holds: https://prover.certora.com/output/40748/0146aff66f2a492886c6dd89724b92ba?anonymousKey=32b3789b362a27460edce2d9bc86870646e65c52 +// (2) +rule R2_getAssetAmountForBuyAssetRV_vs_GhoBalance { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + require GHO_TOKEN(e) != UNDERLYING_ASSET(e); // This is inflation prevention (and also avoids an overflow) + + uint256 ghoWithFee; + uint256 assetsToBuy; + uint256 exactGHO; + address receiver; + + // For debugging: + uint256 priceRatio = getPriceRatio(e); + uint256 underlyingAssetUnits = getUnderlyingAssetUnits(e); + + + assetsToBuy, exactGHO, _, _ = getAssetAmountForBuyAsset(e, ghoWithFee); + uint256 buyerGhoBalanceBefore = balanceOfGho(e, e.msg.sender); + require assetsToBuy <= max_uint128; + buyAsset(e, assert_uint128(assetsToBuy), receiver); + uint256 buyerGhoBalanceAfter = balanceOfGho(e, e.msg.sender); + + mathint balanceDiff = buyerGhoBalanceBefore - buyerGhoBalanceAfter; + assert to_mathint(exactGHO) == balanceDiff; +} + +// @title 4626: The asset amount deduced from user's account at `buyAsset(minAssets)` is at least `minAssets` +// -[buyAsset]-> +// assetsToBuy <= |buyerAssetBalanceAfter - buyerAssetBalanceBefore| +// (3) +// STATUS: TIMEOUT +// https://prover.certora.com/output/33050/56571f50dd3f4f5ead1c1ee7520b7619?anonymousKey=9b0e61ce85c892c5bf093508ee8a03d6d91fda53 +rule R3_buyAssetUpdatesAssetBuyerAssetBalanceLe { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + require GHO_TOKEN(e) != UNDERLYING_ASSET(e); // This is inflation prevention (and also avoids an overflow) + + uint256 assetsToBuy; + address receiver; + require receiver != currentContract; // Otherwise GHO is burned but asset value doesn't increase. (This is only a problem for my bookkeeping) + + // For debugging: + uint256 priceRatio = getPriceRatio(e); + uint256 underlyingAssetUnits = getUnderlyingAssetUnits(e); + + require assetsToBuy <= max_uint128; + + uint256 receiverAssetBalanceBefore = balanceOfUnderlying(e, receiver); + buyAsset(e, assert_uint128(assetsToBuy), receiver); + uint256 receiverAssetBalanceAfter = balanceOfUnderlying(e, receiver); + + uint256 balanceDiff = require_uint256(receiverAssetBalanceAfter - receiverAssetBalanceBefore); + + assert assetsToBuy <= balanceDiff; +} + +// @title 4626: The asset amount deduced from user's account at `buyAsset(minAssets)` can be more than `minAssets` +// -[buyAsset]-> +// assetsToBuy < |buyerAssetBalanceAfter - buyerAssetBalanceBefore| +// (3a) +// Holds: https://prover.certora.com/output/40748/0146aff66f2a492886c6dd89724b92ba?anonymousKey=32b3789b362a27460edce2d9bc86870646e65c52 +rule R3a_buyAssetUpdatesAssetBuyerAssetBalanceLt { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + require GHO_TOKEN(e) != UNDERLYING_ASSET(e); // This is inflation prevention (and also avoids an overflow) + + uint256 assetsToBuy; + address receiver; + require receiver != currentContract; // Otherwise GHO is burned but asset value doesn't increase. (This only a problem for my bookkeeping) + + // For debugging: + uint256 priceRatio = getPriceRatio(e); + uint256 underlyingAssetUnits = getUnderlyingAssetUnits(e); + + require assetsToBuy <= max_uint128; + + uint256 receiverAssetBalanceBefore = balanceOfUnderlying(e, receiver); + buyAsset(e, assert_uint128(assetsToBuy), receiver); + uint256 receiverAssetBalanceAfter = balanceOfUnderlying(e, receiver); + + uint256 balanceDiff = require_uint256(receiverAssetBalanceAfter - receiverAssetBalanceBefore); + + satisfy assetsToBuy < balanceDiff; +} + +// @title 4626: The amount of GHO deduced from user's account at `buyAsset` is less than or equal to the value passed to `getAssetAmountForBuyAsset` +// . -[getAssetAmountForBuyAsset(x)]-> . -[buyAsset]-> . +// buyerGhoBalanceBefore - buyerGhoBalanceAfter <= goWithFee +// (4) +// Holds: https://prover.certora.com/output/40748/0146aff66f2a492886c6dd89724b92ba?anonymousKey=32b3789b362a27460edce2d9bc86870646e65c52 +rule R4_sellGhoUpdatesAssetBuyerGhoBalanceGe { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + require GHO_TOKEN(e) != UNDERLYING_ASSET(e); // This is inflation prevention (and also avoids an overflow) + + uint256 ghoWithFee; + uint256 assetsToBuy; + address receiver; + + // For debugging: + uint256 priceRatio = getPriceRatio(e); + uint256 underlyingAssetUnits = getUnderlyingAssetUnits(e); + + + assetsToBuy, _, _, _ = getAssetAmountForBuyAsset(e, ghoWithFee); + + require assetsToBuy <= max_uint128; + + uint256 buyerGhoBalanceBefore = balanceOfGho(e, e.msg.sender); + buyAsset(e, assert_uint128(assetsToBuy), receiver); + uint256 buyerGhoBalanceAfter = balanceOfGho(e, e.msg.sender); + + mathint balanceDiff = buyerGhoBalanceBefore - buyerGhoBalanceAfter; + satisfy to_mathint(ghoWithFee) >= balanceDiff; +} + +// @title 4626: The amount of GHO deduced from user's account at `buyAsset` can be less than the value passed to `getAssetAmountForBuyAsset` +// . -[getAssetAmountForBuyAsset(x)]-> . -[buyAsset]-> . +// buyerGhoBalanceBefore - buyerGhoBalanceAfter < goWithFee +// Expected to hold in current implementation +// (4a) +// Holds: https://prover.certora.com/output/40748/0146aff66f2a492886c6dd89724b92ba?anonymousKey=32b3789b362a27460edce2d9bc86870646e65c52 + +rule R4a_sellGhoUpdatesAssetBuyerGhoBalanceGt { + env e; + feeLimits(e); + priceLimits(e); + + uint256 ghoWithFee; + uint256 assetsToBuy; + address receiver; + + require receiver != e.msg.sender; // Otherwise the sold GHO will just come back to me. + + assetsToBuy, _, _, _ = getAssetAmountForBuyAsset(e, ghoWithFee); + + require assetsToBuy <= max_uint128; + + uint256 buyerGhoBalanceBefore = balanceOfGho(e, e.msg.sender); + buyAsset(e, assert_uint128(assetsToBuy), receiver); + uint256 buyerGhoBalanceAfter = balanceOfGho(e, e.msg.sender); + + mathint balanceDiff = buyerGhoBalanceBefore - buyerGhoBalanceAfter; + satisfy to_mathint(ghoWithFee) > balanceDiff; +} diff --git a/certora/gsm/specs/gsm4626/balances-sell-4626.spec b/certora/gsm/specs/gsm4626/balances-sell-4626.spec new file mode 100644 index 00000000..5d69e3b8 --- /dev/null +++ b/certora/gsm/specs/gsm4626/balances-sell-4626.spec @@ -0,0 +1,193 @@ +import "../GsmMethods/erc20.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/erc4626.spec"; + +using DiffHelper as diffHelper; + +methods { + function distributeFeesToTreasury() external; +} + +// ========================= Selling ============================== + +// The user wants to buy GHO and asks how much asset should be sold. Fees are +// not included in user's GHO buying order. + +// @Title 4626: The exact amount of GHO returned by `getAssetAmountForSellAsset(minGho)` is at least `minGho` +// Check that recipient's GHO balance is updated correctly +// User wants to buy `minGhoToSend` GHO. +// User asks for the assets required: `(assetsToSpend, ghoToReceive, ghoToSpend, fee) := getAssetAmountForSellAsset(minGhoToReceive)` +// Let balance difference of the recipient be balanceDiff. +// (1): ghoToReceive >= minGhoToReceive Expected to hold. +// User wants to receive at least minGhoAmount. Is the amount of GHO reported by getAssetAmountForSellAsset at least minGhoAmount +// (1) +// Holds: https://prover.certora.com/output/40748/c4b0691393f4416dbe328f383093ffad?anonymousKey=83439124b153fd20f61457ff3c63da877c6770c3 + +rule R1_getAssetAmountForSellAsset_arg_vs_return { + env e; + feeLimits(e); + priceLimits(e); + + uint256 minGhoToReceive; + uint256 ghoToReceive; + + _, ghoToReceive, _, _ = getAssetAmountForSellAsset(e, minGhoToReceive); + + assert minGhoToReceive <= ghoToReceive; +} + +// @Title 4626: The exact amount of GHO returned by `getAssetAmountForSellAsset(minGho)` can be greater than `minGho` +// Shows != +// (1a) +// Holds: https://prover.certora.com/output/40748/c4b0691393f4416dbe328f383093ffad?anonymousKey=83439124b153fd20f61457ff3c63da877c6770c3 +rule R1a_buyGhoUpdatesGhoBalanceCorrectly1 { + env e; + feeLimits(e); + priceLimits(e); + + uint256 minGhoToReceive; + uint256 ghoToReceive; + + _, _, ghoToReceive, _ = getAssetAmountForSellAsset(e, minGhoToReceive); + satisfy minGhoToReceive != ghoToReceive; +} + +// @Title 4626: The exact amount of GHO returned by `getAssetAmountForSellAsset` is equal to the amount obtained after `sellAsset` +// getAssetAmountForSellAsset returns exactGhoToReceive. Does this match the exact GHO received after the corresponding sellAsset? +// Holds: https://prover.certora.com/output/40748/c4b0691393f4416dbe328f383093ffad?anonymousKey=83439124b153fd20f61457ff3c63da877c6770c3 +// (2) +rule R2_getAssetAmountForSellAsset_sellAsset_eq { + env e; + feeLimits(e); + priceLimits(e); + + uint256 minGhoToReceive; + uint256 ghoToReceive; + uint256 assetsToSell; + + require currentContract.UNDERLYING_ASSET(e) != currentContract.GHO_TOKEN(e); // Otherwise we only measure the fee. + + address recipient; + require recipient != currentContract; // Otherwise the balance grows because of the fees. + + assetsToSell, ghoToReceive, _, _ = getAssetAmountForSellAsset(e, minGhoToReceive); + + uint256 ghoBalanceBefore = balanceOfGho(e, recipient); + sellAsset(e, assetsToSell, recipient); + uint256 ghoBalanceAfter = balanceOfGho(e, recipient); + + uint256 balanceDiff = require_uint256(ghoBalanceAfter - ghoBalanceBefore); + assert balanceDiff == ghoToReceive; +} + +// @Title 4626: The asset amount deduced from the user's account at `sellAsset(_, maxAsset, _)` is at most `maxAsset` +// Check that user's asset balance is decreased correctly. +// assets >= balanceDiff +// Expected to hold in current implementation. +// STATUS: TIMEOUT +// https://prover.certora.com/output/33050/9ef597b1a6424528ae96871f69b5d735?anonymousKey=97dcbde8fc3a574d6a23635dfc6ca227d4e145fc +rule R3_sellAssetUpdatesAssetBalanceCorrectlyGe { + env e; + feeLimits(e); + priceLimits(e); + + uint128 assets; + address seller = e.msg.sender; + address recipient; + + require e.msg.sender != currentContract; + require currentContract.UNDERLYING_ASSET(e) != currentContract.GHO_TOKEN(e); // Inflation prevention! + + uint256 balanceBefore = balanceOfUnderlying(e, seller); + sellAsset(e, assets, recipient); + uint256 balanceAfter = balanceOfUnderlying(e, seller); + require balanceBefore >= balanceAfter; // To avoid overflows + mathint balanceDiff = balanceBefore - balanceAfter; + assert to_mathint(assets) >= balanceDiff; +} + +// @Title 4626: The asset amount deduced from the user's account at `sellAsset(_, maxAsset, _)` can be less than `maxAsset` +// Check that user's asset balance difference can differ from the assets provided +// holds: https://prover.certora.com/output/40748/c4b0691393f4416dbe328f383093ffad?anonymousKey=83439124b153fd20f61457ff3c63da877c6770c3 +// (3a) +// +rule R3a_sellAssetUpdatesAssetBalanceCorrectly { + env e; + feeLimits(e); + priceLimits(e); + + uint128 assets; + address seller = e.msg.sender; + address recipient; + + require e.msg.sender != currentContract; + require currentContract.UNDERLYING_ASSET(e) != currentContract.GHO_TOKEN(e); // Inflation prevention! + + uint256 balanceBefore = balanceOfUnderlying(e, seller); + sellAsset(e, assets, recipient); + uint256 balanceAfter = balanceOfUnderlying(e, seller); + require balanceBefore >= balanceAfter; // To avoid overflows + mathint balanceDiff = balanceBefore - balanceAfter; + satisfy balanceDiff != to_mathint(assets); +} + +// // @Title 4626: The GHO amount added to the user's account at `sellAsset` is at least the value `x` passed to `getAssetAmountForSellAsset(x)` +// // (4) +// // Timeout: https://prover.certora.com/output/11775/b2a7e3687b504f3dbe03457b4b5ed3be?anonymousKey=0e6938a302b565c3d5e7b158d4b20a23d2605db1 +rule R4_buyGhoUpdatesGhoBalanceCorrectly { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; + require currentContract.UNDERLYING_ASSET(e) != currentContract.GHO_TOKEN(e); // Inflation prevention + + address seller = e.msg.sender; + address recipient; + require recipient != currentContract; // Otherwise the balance grows because of the fees. + + uint256 minGhoToSend; + uint256 assetsToSpend; + + assetsToSpend, _, _, _ = getAssetAmountForSellAsset(e, minGhoToSend); + require assetsToSpend < max_uint128; + + uint256 balanceBefore = balanceOfGho(e, recipient); + sellAsset(e, assert_uint128(assetsToSpend), recipient); + uint256 balanceAfter = balanceOfGho(e, recipient); + require balanceAfter >= balanceBefore; // No overflow + uint256 balanceDiff = require_uint256(balanceAfter - balanceBefore); + assert minGhoToSend <= balanceDiff; +} + +// @Title 4626: The GHO amount added to the user's account at `sellAsset` can be greater than the value `x` passed to `getAssetAmountForSellAsset(x)` +// Show that the GHO amount requested by the user to be transferred to the +// recipient can be less than what the recipient receives, even when fees are considered. +// Holds: https://prover.certora.com/output/40748/c4b0691393f4416dbe328f383093ffad?anonymousKey=83439124b153fd20f61457ff3c63da877c6770c3 +// (4a) +rule R4a_buyGhoAmountGtGhoBalanceChange { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; + require currentContract.UNDERLYING_ASSET(e) != currentContract.GHO_TOKEN(e); // Inflation prevention + + address seller = e.msg.sender; + address recipient; + require recipient != currentContract; // Otherwise the balance grows because of the fees. + + uint256 minGhoToSend; + uint256 assetsToSpend; + + assetsToSpend, _, _, _ = getAssetAmountForSellAsset(e, minGhoToSend); + require assetsToSpend < max_uint128; + + uint256 balanceBefore = balanceOfGho(e, recipient); + sellAsset(e, assert_uint128(assetsToSpend), recipient); + uint256 balanceAfter = balanceOfGho(e, recipient); + require balanceAfter >= balanceBefore; // No overflow + uint256 balanceDiff = require_uint256(balanceAfter - balanceBefore); + satisfy minGhoToSend < balanceDiff; +} diff --git a/certora/gsm/specs/gsm4626/fees-buy-4626.spec b/certora/gsm/specs/gsm4626/fees-buy-4626.spec new file mode 100644 index 00000000..79710d32 --- /dev/null +++ b/certora/gsm/specs/gsm4626/fees-buy-4626.spec @@ -0,0 +1,216 @@ +import "../GsmMethods/erc20.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/erc4626.spec"; +using DiffHelper as diffHelper; + +// ========================= Buying ============================== + +// @Title 4626: The fee reported by `getBuyFee` is greater than or equal to the fee reported by `getAssetAmountForBuyAsset` +// getBuyFee -(>=)-> getAssetAmountForBuyAsset +// Shows >= +// Holds: https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +// (1) +rule R1_getBuyFeeGeGetAssetAmountForBuyAsset { + env e; + feeLimits(e); + priceLimits(e); + + uint128 ghoAmount; + uint256 estimatedBuyFee = getBuyFee(e, ghoAmount); + + require estimatedBuyFee + ghoAmount <= max_uint256; + uint256 amountOfGhoToSell = assert_uint256(estimatedBuyFee + ghoAmount); + + uint256 fee; + _, _, _, fee = getAssetAmountForBuyAsset(e, amountOfGhoToSell); + + assert fee <= estimatedBuyFee; +} + +// @Title 4626: The fee reported by `getBuyFee` can be greater than the fee reported by `getAssetAmountForBuyAsset` +// getBuyFee -(>=)-> getAssetAmountForBuyAsset +// Shows > +// Holds: https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +// (1a) +// Expected to hold in the current implementation + +rule R1a_getBuyFeeNeGetAssetAmountForBuyAsset { + env e; + feeLimits(e); + priceLimits(e); + + require e.msg.sender != currentContract; // Otherwise the fee in GHO will come back to me, messing up the balance calculation + + uint128 ghoAmount; + uint256 estimatedBuyFee = getBuyFee(e, ghoAmount); + + require estimatedBuyFee + ghoAmount <= max_uint256; + uint256 amountOfGhoToSell = assert_uint256(estimatedBuyFee + ghoAmount); + + uint256 fee; + _, _, _, fee = getAssetAmountForBuyAsset(e, amountOfGhoToSell); + + satisfy fee < estimatedBuyFee; +} + +// @Title 4626: The fee reported by `getAssetAmountForBuyAsset` is equal to the fee accrued by `buyAsset` +// getAssetAmountForBuyAsset -(==)-> buyAsset +// Show == +// (2) +// holds: https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +rule R2_getAssetAmountForBuyAssetNeBuyAssetFee { + env e; + feeLimits(e); + priceLimits(e); + + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + + uint256 amountOfGhoToSell; + uint256 estimatedFee; + + uint256 assetAmount; + + assetAmount, _, _, estimatedFee = getAssetAmountForBuyAsset(e, amountOfGhoToSell); + + require assetAmount <= max_uint128; // No overflow + require getExcess(e) == 0; // Are we blocking important executions? + + buyAsset(e, assert_uint128(assetAmount), receiver); + + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = assert_uint256(postAccruedFees - preAccruedFees); + + assert estimatedFee == actualFee; +} + +// @Title 4626: The fee reported by `getAssetAmountForBuyAsset` is equal to the fee accrued by `getBuyFee` +// getAssetAmountForBuyAssetFee -(==)-> getBuyFee +// Shows == +// Holds. https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +// (3) +rule R3_getAssetAmountForBuyAssetFeeEqGetBuyFee { + env e; + feeLimits(e); + priceLimits(e); + + uint256 estimatedFee; + uint256 grossGho; + uint256 amountOfGhoToSellWithFee; + + _, _, grossGho, estimatedFee = getAssetAmountForBuyAsset(e, amountOfGhoToSellWithFee); + + uint256 fee = getBuyFee(e, grossGho); + + assert fee == estimatedFee; +} + +// @Title 4626: The fee reported by `getBuyFee` is greater than or equal to the fee accrued by `buyAsset` +// getBuyFee -(>=)-> buyAsset +// shows that estimatedBuyFee >= actualFee. +// Holds: https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +// (4) +rule R4_estimatedBuyFeeLtActualBuyFee { + env e; + feeLimits(e); + priceLimits(e); + + uint128 ghoAmount; + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + uint256 estimatedBuyFee = getBuyFee(e, ghoAmount); + + require estimatedBuyFee + ghoAmount <= max_uint256; + uint256 amountOfGhoToSell = assert_uint256(estimatedBuyFee + ghoAmount); + + uint256 assetAmount; + + assetAmount, _, _, _ = getAssetAmountForBuyAsset(e, amountOfGhoToSell); + + require assetAmount <= max_uint128; // No overflow + require getExcess(e) == 0; // Are we blocking important executions? + + buyAsset(e, assert_uint128(assetAmount), receiver); + + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = assert_uint256(postAccruedFees - preAccruedFees); + + assert estimatedBuyFee >= actualFee; +} + +// @Title 4626: The fee reported by `getBuyFee` can be greater than the fee deduced by `buyAsset` +// getBuyFee -(>=)-> buyAsset +// shows that the estimated fee can be > than actual fee (but isn't necessarily always) +// Holds: https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +// (4a) +rule R4a_estimatedBuyFeeGtActualBuyFee { + env e; + feeLimits(e); + priceLimits(e); + + uint256 priceRatio = getPriceRatio(e); + + uint128 ghoAmount; + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + uint256 estimatedBuyFee = getBuyFee(e, ghoAmount); + + require estimatedBuyFee + ghoAmount <= max_uint256; + uint256 amountOfGhoToSell = assert_uint256(estimatedBuyFee + ghoAmount); + + uint256 assetAmount; + + assetAmount, _, _, _ = getAssetAmountForBuyAsset(e, amountOfGhoToSell); + + require assetAmount <= max_uint128; // No overflow + require getExcess(e) == 0; // Are we blocking important executions? + + buyAsset(e, assert_uint128(assetAmount), receiver); + + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = assert_uint256(postAccruedFees - preAccruedFees); + + satisfy estimatedBuyFee > actualFee; +} + +// @Title 4626: The fee reported by `getBuyFee` can be equal to the fee reported by `buyAsset` +// getBuyFee -(>=)-> buyAsset +// shows that the fee can be correct (but isn't necessarily always) +// (4b) +// Holds: https://prover.certora.com/output/40748/b8b526129e114ca9b3e7dcdcdf3d2fd4?anonymousKey=d1a47509f71c924af60b0b38ec1b3dcd9fe0ae63 +rule R4b_estimatedBuyFeeEqActualBuyFee { + env e; + feeLimits(e); + priceLimits(e); + + uint128 ghoAmount; + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + uint256 estimatedBuyFee = getBuyFee(e, ghoAmount); + + require estimatedBuyFee + ghoAmount <= max_uint256; + uint256 amountOfGhoToSell = assert_uint256(estimatedBuyFee + ghoAmount); + + uint256 assetAmount; + + assetAmount, _, _, _ = getAssetAmountForBuyAsset(e, amountOfGhoToSell); + + require assetAmount <= max_uint128; // No overflow + require getExcess(e) == 0; // Are we blocking important executions? + + buyAsset(e, assert_uint128(assetAmount), receiver); + + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = assert_uint256(postAccruedFees - preAccruedFees); + + satisfy estimatedBuyFee == actualFee; +} \ No newline at end of file diff --git a/certora/gsm/specs/gsm4626/fees-sell-4626.spec b/certora/gsm/specs/gsm4626/fees-sell-4626.spec new file mode 100644 index 00000000..65fbfc22 --- /dev/null +++ b/certora/gsm/specs/gsm4626/fees-sell-4626.spec @@ -0,0 +1,268 @@ +import "../GsmMethods/erc20.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/erc4626.spec"; + +using DiffHelper as diffHelper; + +// Study how well the estimated fees match the actual fees. + +// ========================= Selling ============================== + +// @Title 4626: The fee reported by `getAssetAmountForSellAsset` is greater than or equal to the fee reported by `getSellFee` +// getAssetAmountForSellAssetFee -(>=)-> getSellFee +// Shows >= +// (1) +// holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R1_getAssetAmountForSellAssetFeeGeGetSellFee { + env e; + feeLimits(e); + priceLimits(e); + + uint256 estimatedFee; + uint256 amountOfGhoToBuy; + uint256 exactAmountOfGhoToReceive; + + _, exactAmountOfGhoToReceive, _, estimatedFee = getAssetAmountForSellAsset(e, amountOfGhoToBuy); + + uint256 fee = getSellFee(e, amountOfGhoToBuy); + + assert estimatedFee >= fee; +} + +// @Title 4626: The fee reported by `getAssetAmountForSellAsset` can be greater than the fee reported by `getSellFee` +// getAssetAmountForSellAssetFee -(>=)-> getSellFee +// Shows != +// (1a) +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R1a_getAssetAmountForSellAssetFeeNeGetSellFee { + env e; + feeLimits(e); + priceLimits(e); + + uint256 estimatedFee; + uint256 amountOfGhoToBuy; + uint256 exactAmountOfGhoToReceive; + + _, exactAmountOfGhoToReceive, _, estimatedFee = getAssetAmountForSellAsset(e, amountOfGhoToBuy); + + uint256 fee = getSellFee(e, exactAmountOfGhoToReceive); + + satisfy fee != estimatedFee; +} + +// @Title 4626: The fee reported by `getAssetAmountForSellAsset` can be greater than or equal to the fee deducted by `sellAsset` +// getAssetAmountForSellAsset -(>=)-> sellAsset +// Shows >= +// (2) +// holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R2_getAssetAmountForSellAssetVsActualSellFee { + env e; + feeLimits(e); + priceLimits(e); + + uint256 assetAmount; + uint256 estimatedFee; + uint256 amountOfGhoToBuy; + + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + + assetAmount, _, _, estimatedFee = getAssetAmountForSellAsset(e, amountOfGhoToBuy); + sellAsset(e, require_uint128(assetAmount), receiver); + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = require_uint256(postAccruedFees - preAccruedFees); + + assert estimatedFee >= actualFee; +} + +// @Title 4626: The fee reported by `getAssetAmountForSellAsset` may differ from the fee deducted by `sellAsset` +// getAssetAmountForSellAsset -(>=)-> sellAsset +// Shows != +// (2a) +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R2a_getAssetAmountForSellAssetNeActualSellFee { + env e; + feeLimits(e); + priceLimits(e); + + uint256 assetAmount; + uint256 estimatedFee; + uint256 amountOfGhoToBuy; + + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + + assetAmount, _, _, estimatedFee = getAssetAmountForSellAsset(e, amountOfGhoToBuy); + sellAsset(e, require_uint128(assetAmount), receiver); + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = require_uint128(postAccruedFees - preAccruedFees); + + satisfy estimatedFee != actualFee; +} + +// @Title 4626: The fee reported by `getSellFee` is less than or equal to the fee deduced by `sellAsset` +// getSellFee -(<=)-> sellAsset +// shows <= +// (3) +// Times out +// Solved for 6, 8, 9, 10, 11, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 in +// https://prover.certora.com/output/40748/0e599978d9a2421ab3bb9d8590136afb/?anonymousKey=0da77eb239ceb2c4c30b330b50e61769e5168644 +// Solved for 5, 13, 15 in +// https://prover.certora.com/output/40748/a022ef5dd25d40aa9baecf9d14866007/?anonymousKey=a07d940634ade0c0004dc30cee0375ad5ac36759 +// Solved for 16 in +// https://prover.certora.com/output/40748/f18e0f09d7044d4e847dffc601e08299/?anonymousKey=1c83f325ae45de355f204caed9b67cf99e18bc06 +// Solved for 7, 12: +// https://prover.certora.com/output/40748/a79ba1aab3794e3a82f8671ab7a69f0e/?anonymousKey=dcb36001e071fd323ca66dcba6872b7102e301d0 +// STATUS: TIMEOUT +// https://prover.certora.com/output/33050/e73527d566564185904c2359fc1c06ac?anonymousKey=9dbb56ece4c3d87b617bcabd9819a794c0bcacbf +// rule R3_estimatedSellFeeCanBeHigherThanActualSellFee { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint128 ghoAmount; +// address receiver; + +// uint256 preAccruedFees = currentContract._accruedFees; +// uint256 estimatedSellFee = getSellFee(e, ghoAmount); + +// require ghoAmount <= max_uint128; +// require estimatedSellFee <= max_uint128; + +// uint256 assetAmount; + +// assetAmount, _, _, _ = getAssetAmountForSellAsset(e, ghoAmount); + +// sellAsset(e, require_uint128(assetAmount), receiver); + +// uint256 postAccruedFees = currentContract._accruedFees;` + +// uint256 actualFee = require_uint256(postAccruedFees - preAccruedFees); + +// assert estimatedSellFee <= actualFee; +// } + +// @Title 4626: The fee reported by `getSellFee` can be less than the fee deduced by `sellAsset` +// getSellFee -(<=)-> sellAsset +// shows < +// (3a) +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R3a_estimatedSellFeeCanBeLowerThanActualSellFee { + env e; + feeLimits(e); + priceLimits(e); + + uint128 ghoAmount; + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + uint256 estimatedSellFee = getSellFee(e, ghoAmount); + + require ghoAmount <= max_uint128; + require estimatedSellFee <= max_uint128; + + uint256 assetAmount; + + assetAmount, _, _, _ = getAssetAmountForSellAsset(e, ghoAmount); + + sellAsset(e, require_uint128(assetAmount), receiver); + + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = require_uint256(postAccruedFees - preAccruedFees); + + satisfy estimatedSellFee < actualFee; +} + +// @Title 4626: The fee reported by `getSellFee` can be equal to the fee deduced by `sellAsset` +// getSellFee -(<=>)-> sellAsset +// shows == +// (3b) +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R3b_estimatedSellFeeEqActualSellFee { + env e; + feeLimits(e); + priceLimits(e); + + uint128 ghoAmount; + address receiver; + + uint256 preAccruedFees = currentContract._accruedFees; + uint256 estimatedSellFee = getSellFee(e, ghoAmount); + + require ghoAmount <= max_uint128; + require estimatedSellFee <= max_uint128; + + uint256 assetAmount; + + assetAmount, _, _, _ = getAssetAmountForSellAsset(e, ghoAmount); + + sellAsset(e, require_uint128(assetAmount), receiver); + + uint256 postAccruedFees = currentContract._accruedFees; + + uint256 actualFee = require_uint256(postAccruedFees - preAccruedFees); + + satisfy estimatedSellFee == actualFee; +} + +// @Title 4626: the fee reported by `getSellFee` is less than or equal to the fee reported by `getAssetAmountForSellAsset` +// getSellFee -(<=)-> getAssetAmountForSellAsset +// (4) +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R4_getSellFeeVsgetAssetAmountForSellAsset { + env e; + feeLimits(e); + priceLimits(e); + + uint256 ghoAmount; + uint256 estimatedSellFee; + uint256 sellFee; + + estimatedSellFee = getSellFee(e, ghoAmount); + _, _, _, sellFee = getAssetAmountForSellAsset(e, ghoAmount); + assert estimatedSellFee <= sellFee; +} + +// @Title 4626: the fee reported by `getSellFee` can be less than the fee reported by `getAssetAmountForSellAsset` +// getSellFee -(<=)-> getAssetAmountForSellAsset +// (4a) +// Shows < +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R4a_getSellFeeVsgetAssetAmountForSellAsset { + env e; + feeLimits(e); + priceLimits(e); + + uint256 ghoAmount; + uint256 estimatedSellFee; + uint256 sellFee; + + estimatedSellFee = getSellFee(e, ghoAmount); + _, _, _, sellFee = getAssetAmountForSellAsset(e, ghoAmount); + satisfy estimatedSellFee < sellFee; +} + +// @Title 4626: the fee reeported by `getSellFee` can be equal to to the fee reported by `getAssetAmountForSellAsset` +// getSellFee -(<=)-> getAssetAmountForSellAsset +// (4b) +// Shows = +// Holds: https://prover.certora.com/output/40748/423580bb38c141b983906c061c39313a?anonymousKey=c1f615e893cdc4549b5b00138550cb8921d7703c +rule R4b_getSellFeeVsgetAssetAmountForSellAsset { + env e; + feeLimits(e); + priceLimits(e); + + uint256 ghoAmount; + uint256 estimatedSellFee; + uint256 sellFee; + + estimatedSellFee = getSellFee(e, ghoAmount); + _, _, _, sellFee = getAssetAmountForSellAsset(e, ghoAmount); + satisfy estimatedSellFee == sellFee; +} diff --git a/certora/gsm/specs/gsm4626/getAmount_4626_properties.spec b/certora/gsm/specs/gsm4626/getAmount_4626_properties.spec new file mode 100644 index 00000000..4f52a4d3 --- /dev/null +++ b/certora/gsm/specs/gsm4626/getAmount_4626_properties.spec @@ -0,0 +1,454 @@ +import "../GsmMethods/methods4626_base.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/erc4626.spec"; + +// @title The amount of asset returned is less than or equal to given param +// STATUS: PASS +// https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getAssetAmountForBuyAsset_correctness() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint maxToGive; + require maxToGive > 0; + uint suggestedAssetToBuy; + suggestedAssetToBuy, _, _, _ = getAssetAmountForBuyAsset(e, maxToGive); + + uint reallyPaid; + _, reallyPaid, _, _ = getGhoAmountForBuyAsset(e, suggestedAssetToBuy); + + assert reallyPaid <= maxToGive; +} + +// @title the amount given should be at most 1 more than the max amount specified +// STATUS: PASS +// https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getAssetAmountForBuyAsset_correctness_bound1() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint maxToGive; + uint suggestedAssetToBuy; + suggestedAssetToBuy, _, _, _ = getAssetAmountForBuyAsset(e, maxToGive); + + uint reallyPaid; + _, reallyPaid, _, _ = getGhoAmountForBuyAsset(e, suggestedAssetToBuy); + + assert reallyPaid <= require_uint256(maxToGive + 1); +} + +// @title the amount given should be at most 1 more than the max amount specified +// STATUS: PASS +// https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getAssetAmountForBuyAsset_correctness_bound2() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint maxToGive; + uint suggestedAssetToBuy; + suggestedAssetToBuy, _, _, _ = getAssetAmountForBuyAsset(e, maxToGive); + + uint reallyPaid; + _, reallyPaid, _, _ = getGhoAmountForBuyAsset(e, suggestedAssetToBuy); + + assert reallyPaid <= require_uint256(maxToGive + 2); +} + +// @title The amount of gho returned is greater than or equal to given param +// STATUS: PASS +// https://prover.certora.com/output/6893/9b3b580e82f8497f87ab1f7f169715b8/?anonymousKey=e6c627441f4110e51467815149500a78d8f3765a +rule getGhoAmountForBuyAsset_correctness() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint256 minAssetAmount; + uint suggestedAssetToBuy; + suggestedAssetToBuy, _, _, _ = getGhoAmountForBuyAsset(e, minAssetAmount); + + assert suggestedAssetToBuy >= minAssetAmount; +} + + +// @title suggested asset amount is upto 1 less than the miss asset amount +// STATUS: PASS +// https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getGhoAmountForBuyAsset_correctness_bound1() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint256 minAssetAmount; + uint suggestedAssetToBuy; + suggestedAssetToBuy, _, _, _ = getGhoAmountForBuyAsset(e, minAssetAmount); + + assert require_uint256(suggestedAssetToBuy + 1) >= minAssetAmount; +} + + +// @title The amount of asset returned is greater than or equal to given param. +// STATUS: PASS +// // https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getAssetAmountForSellAsset_correctness() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint minimumToReceive; + require minimumToReceive > 0; + uint suggestedAssetToSell; + suggestedAssetToSell, _, _, _ = getAssetAmountForSellAsset(e, minimumToReceive); + + uint reallyReceived; + _, reallyReceived, _, _ = getGhoAmountForSellAsset(e, suggestedAssetToSell); + + assert reallyReceived >= minimumToReceive; +} + + +// @title The amount of gho returned is less than or equal to given param. +// STATUS: PASS +// https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getGhoAmountForSellAsset_correctness() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint maxAssetAmount; + uint suggestedAssetToSell; + suggestedAssetToSell, _, _, _ = getGhoAmountForSellAsset(e, maxAssetAmount); + + assert suggestedAssetToSell <= maxAssetAmount; +} + +// @title getAssetAmountForBuyAsset returns value that is as close as possible to user specified amount. +// STATUS: PASS +// https://prover.certora.com/output/11775/66c7c0a501d04b7e815fcd13680c087d?anonymousKey=6c44ce466f01c24f3e7d5432b4ddd2b8170da571 +rule getAssetAmountForBuyAsset_optimality() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint maxToGive; + uint suggestedAssetToBuy; + suggestedAssetToBuy, _, _, _ = getAssetAmountForBuyAsset(e, maxToGive); + uint suggestedGhoToPay; + _, suggestedGhoToPay, _, _ = getGhoAmountForBuyAsset(e, suggestedAssetToBuy); + + uint maxCouldBuy; + uint couldBuy; + uint couldPay; + couldBuy, couldPay, _, _ = getGhoAmountForBuyAsset(e, maxCouldBuy); + + require couldPay <= maxToGive; + require couldPay >= suggestedGhoToPay; + + assert couldBuy <= suggestedAssetToBuy; +} + +// @title getGhoAmountForBuyAsset returns value that is as close as possible to user specified amount. +// STATUS: PASS +// https://prover.certora.com/output/11775/c3036f0fb1c344e2ab8c3f38bf9438af?anonymousKey=f0fd891d0add2cf779b3473b67296b97dd769a8a +rule getGhoAmountForBuyAsset_optimality() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint minAssetToBuy; + uint suggestedAssetToBuy; + uint suggestedGhoToSpend; + suggestedAssetToBuy, suggestedGhoToSpend, _, _ = getGhoAmountForBuyAsset(e, minAssetToBuy); + + uint min2AssetsToBuy; + uint couldBuy; + uint couldPay; + couldBuy, couldPay, _, _ = getGhoAmountForBuyAsset(e, min2AssetsToBuy); + + require couldBuy >= minAssetToBuy; + //require couldPay >= suggestedGhoToPay; + + assert couldPay >= suggestedGhoToSpend; +} + +// @title getGhoAmountForSellAsset returns value that is as close as possible to user specified amount. +// STATUS: PASS +// https://prover.certora.com/output/6893/9b3b580e82f8497f87ab1f7f169715b8/?anonymousKey=e6c627441f4110e51467815149500a78d8f3765a +rule getGhoAmountForSellAsset_optimality() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint maxAssetToSell; + uint suggestedAssetToSell; + uint suggestedGhoToGain; + suggestedAssetToSell, suggestedGhoToGain, _, _ = getGhoAmountForSellAsset(e, maxAssetToSell); + + uint maxAssetToSell2; + uint couldSell; + uint couldGain; + couldSell, couldGain, _, _ = getGhoAmountForSellAsset(e, maxAssetToSell2); + + require couldSell <= maxAssetToSell; + //require couldPay >= suggestedGhoToPay; + + assert suggestedGhoToGain >= couldGain; +} + +// @title getAssetAmountForSellAsset returns value that is as close as possible to user specified amount. +// STATUS: PASS +// https://prover.certora.com/output/11775/1c7f7d0151f04b2c9a68f12f161a7a3f?anonymousKey=7efd045107e4779246295b692ecaf169c5b2c280 +rule getAssetAmountForSellAsset_optimality() +{ + // proves that if user wants to receive at least X gho + // and the system tells them to sell Y assets, + // then there is no amount W < Y that would already provide X gho. + + env e; + feeLimits(e); + priceLimits(e); + + uint wantsToReceive; + uint suggestedAssetToSell; + suggestedAssetToSell, _, _, _ = getAssetAmountForSellAsset(e, wantsToReceive); + + uint reallySold; + uint reallyReceived; + _, reallyReceived, _, _ = getGhoAmountForSellAsset(e, reallySold); + + require reallyReceived >= wantsToReceive; + + assert suggestedAssetToSell <= reallySold; +} + + +// @title getAssetAmountForBuyAsset returns value that is as close as possible to user specified amount. +// STATUS: PASS +// https://prover.certora.com/output/33050/f360ab36c2564a069784bc859d6d4c7e?anonymousKey=e0c9610f8e7d6c2e1c78d70708b8fec9b04ee505 +rule getAssetAmountForBuyAsset_funcProperty() +{ + // if (A, B, _, _) = getAssetAmountForBuyAsset(X) then B is function of A + env e; + feeLimits(e); + priceLimits(e); + + uint256 amount1; + uint suggestedAssetToBuy1; + uint totalPay1; + suggestedAssetToBuy1, totalPay1, _, _ = getAssetAmountForBuyAsset(e, amount1); + + uint256 amount2; + uint suggestedAssetToBuy2; + uint totalPay2; + suggestedAssetToBuy2, totalPay2, _, _ = getAssetAmountForBuyAsset(e, amount2); + + assert (suggestedAssetToBuy1 == suggestedAssetToBuy2) == + (totalPay1 == totalPay2); +} + +// @title The first two return values of getGhoAmountForBuyAsset are univalent (https://en.wikipedia.org/wiki/Binary_relation#Specific_types_of_binary_relations) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/740d89f59d5b4bd689d5e71742b9014e?anonymousKey=fdd7be2db7b1db552afc7fa7bcbbd89983bd6bd1 +// rule getGhoAmountForBuyAsset_funcProperty() +// { +// // if (A, B, _, _) = getGhoAmountForBuyAsset(X) then B is function of A +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 amount1; +// uint suggestedAssetToBuy1; +// uint totalPay1; +// suggestedAssetToBuy1, totalPay1, _, _ = getGhoAmountForBuyAsset(e, amount1); + +// uint256 amount2; +// uint suggestedAssetToBuy2; +// uint totalPay2; +// suggestedAssetToBuy2, totalPay2, _, _ = getGhoAmountForBuyAsset(e, amount2); + +// assert (suggestedAssetToBuy1 == suggestedAssetToBuy2) == +// (totalPay1 == totalPay2); +// } + +// @title The first two return values of getAssetAmountForSellAsset are univalent (https://en.wikipedia.org/wiki/Binary_relation#Specific_types_of_binary_relations) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/bde7981ff4f64a04b995ddff49b4b153?anonymousKey=cf1b5e409d9d9e37dc6320d5382c562bc4144664 +// rule getAssetAmountForSellAsset_funcProperty() +// { +// // if (A, B, _, _) = getAssetAmountForSellAsset(X) then B is function of A +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 amount1; +// uint suggestedAsset1; +// uint totalPay1; +// suggestedAsset1, totalPay1, _, _ = getAssetAmountForSellAsset(e, amount1); + +// uint256 amount2; +// uint suggestedAsset2; +// uint totalPay2; +// suggestedAsset2, totalPay2, _, _ = getAssetAmountForSellAsset(e, amount2); + +// assert (suggestedAsset1 == suggestedAsset2) == +// (totalPay1 == totalPay2); +// } + +// @title The first two return values of getGhoAmountForSellAsset are univalent (https://en.wikipedia.org/wiki/Binary_relation#Specific_types_of_binary_relations) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/291150d123e04ee29541a3cd0763eb9c?anonymousKey=cee781030122979f034823769c6705c26869f5b8 +// rule getGhoAmountForSellAsset_funcProperty() +// { +// // if (A, B, _, _) = getGhoAmountForSellAsset(X) then B is function of A +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 amount1; +// uint suggestedAsset1; +// uint totalPay1; +// suggestedAsset1, totalPay1, _, _ = getGhoAmountForSellAsset(e, amount1); + +// uint256 amount2; +// uint suggestedAsset2; +// uint totalPay2; +// suggestedAsset2, totalPay2, _, _ = getGhoAmountForSellAsset(e, amount2); + +// assert (suggestedAsset1 == suggestedAsset2) == +// (totalPay1 == totalPay2); +// } + +// @title getGhoAmountForBuyAsset is additive. Making two small transactions x1, x2, is less favourable for the user than making (x1+x2) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/ebb8f639ebb74796802fe08c55ddfd6c?anonymousKey=be2f94647809d3c634f1e653f572385902452b07 +// rule getGhoAmountForBuyAsset_aditivity() +// { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 minAssetAmount1; +// uint bought1; +// uint paid1; +// bought1, paid1, _, _ = getGhoAmountForBuyAsset(e, minAssetAmount1); + +// uint256 minAssetAmount2; +// uint bought2; +// uint paid2; +// bought2, paid2, _, _ = getGhoAmountForBuyAsset(e, minAssetAmount2); +// require require_uint256(bought1 + bought2) > 0; + +// uint256 minAssetAmount3; +// uint bought3; +// uint paid3; +// bought3, paid3, _, _ = getGhoAmountForBuyAsset(e, minAssetAmount3); + +// assert require_uint256(bought1 + bought2) >= bought3 => +// require_uint256(paid1 + paid2) >= paid3; +// } + + +// @title getAssetAmountForBuyAsset is additive. Making two small transactions x1, x2, is less favourable for the user than making (x1+x2) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/c5216b2a5ae54598a471c536f368501f?anonymousKey=1bfd46b0d930b3860ddf12f3f2450eadecd6d482 +// rule getAssetAmountForBuyAsset_aditivity() +// { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 maxGhoAmount1; +// uint bought1; +// uint paid1; +// bought1, paid1, _, _ = getAssetAmountForBuyAsset(e, maxGhoAmount1); + +// uint256 maxGhoAmount2; +// uint bought2; +// uint paid2; +// bought2, paid2, _, _ = getAssetAmountForBuyAsset(e, maxGhoAmount2); +// require require_uint256(bought1 + bought2) > 0; + +// uint256 maxGhoAmount3; +// uint bought3; +// uint paid3; +// bought3, paid3, _, _ = getAssetAmountForBuyAsset(e, maxGhoAmount3); + +// assert require_uint256(bought1 + bought2) >= bought3 => +// require_uint256(paid1 + paid2) >= paid3; +// } + +// @title getGhoAmountForSellAsset is additive. Making two small transactions x1, x2, is less favourable for the user than making (x1+x2) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/4eb683e5162640f599f80f5afb59fdb9?anonymousKey=da8944168ada87b4d556dccb77f240a62f481ece +// rule getGhoAmountForSellAsset_aditivity() +// { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 amount1; +// uint suggestedAsset1; +// uint totalGained1; +// suggestedAsset1, totalGained1, _, _ = getGhoAmountForSellAsset(e, amount1); + +// uint256 amount2; +// uint suggestedAsset2; +// uint totalGained2; +// suggestedAsset2, totalGained2, _, _ = getGhoAmountForSellAsset(e, amount2); +// require require_uint256(suggestedAsset1 + suggestedAsset2) > 0; + +// uint256 amount3; +// uint suggestedAsset3; +// uint totalGained3; +// suggestedAsset3, totalGained3, _, _ = getGhoAmountForSellAsset(e, amount3); + +// assert require_uint256(suggestedAsset1 + suggestedAsset2) <= suggestedAsset3 => +// require_uint256(totalGained1 + totalGained2) <= totalGained3; +// } + +// @title getAssetAmountForSellAsset is additive. Making two small transactions x1, x2, is less favourable for the user than making (x1+x2) +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/8ee8e360d1c64478961c9ba80565c5cd?anonymousKey=4ed0353a58d71ae7f863097cbb25884ace721234 +// rule getAssetAmountForSellAsset_aditivity() +// { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 amount1; +// uint suggestedAsset1; +// uint totalGained1; +// suggestedAsset1, totalGained1, _, _ = getAssetAmountForSellAsset(e, amount1); + +// uint256 amount2; +// uint suggestedAsset2; +// uint totalGained2; +// suggestedAsset2, totalGained2, _, _ = getAssetAmountForSellAsset(e, amount2); +// require require_uint256(suggestedAsset1 + suggestedAsset2) > 0; + +// uint256 amount3; +// uint suggestedAsset3; +// uint totalGained3; +// suggestedAsset3, totalGained3, _, _ = getAssetAmountForSellAsset(e, amount3); + +// assert require_uint256(suggestedAsset1 + suggestedAsset2) <= suggestedAsset3 => +// require_uint256(totalGained1 + totalGained2) <= totalGained3; +// } + + + + + diff --git a/certora/gsm/specs/gsm4626/gho-gsm-finishedRules4626.spec b/certora/gsm/specs/gsm4626/gho-gsm-finishedRules4626.spec new file mode 100644 index 00000000..ecada856 --- /dev/null +++ b/certora/gsm/specs/gsm4626/gho-gsm-finishedRules4626.spec @@ -0,0 +1,537 @@ +import "../GsmMethods/methods4626_base.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/erc4626.spec"; + + +// @title Rescuing GHO never lefts less GHO available than _accruedFees. +// STATUS: PASSED +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule rescuingGhoKeepsAccruedFees() +{ + address token; + address to; + uint256 amount; + env e; + feeLimits(e); + priceLimits(e); + require token == GHO_TOKEN(e); + rescueTokens(e, token, to, amount); + assert getCurrentGhoBalance(e) >= getAccruedFee(e); +} + +// @title Rescuing underlying never lefts less underlying available than _currentExposure. +//Rescuing the underlying asset should never result in there being less of the underlying (as an ERC-20 balance) than the combined total of the _currentExposure and _tokenizedAssets. +// STATUS: PASSED +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule rescuingAssetKeepsAccruedFees() +{ + address token; + address to; + uint256 amount; + env e; + feeLimits(e); + priceLimits(e); + require token == UNDERLYING_ASSET(e); + rescueTokens(e, token, to, amount); + assert getCurrentUnderlyingBalance(e) >= assert_uint256(getCurrentExposure(e)); // + getTokenizedAssets(e)); +} + +// @title buyAsset decreases _currentExposure +//When calling buyAsset successfully (i.e., no revert), the _currentExposure should always decrease. +// STATUS: PASSED +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule buyAssetDecreasesExposure() +{ + env e; + feeLimits(e); + priceLimits(e); + uint128 amount; + address receiver; + uint exposureBefore = getCurrentExposure(e); + require amount > 0; + buyAsset(e, amount, receiver); + + assert getCurrentExposure(e) < exposureBefore; +} + +// @title sellAsset increases _currentExposure +//When calling sellAsset successfully (i.e., no revert), the _currentExposure should always increase. +// STATUS: PASSED +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule sellAssetIncreasesExposure() +{ + env e; + feeLimits(e); + priceLimits(e); + uint128 amount; + address receiver; + uint exposureBefore = getCurrentExposure(e); + require amount > 0; + sellAsset(e, amount, receiver); + + assert getCurrentExposure(e) > exposureBefore; +} + +// @title If _currentExposure exceeds _exposureCap, sellAsset reverts. +// STATUS: VIOLATED +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +// rule cantSellIfExposureTooHigh() +// { +// env e; +// feeLimits(e); +// priceLimits(e); +// uint128 amount; +// address receiver; +// require require_uint256(getCurrentExposure(e) + amount) > getExposureCap(e); +// sellAsset@withrevert(e, amount, receiver); + +// assert lastReverted; +// } + +definition canChangeExposureCap(method f) returns bool = + f.selector == sig:updateExposureCap(uint128).selector || + f.selector == sig:initialize(address,address,uint128).selector|| + f.selector == sig:seize().selector; + + +// @title Only updateExposureCap, initialize, seize can change exposureCap. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule whoCanChangeExposureCap(method f) +{ + env e; + feeLimits(e); + priceLimits(e); + uint256 exposureCapBefore = getExposureCap(e); + calldataarg args; + f(e, args); + uint256 exposureCapAfter = getExposureCap(e); + assert exposureCapAfter != exposureCapBefore => canChangeExposureCap(f), "should not change exposure cap"; +} + +// @title Cannot buy or sell if the GSM is frozen. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule cantBuyOrSellWhenFrozen() +{ + env e; + feeLimits(e); + priceLimits(e); + uint128 amount; + address receiver; + require getIsFrozen(e); + + buyAsset@withrevert(e, amount, receiver); + assert lastReverted; + + sellAsset@withrevert(e, amount, receiver); + assert lastReverted; +} + +// @title Cannot buy or sell if the GSM is seized. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule cantBuyOrSellWhenSeized() +{ + env e; + feeLimits(e); + priceLimits(e); + uint128 amount; + address receiver; + + require getIsSeized(e); + + buyAsset@withrevert(e, amount, receiver); + assert lastReverted; + + sellAsset@withrevert(e, amount, receiver); + assert lastReverted; +} + +definition canIncreaseExposure(method f) returns bool = + //f.selector == sig:backWithGho(uint128).selector || + f.selector == sig:backWithUnderlying(uint256).selector || + f.selector == sig:sellAsset(uint256,address).selector || + f.selector == sig:sellAssetWithSig(address,uint256,address,uint256,bytes).selector; + +definition canDecreaseExposure(method f) returns bool = + f.selector == sig:buyAsset(uint256, address).selector || + f.selector == sig:seize().selector || + f.selector == sig:buyAssetWithSig(address,uint256,address,uint256,bytes).selector; + +// @title Only specific methods can change exposure. +// STATUS: PASS + +rule whoCanChangeExposure(method f) +{ + env e; + feeLimits(e); + priceLimits(e); + uint256 exposureBefore = getCurrentExposure(e); + calldataarg args; + f(e, args); + uint256 exposureAfter = getCurrentExposure(e); + assert exposureAfter > exposureBefore => canIncreaseExposure(f), "should not increase exposure"; + assert exposureAfter < exposureBefore => canDecreaseExposure(f), "should not decrease exposure"; +} + +definition canIncreaseAccruedFees(method f) returns bool = + f.selector == sig:sellAsset(uint256,address).selector || + f.selector == sig:sellAssetWithSig(address,uint256,address,uint256,bytes).selector || + f.selector == sig:buyAsset(uint256, address).selector || + f.selector == sig:buyAssetWithSig(address,uint256,address,uint256,bytes).selector || + f.selector == sig:cumulateYieldInGho().selector + ; + +definition canDecreaseAccruedFees(method f) returns bool = + f.selector == sig:distributeFeesToTreasury().selector; + +// @title Only specific methods can increase / decrease acrued fees +// STATUS: VIOLATED +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule whoCanChangeAccruedFees(method f) +{ + env e; + feeLimits(e); + priceLimits(e); + uint256 accruedFeesBefore = getAccruedFee(e); + calldataarg args; + f(e, args); + uint256 accruedFeesAfter = getAccruedFee(e); + assert accruedFeesAfter > accruedFeesBefore => canIncreaseAccruedFees(f), "should not increase accrued fees"; + assert accruedFeesAfter < accruedFeesBefore => canDecreaseAccruedFees(f), "should not decrease accrued fees"; +} + +// @title It's not possible for _currentExposure to exceed _exposureCap as a result of a call to sellAsset. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule sellingDoesntExceedExposureCap() +{ + env e; + feeLimits(e); + priceLimits(e); + uint128 amount; + address receiver; + require getCurrentExposure(e) <= getExposureCap(e); + sellAsset(e, amount, receiver); + + assert getCurrentExposure(e) <= getExposureCap(e); +} + +// @title The buy fee actually collected (after rounding) is at least the required percentage. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule collectedBuyFeeIsAtLeastAsRequired() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint256 assetAmount; + uint256 ghoTotal; uint256 ghoGross; uint256 ghoFee; + _, ghoTotal, ghoGross, ghoFee = getGhoAmountForBuyAsset(e, assetAmount); + assert getPercMathPercentageFactor(e) * ghoFee >= getBuyFeeBP(e) * ghoGross; +} + +// @title The buy fee actually collected (after rounding) is at least the required percentage. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule collectedBuyFeePlus1IsAtLeastAsRequired() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint256 assetAmount; + uint256 ghoTotal; uint256 ghoGross; uint256 ghoFee; + _, ghoTotal, ghoGross, ghoFee = getGhoAmountForBuyAsset(e, assetAmount); + assert getPercMathPercentageFactor(e) * require_uint256(ghoFee + 1) >= getBuyFeeBP(e) * ghoGross; +} + +// @title The buy fee actually collected (after rounding) is at least the required percentage. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule collectedBuyFeePlus2IsAtLeastAsRequired() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint256 assetAmount; + uint256 ghoTotal; uint256 ghoGross; uint256 ghoFee; + _, ghoTotal, ghoGross, ghoFee = getGhoAmountForBuyAsset(e, assetAmount); + assert getPercMathPercentageFactor(e) * require_uint256(ghoFee + 2) >= getBuyFeeBP(e) * ghoGross; +} + +// @title The sell fee actually collected (after rounding) is at least the required percentage. +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule collectedSellFeeIsAtLeastAsRequired() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint256 ghoAmount; + uint256 ghoTotal; uint256 ghoGross; uint256 ghoFee; + _, ghoTotal, ghoGross, ghoFee = getGhoAmountForSellAsset(e, ghoAmount); + + assert getPercMathPercentageFactor(e) * ghoFee >= getSellFeeBP(e) * ghoGross; +} + +// @title getAssetAmountForSellAsset never exceeds the given bound +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule getAssetAmountForSellAsset_correctness() +{ + env e; + feeLimits(e); + priceLimits(e); + + uint minimumToReceive; + uint suggestedAssetToSell; + suggestedAssetToSell, _, _, _ = getAssetAmountForSellAsset(e, minimumToReceive); + + uint reallyReceived; + _, reallyReceived, _, _ = getGhoAmountForSellAsset(e, suggestedAssetToSell); + + assert reallyReceived >= minimumToReceive; +} + +// @title backWithGho doesn't create excess +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule backWithGhoDoesntCreateExcess() +{ + env e; + feeLimits(e); + priceLimits(e); + uint128 amount; + uint256 excess; uint256 dearth; + require getCurrentExposure(e) + amount < max_uint256; + excess, dearth = getCurrentBacking(e); + + backWithGho(e, amount); + assert dearth > 0; //if not reverted, dearth must be > 0 + + uint256 excessAfter; uint256 dearthAfter; + excessAfter, dearthAfter = getCurrentBacking(e); + assert excessAfter == 0; +} + +// @title gifting Gho doesn't create excess or dearth +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule giftingGhoDoesntCreateExcessOrDearth() +{ + env e; + feeLimits(e); + priceLimits(e); + address sender; + uint128 amount; + uint256 excess; uint256 dearth; + excess, dearth = getCurrentBacking(e); + + giftGho(e, sender, amount); + + uint256 excessAfter; uint256 dearthAfter; + excessAfter, dearthAfter = getCurrentBacking(e); + assert excessAfter == excess && dearthAfter == dearth; +} + +// @title gifting Underlying doesn't create excess or dearth +// STATUS: PASS +// https://prover.certora.com/output/6893/1a85cb3aac6942abad66e5508f7d37f7/?anonymousKey=4cff2c39342d22aac51f08bb6fdbb375c0f025c6 +rule giftingUnderlyingDoesntCreateExcessOrDearth() +{ + env e; + feeLimits(e); + priceLimits(e); + address sender; + uint128 amount; + uint256 excess; uint256 dearth; + excess, dearth = getCurrentBacking(e); + + giftUnderlyingAsset(e, sender, amount); + + uint256 excessAfter; uint256 dearthAfter; + excessAfter, dearthAfter = getCurrentBacking(e); + assert excessAfter == excess && dearthAfter == dearth; +} + +// @title exposure bellow cap is preserved by all methods except updateExposureCap and initialize +// STATUS: PASS +// https://prover.certora.com/output/6893/ada8f51ae4f7440b86c51e44b0848c45/?anonymousKey=6d86bdd46fd01d54e4d129bc12358b790450b57c +rule exposureBelowCap(method f) + filtered { f -> + f.selector != sig:initialize(address,address,uint128).selector + && f.selector != sig:updateExposureCap(uint128).selector + && f.selector != sig:backWithUnderlying(uint256).selector + } +{ + env e; + calldataarg args; + feeLimits(e); + priceLimits(e); + require getCurrentExposure(e) <= getExposureCap(e); + f(e, args); + assert getCurrentExposure(e) <= getExposureCap(e); +} + +// @title backWithUnderlying doesn't create excess +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/41f89457d28046fd8337b785be0f7083?anonymousKey=11cb2f7a6900010275a89d0be8f6af8245bfce3d +// rule backWithUnderlyingDoesntCreateExcess() +// { +// env e; +// feeLimits(e); +// priceLimits(e); +// uint128 amount; +// uint256 excess; uint256 dearth; +// require getCurrentExposure(e) + amount < max_uint256; + +// backWithUnderlying(e, amount); // Reverts if there is no deficit + +// uint256 excessAfter; uint256 dearthAfter; +// excessAfter, dearthAfter = getCurrentBacking(e); +// assert excessAfter <= 1; +// } + +// @title gifting underlying doesn't change storage +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule giftingUnderlyingDoesntAffectStorageSIMPLE() +{ + env e; + feeLimits(e); + priceLimits(e); + + address sender; + uint128 amount; + calldataarg args; + storage initialStorage = lastStorage; + giftUnderlyingAsset(e, sender, amount); + storage storageAfter = lastStorage; + + assert storageAfter[currentContract] == initialStorage[currentContract]; +} + +// @title gifting underlying doesn't change storage +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule giftingGhoDoesntAffectStorageSIMPLE() +{ + env e; + feeLimits(e); + priceLimits(e); + + address sender; + uint128 amount; + storage initialStorage = lastStorage; + giftGho(e, sender, amount) at initialStorage; + storage storageAfter = lastStorage; + + assert storageAfter[currentContract] == initialStorage[currentContract]; +} + +// @title Return values of sellAsset are monotonically inreasing +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/a6b2635ff0d7405daa361c732e2a519e?anonymousKey=506bbd9b65e9cf3e32f27606e38fd713cedfe2df +// rule monotonicityOfSellAsset() { +// env e; +// feeLimits(e); +// priceLimits(e); + +// address recipient; +// uint amount1; +// uint a1; +// uint g1; +// //a1, g1 = sellAsset(e, amount1, recipient); +// a1, g1, _, _ = getGhoAmountForSellAsset(e, amount1); + +// uint amount2; +// uint a2; +// uint g2; +// //a2, g2 = sellAsset(e, amount2, recipient); +// a2, g2, _, _ = getGhoAmountForSellAsset(e, amount2); + +// assert a1 <= a2 <=> g1 <= g2; +// } + +// @title Return values of buyAsset are monotonically inreasing +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/614332d4a677432d988bfd371653a23b?anonymousKey=cd30246db79a8237b02d83f1d390c4832cd1f970 +// rule monotonicityOfBuyAsset() { +// env e; +// feeLimits(e); +// priceLimits(e); + +// address recipient; +// uint amount1; +// uint a1; +// uint g1; +// a1, g1 = buyAsset(e, amount1, recipient); + +// uint amount2; +// uint a2; +// uint g2; +// a2, g2 = buyAsset(e, amount2, recipient); + +// assert a1 <= a2 <=> g1 <= g2; +// } + +// @title Return values of sellAsset are the same as of getGhoAmountForSellAsset +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule sellAssetSameAsGetGhoAmountForSellAsset() { + env e; + feeLimits(e); + priceLimits(e); + + address recipient; + uint amount; + uint a1; + uint g1; + uint a2; + uint g2; + + a1, g1, _, _ = getGhoAmountForSellAsset(e, amount); + a2, g2 = sellAsset(e, amount, recipient); + + assert a1 == a2 && g1 == g2; +} + +// @title buyAsset never returns value lower than the argument +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule correctnessOfBuyAsset() +{ + env e; + feeLimits(e); + priceLimits(e); + + address recipient; + uint amount; + uint a; + uint g; + a, g = buyAsset(e, amount, recipient); + assert a >= amount; +} + +// @title sellAsset never returns value greater than the argument +// STATUS: PASS +// https://prover.certora.com/output/11775/d325dd52f7a4416984e3b9b3188d81c4?anonymousKey=2db655a9466ae77e610d3b8f6229bd4752643f1e +rule correctnessOfSellAsset() +{ + env e; + feeLimits(e); + priceLimits(e); + + address recipient; + uint amount; + uint a; + uint g; + a, g = sellAsset(e, amount, recipient); + assert a <= amount; +} diff --git a/certora/gsm/specs/gsm4626/gho-gsm4626-2.spec b/certora/gsm/specs/gsm4626/gho-gsm4626-2.spec new file mode 100644 index 00000000..e851fb92 --- /dev/null +++ b/certora/gsm/specs/gsm4626/gho-gsm4626-2.spec @@ -0,0 +1,193 @@ +import "../GsmMethods/shared.spec"; +import "../GsmMethods/erc4626.spec"; + +using GhoToken as _ghoTokenHook; +using DummyERC20B as UNDERLYING_ASSET; + +using FixedPriceStrategy4626Harness as _priceStrategy; +using FixedFeeStrategyHarness as _FixedFeeStrategy; + +methods { + // priceStrategy + function _priceStrategy.getAssetPriceInGho(uint256, bool) external returns(uint256) envfree; + function _priceStrategy.getUnderlyingAssetUnits() external returns(uint256) envfree; + + // feeStrategy + function _FixedFeeStrategy.getBuyFeeBP() external returns(uint256) envfree; + function _FixedFeeStrategy.getSellFeeBP() external returns(uint256) envfree; +} + +// @title Rule checks that In the event the underlying asset increases in value relative +// to the amount of GHO minted, excess yield harvesting should never result +// in previously-minted GHO having less backing (i.e., as new GHO is minted backed +// by the excess, it should not result in the GSM becoming under-backed in the same block). +// STATUS: VIOLATED +// Run: https://prover.certora.com/output/11775/de602da1d4cc426bb067f9a0aa4a9a05?anonymousKey=a6365b8a651e118c4ccdfb59df46c26a4d3d32b4 +rule yieldNeverDecreasesBacking() { + env e; + require(getExceed(e) > 0); + cumulateYieldInGho(e); + assert getDearth(e) == 0; +} + +// @title Rule checks that _accruedFees should be <= ghotoken.balanceof(this) with an exception of the function distributeFeesToTreasury(). +// STATUS: PASS +// Run: https://prover.certora.com/output/11775/d3603bd8c03942df80d02a2043b171ca?anonymousKey=0d708c3d21d302cfad1eba8deac83f6eb919cbe2 +rule accruedFeesLEGhoBalanceOfThis(method f) { + env e; + calldataarg args; + + require(getAccruedFee(e) <= getGhoBalanceOfThis(e)); + require(e.msg.sender != currentContract); + require(UNDERLYING_ASSET(e) != GHO_TOKEN(e)); + + if (f.selector == sig:buyAssetWithSig(address,uint256,address,uint256,bytes).selector) { + address originator; + uint256 amount; + address receiver; + uint256 deadline; + bytes signature; + require(originator != currentContract); + buyAssetWithSig(e, originator, amount, receiver, deadline, signature); + } else { + f(e,args); + } + + assert getAccruedFee(e) <= getGhoBalanceOfThis(e); +} + +// @title _accruedFees should never decrease, unless fees are being harvested by Treasury +// STATUS: PASS +// Run: https://prover.certora.com/output/31688/1c8ec1e853e849c5aa4fd26914d0acf3?anonymousKey=30813ba939a055af5f0a09f097782c9805b980a8 +rule accruedFeesNeverDecrease(method f) filtered {f -> f.selector != sig:distributeFeesToTreasury().selector} { + env e; + calldataarg args; + uint256 feesBefore = getAccruedFee(e); + + f(e,args); + + assert feesBefore <= getAccruedFee(e); +} + +// @title For price ratio == 1, the total assets of a user should not increase. +// STATUS: VIOLATED +// https://prover.certora.com/output/11775/8448c89e18e94cb9a9ba21eb95b2efb0?anonymousKey=6f9f80c71040f75b35dece32a73442f84140e6ce +// https://prover.certora.com/output/31688/4f70640081d6419fa999271d91a4ba89?anonymousKey=877a8c262875da9a8c04bda11d0c36facf5aa390 +// Passing with Antti's model of 4626 (with some timeouts) https://prover.certora.com/output/31688/7c83d14232934b349d17569688a741fe?anonymousKey=0b7f3177ea39762c6d9fa1be1f7b969bda29f233 +// +// For price ratio == 1, the total assets of a user should not increase +rule totalAssetsNotIncrease(method f) filtered {f -> f.selector != sig:seize().selector + && f.selector != sig:rescueTokens(address, address, uint256).selector && + f.selector != sig:distributeFeesToTreasury().selector && + f.selector != sig:giftGho(address, uint256).selector && + f.selector != sig:giftUnderlyingAsset(address, uint256).selector && + f.selector != sig:buyAssetWithSig(address, uint256, address, uint256, bytes).selector && + f.selector != sig:sellAssetWithSig(address, uint256, address, uint256, bytes).selector} { + env e; + + // we focuse on a user so remove address of contracts + require e.msg.sender != currentContract; + + require(getPriceRatio() == 10^18); + // uint8 underlyingAssetDecimals; + // require underlyingAssetDecimals <= 36; + // require to_mathint(_priceStrategy.getUnderlyingAssetUnits()) == 10^underlyingAssetDecimals; + feeLimits(e); + priceLimits(e); + mathint underlyingAssetUnits = _priceStrategy.getUnderlyingAssetUnits(); + + address other; + address receiver; + uint256 amount; + address originator; + + // This is here due to FixedPriceStrategy4626 since we need + // to say that previewRedeem respects price ratio == 1, i.e., + // you still buy same amount of shares for the given gho. + require(getAssetPriceInGho(e, amount, false) * underlyingAssetUnits/getPriceRatio() == to_mathint(amount)); + + require receiver != currentContract; // && receiver != originator && receiver != e.msg.sender; + require originator != currentContract; // && originator != e.msg.sender; + require other != e.msg.sender && other != receiver && other != originator && other != currentContract; + mathint totalAssetOtherBefore = getTotalAsset(e, other, getPriceRatio(), underlyingAssetUnits); + + mathint totalAssetBefore = assetOfUsers(e, e.msg.sender, receiver, originator, getPriceRatio(), underlyingAssetUnits); + + functionDispatcher(f, e, receiver, originator, amount); + + mathint totalAssetAfter = assetOfUsers(e, e.msg.sender, receiver, originator, getPriceRatio(), underlyingAssetUnits); + + assert totalAssetBefore >= totalAssetAfter; + assert totalAssetOtherBefore == getTotalAsset(e, other, getPriceRatio(), underlyingAssetUnits); +} + + +// @title Rule checks that an overall asset of the system (UA - minted gho) stays same. +// STATUS: VIOLATED +// https://prover.certora.com/output/11775/de602da1d4cc426bb067f9a0aa4a9a05?anonymousKey=a6365b8a651e118c4ccdfb59df46c26a4d3d32b4 +// The attempts to solve the timeout: +// For the general condition: +// - general limits + standard timeout - https://prover.certora.com/output/31688/a49f76f4578b4b4ab70b72576bbb0189?anonymousKey=bc3a2e3aae14596c9ba1adc5c566b718c4d02e96 +// - 1000 fees && fixed price ratio + standard timeout - https://prover.certora.com/output/31688/08d21e1c60a546cda151d762d3e6acf2?anonymousKey=50f50e1fc767bae84a3b44c9d4a92aad03cdcc4e +// - 1000 fees && fixed price ratio + 10000 smt solving timeout - https://prover.certora.com/output/31688/0f520b4cf02e4770a804a94bc49120ec?anonymousKey=5581daad6a74234f25bc80a170fd92ace68f4f4c +// - Rule is split to individual ones with fixed UA decimal units https://prover.certora.com/output/31688/5b6cd5108e544841bb30c48852827007?anonymousKey=0a0aa495023d36ecceeb386fe5b170392da2627b +// Provd that no underbacking happes, i.e. diff >= 0 +// - general limits + standard timeout https://prover.certora.com/output/31688/caa6714046234cd18e4f09c397dfeec4?anonymousKey=00dc26cf5a0b355c09092650aae7e1f1adf48136 +rule systemBalanceStabilitySell() { + uint256 amount; + address receiver; + env e; + require currentContract != e.msg.sender; + require currentContract != receiver; + + feeLimits(e); + priceLimits(e); + require(getAssetPriceInGho(e, amount, false) * _priceStrategy.getUnderlyingAssetUnits()/getPriceRatio() == to_mathint(amount)); + + mathint ghoMintedBefore = getGhoMinted(e); + mathint balanceBefore = balanceOfUnderlyingDirect(e, currentContract); + + sellAsset(e, amount, receiver); + + mathint ghoMintedAfter = getGhoMinted(e); + mathint balanceAfter = balanceOfUnderlyingDirect(e, currentContract); + + mathint diff = getAssetPriceInGho(e, assert_uint256(balanceAfter - balanceBefore), false) - ghoMintedAfter + ghoMintedBefore; + //assert diff >= 0; // no underbacking + assert diff >= 0 && diff <= 1; +} + + +// @title Rule checks that an overall asset of the system (UA - minted gho) stays same. +// STATUS: TIMEOUT +// https://prover.certora.com/output/31688/905f225066a04f9394d8ea5adee5274d?anonymousKey=5c95ad70db18bf9b3dcdc74f7f781e01e50d0550 +// No underbacking happens, i.e. diff <= 1 - proved https://prover.certora.com/output/31688/16161fec79664619a9a72c52a58cb36a/?anonymousKey=80739ecd169b7e28964092556cb66c0e9aa42ebc +rule systemBalanceStabilityBuy() { + uint256 amount; + address receiver; + env e; + require currentContract != e.msg.sender; + require currentContract != receiver; + + feeLimits(e); + priceLimits(e); + require(getAssetPriceInGho(e, amount, false) * _priceStrategy.getUnderlyingAssetUnits()/getPriceRatio() == to_mathint(amount)); + + uint256 ghoBucketCapacity; + uint256 ghoMintedBefore; + ghoBucketCapacity, ghoMintedBefore = getFacilitatorBucket(e); + mathint balanceBefore = balanceOfUnderlyingDirect(e, currentContract); + mathint ghoExceedBefore = getExceed(e); + require ghoBucketCapacity - ghoMintedBefore > ghoExceedBefore; + + buyAsset(e, amount, receiver); + + mathint ghoMintedAfter = getGhoMinted(e); + mathint balanceAfter = balanceOfUnderlyingDirect(e, currentContract); + + + mathint diff = getAssetPriceInGho(e, assert_uint256(balanceBefore - balanceAfter), true) - ghoMintedBefore + ghoMintedAfter - ghoExceedBefore; + // assert diff <= 1; // No underbacking happens. + assert -1 <= diff && diff <= 1; +} + diff --git a/certora/gsm/specs/gsm4626/gho-gsm4626.spec b/certora/gsm/specs/gsm4626/gho-gsm4626.spec new file mode 100644 index 00000000..22726965 --- /dev/null +++ b/certora/gsm/specs/gsm4626/gho-gsm4626.spec @@ -0,0 +1,184 @@ +import "../GsmMethods/methods4626_base.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/erc4626.spec"; + +// @title solvency rule - buyAsset Function +// STATUS: VIOLATED +// https://prover.certora.com/output/11775/0b04906c237b4a1e8ac5b7ffc1e9f449?anonymousKey=cf620b132aaadb33116c93025269fbbe5258070c + +// rule enoughULtoBackGhoBuyAsset() +// { +// uint256 _currentExposure = getAvailableLiquidity(); +// uint256 _ghoMinted = getGhoMinted(); +// uint256 _underlyingAssetUnits = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals; +// // require underlyingAssetDecimals == 18; +// require to_mathint(_underlyingAssetUnits) == 10^underlyingAssetDecimals; + +// // uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// // require priceRatio >= 10^16 && priceRatio <= 10^20; +// // uint256 buyFeeBP = getBuyFeeBP(); +// // require buyFeeBP == 4000; +// // rounding up for over-approximation +// uint256 _ghoBacked = _priceStrategy.getAssetPriceInGho(_currentExposure, true); +// require _ghoBacked >= _ghoMinted; +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 amount; +// address receiver; + +// buyAsset(e, amount, receiver); + +// uint256 ghoMinted_ = getGhoMinted(); +// uint256 currentExposure_ = getAvailableLiquidity(); + +// // rounding down for over-approximation +// uint256 ghoBacked_ = _priceStrategy.getAssetPriceInGho(currentExposure_, false); + +// assert to_mathint(ghoBacked_+1)>= to_mathint(ghoMinted_) +// ,"not enough currentExposure to back the ghoMinted"; +// } + +// @title solvency rule - sellAsset function +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/bfafe4ddbb6947a8ae86635dd14a6eb8?anonymousKey=4e0a75d10aaadeba18ea4d3a9ecfcfdb0c1f2188 +// rule enoughUnderlyingToBackGhoRuleSellAsset() +// { +// uint256 _currentExposure = getAvailableLiquidity(); +// uint256 _ghoMinted = getGhoMinted(); +// // uint256 _underlyingAssetUnits = _priceStrategy.getUnderlyingAssetUnits(); +// // uint8 underlyingAssetDecimals; +// // require underlyingAssetDecimals == 18; +// // require to_mathint(_underlyingAssetUnits) == 10^underlyingAssetDecimals; + +// // uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// // require priceRatio >= 10^16 && priceRatio <= 10^20; +// // uint256 sellFeeBP = getSellFeeBP(); +// // require sellFeeBP == 5000; +// uint256 _ghoBacked = _priceStrategy.getAssetPriceInGho(_currentExposure,false); +// require _ghoBacked >= _ghoMinted; + +// uint128 amount; +// address receiver; + +// env e; +// feeLimits(e); +// priceLimits(e); + +// sellAsset(e, amount, receiver); + +// uint256 ghoMinted_ = getGhoMinted(); +// uint256 currentExposure_ = getAvailableLiquidity(); + +// uint256 ghoBacked_ = _priceStrategy.getAssetPriceInGho(currentExposure_, false); + +// assert to_mathint(ghoBacked_+1)>= to_mathint(ghoMinted_) ,"not enough currentExposure to back the ghoMinted"; +// } + + +// @title solvency rule for non buy sell functions +// STATUS: PASSED +// https://prover.certora.com/output/11775/434fcceaf67349e19568b66d7457a35f?anonymousKey=6570aa08aa061ffe7bcf4328ff64714d08764215 +rule enoughULtoBackGhoNonBuySell(method f) +filtered { + f -> !f.isView && + !harnessOnlyMethods(f) && + !buySellAssetsFunctions(f) +}{ + uint256 _currentExposure = getAvailableLiquidity(); + uint256 _ghoMinted = getGhoMinted(); + uint256 _ghoBacked = _priceStrategy.getAssetPriceInGho(_currentExposure,true); + require _ghoBacked >= _ghoMinted; + + env e; + calldataarg args; + + f(e, args); + + uint256 ghoMinted_ = getGhoMinted(); + uint256 currentExposure_ = getAvailableLiquidity(); + + uint256 ghoBacked_ = _priceStrategy.getAssetPriceInGho(_currentExposure,true); + assert ghoBacked_ >= ghoMinted_,"not enough currentExposure to back the ghoMinted"; +} + + +// @title if fee > 0: +// 1. gho received by user is less than assetPriceInGho(underlying amount) in sell asset function +// 2. gho paid by user is more than assetPriceInGho(underlying amount received) +// 3. gho balance of contract goes up + +// STATUS: PASSED +// https://prover.certora.com/output/11775/434fcceaf67349e19568b66d7457a35f?anonymousKey=6570aa08aa061ffe7bcf4328ff64714d08764215 + + + +rule NonZeroFeeCheckSellAsset(){ + uint256 _underlyingAssetUnits = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals; + require underlyingAssetDecimals <78; + require to_mathint(_underlyingAssetUnits) == 10^underlyingAssetDecimals; + address receiver; + uint256 _receiverGhoBalance = _ghoToken.balanceOf(receiver); + uint256 _GSMGhoBalance = _ghoToken.balanceOf(currentContract); + uint256 _accruedFee = getAccruedFees(); + uint256 amount; + uint256 amountInGho = _priceStrategy.getAssetPriceInGho(amount, false); + require _FixedFeeStrategy.getSellFee(amountInGho) > 0; + env e; + basicBuySellSetup(e, receiver); + + + sellAsset(e, amount, receiver); + + uint256 receiverGhoBalance_ = _ghoToken.balanceOf(receiver); + uint256 GSMGhoBalance_ = _ghoToken.balanceOf(currentContract); + mathint GSMGhoBalanceIncrease = GSMGhoBalance_ - _GSMGhoBalance; + uint256 accruedFee_ = getAccruedFees(); + mathint accruedFeeIncrease = accruedFee_ - _accruedFee; + mathint ghoReceived = receiverGhoBalance_ - _receiverGhoBalance; + + assert ghoReceived < to_mathint(amountInGho),"fee not deducted from gho minted for the given UL amount"; + assert GSMGhoBalance_ > _GSMGhoBalance ,"GMS gho balance should increase on account of fee collected"; + assert accruedFee_ > _accruedFee,"accruedFee should increase in a sell asset transaction"; + assert accruedFeeIncrease == GSMGhoBalanceIncrease,"accrued fee should increase by the same amount as the GSM gho balance"; +} + + +// STATUS: PASSED +// https://prover.certora.com/output/11775/434fcceaf67349e19568b66d7457a35f?anonymousKey=6570aa08aa061ffe7bcf4328ff64714d08764215 +rule NonZeroFeeCheckBuyAsset(){ + + uint256 _underlyingAssetUnits = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals; + require underlyingAssetDecimals <78; + require to_mathint(_underlyingAssetUnits) == 10^underlyingAssetDecimals; + address receiver; + uint256 _receiverGhoBalance = _ghoToken.balanceOf(receiver); + uint256 _GSMGhoBalance = _ghoToken.balanceOf(currentContract); + uint256 _accruedFee = getAccruedFees(); + uint256 amount; + uint256 amountInGho = _priceStrategy.getAssetPriceInGho(amount, true); + uint256 fee = _FixedFeeStrategy.getBuyFee(amountInGho); + require fee > 0; + env e; + basicBuySellSetup(e, receiver); + + + buyAsset(e, amount, receiver); + + uint256 receiverGhoBalance_ = _ghoToken.balanceOf(receiver); + uint256 GSMGhoBalance_ = _ghoToken.balanceOf(currentContract); + mathint GSMGhoBalanceIncrease = GSMGhoBalance_ - _GSMGhoBalance; + uint256 accruedFee_ = getAccruedFees(); + mathint accruedFeeIncrease = accruedFee_ - _accruedFee; + mathint ghoReceived = receiverGhoBalance_ - _receiverGhoBalance; + + assert ghoReceived < to_mathint(amountInGho),"fee not deducted from gho minted for the given UL amount"; + assert GSMGhoBalance_ > _GSMGhoBalance ,"GMS gho balance should increase on account of fee collected"; + assert accruedFee_ > _accruedFee,"accruedFee should increase in a sell asset transaction"; + assert accruedFeeIncrease == GSMGhoBalanceIncrease,"accrued fee should increase by the same amount as the GSM gho balance"; +} \ No newline at end of file diff --git a/certora/gsm/specs/gsm4626/gho-gsm_4626_inverse.spec b/certora/gsm/specs/gsm4626/gho-gsm_4626_inverse.spec new file mode 100644 index 00000000..bd95f87f --- /dev/null +++ b/certora/gsm/specs/gsm4626/gho-gsm_4626_inverse.spec @@ -0,0 +1,742 @@ +import "../GsmMethods/methods4626_base.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/erc4626.spec"; + + +// // @title Buy/sell invariants property #6: In case of using a 1:1 ratio and 0 fees, the inverse action of buyAsset must be sellAsset. (e.g. if buyAsset(x assets) needs y GHO, sellAsset(x assets) gives y GHO). +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse5(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 5; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought + 1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse6(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 6; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse7(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 7; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse8(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 8; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse9(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 9; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse10(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 10; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse11(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 11; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse12(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 12; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse13(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 13; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse14(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 14; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse15(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 15; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +// rule buySellInverse16(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 16; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c + +// rule buySellInverse17(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 17; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +priceRatio/UAU) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + +// // STATUS: TIMEOUT +// // https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c + +// rule buySellInverse18(){ +// uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); +// uint8 underlyingAssetDecimals = 18; +// require to_mathint(UAU) == 10^underlyingAssetDecimals; + +// uint256 priceRatio = _priceStrategy.PRICE_RATIO(); +// require priceRatio == 10^18; + +// uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); +// uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); +// require buyFee == 0 && sellFee == 0; + +// uint256 assetsBuy; +// address receiver1; +// uint256 assetsBought; +// uint256 ghoSold; +// env e1; +// assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + +// uint256 assetsSell; +// address receiver2; +// uint256 assetsSold; +// uint256 ghoBought; +// env e2; +// assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + +// assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +// } + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c + +rule buySellInverse19(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 19; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c + +rule buySellInverse20(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 20; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse21(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 21; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse22(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 22; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse23(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 23; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse24(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 24; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse25(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 25; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse26(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 26; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + +// STATUS: PASS +// https://prover.certora.com/output/11775/8250b43937bb4c14a6468c51aa024e7a?anonymousKey=87764143874e8e012d1418e95780c6da3e7bf12c +rule buySellInverse27(){ + uint256 UAU = _priceStrategy.getUnderlyingAssetUnits(); + uint8 underlyingAssetDecimals = 27; + require to_mathint(UAU) == 10^underlyingAssetDecimals; + + uint256 priceRatio = _priceStrategy.PRICE_RATIO(); + require priceRatio == 10^18; + + uint256 buyFee = _FixedFeeStrategy.getBuyFeeBP(); + uint256 sellFee = _FixedFeeStrategy.getSellFeeBP(); + require buyFee == 0 && sellFee == 0; + + uint256 assetsBuy; + address receiver1; + uint256 assetsBought; + uint256 ghoSold; + env e1; + assetsBought, ghoSold = buyAsset(e1, assetsBuy, receiver1); + + uint256 assetsSell; + address receiver2; + uint256 assetsSold; + uint256 ghoBought; + env e2; + assetsSold, ghoBought = sellAsset(e2, assetsSell, receiver2); + + assert assetsBought == assetsSold => to_mathint(ghoBought +1) >= to_mathint(ghoSold),"buying and selling should be inverse in case of 1:1 price ratio and 0 fees"; +} + + diff --git a/certora/gsm/specs/gsm4626/optimality4626.spec b/certora/gsm/specs/gsm4626/optimality4626.spec new file mode 100644 index 00000000..01da4445 --- /dev/null +++ b/certora/gsm/specs/gsm4626/optimality4626.spec @@ -0,0 +1,252 @@ +import "../GsmMethods/methods4626_base.spec"; +import "../GsmMethods/aave_price_fee_limits.spec"; +import "../GsmMethods/methods_divint_summary.spec"; +import "../GsmMethods/erc4626.spec"; + +// @Title 4626: For values given by `getAssetAmountForBuyAsset`, the user can only get more by paying more +// STATUS: https://prover.certora.com/output/11775/e8e6630d5b58425d8c0b6a251ff080be?anonymousKey=900815aac4f3703ba08d4a8c64402ac6cc9979bf +// This rule proves the optimality of getAssetAmountForBuyAsset with respect to +// buyAsset in the following sense: +// +// User wants to buy as much asset as possible while paying at most maxGho. +// User asks how much they should provide to buyAsset: +// - a, _, _, _ = getAssetAmountForBuyAsset(maxGho) +// This results in the user buying DaT assets: +// - Da, Dx = buyAsset(a) +// Is it possible that by not doing as `getAssetAmountForBuyAsset(maxGho)` says, the user would have +// gotten a better deal, i.e., paying still less than maxGho, but getting more assets. If this is the +// case, then the following holds: +// There is a value `a'` such that +// - Da', Dx' = buyAsset(a) +// - Dx' <= Dx +// - Da' > Da +// Solved: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (1) + +rule R1_optimalityOfBuyAsset_v1() { + env e; + feeLimits(e); + priceLimits(e); + address recipient; + + uint maxGho; + uint a; + a, _, _, _ = getAssetAmountForBuyAsset(e, maxGho); + + uint Da; + uint Dx; + Da, Dx = buyAsset(e, a, recipient); + + uint ap; + uint Dap; + uint Dxp; + Dap, Dxp = buyAsset(e, ap, recipient); + require Dxp <= Dx; + assert Dap <= Da; +} + +// @Title 4626: User cannot buy more assets for same `maxGho` by providing a lower asset value than the one given by `getAssetAmountForBuyAsset(maxGho)` +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/2270a93b48984d0583c1334442bb11a5?anonymousKey=1655942848f2863b7612cbe27aa433868432fe8b +// This rule proves the optimality of getAssetAmountForBuyAsset with respect to +// buyAsset in the following sense: +// +// User wants to buy as much asset as possible while paying at most maxGho. +// User asks how much they should provide to buyAsset: +// - a, _, _, _ = getAssetAmountForBuyAsset(maxGho) +// This results in the user buying Da assets: +// - Da, _ = buyAsset(a) +// Is it possible that by not doing as `getAssetAmountForBuyAsset(maxGho)` says, the user would have +// gotten a better deal, i.e., paying still less than maxGho, but getting more assets. If this is the +// case, then the following holds: +// There is a value `a'` such that +// - Da', Dx' = buyAsset(a) +// - Dx' <= maxGho +// - Da' > Da +// Times out: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (2) + +// rule R2_optimalityOfBuyAsset_v2() { +// env e; +// feeLimits(e); +// priceLimits(e); +// address recipient; + +// uint maxGho; +// uint a; +// a, _, _, _ = getAssetAmountForBuyAsset(e, maxGho); + +// uint Da; +// Da, _ = buyAsset(e, a, recipient); + +// uint ap; +// uint Dap; +// uint Dxp; +// Dap, Dxp = buyAsset(e, ap, recipient); +// require Dxp <= maxGho; +// assert Dap <= Da; +// } + +// @Title 4626: For values given by `getAssetAmountForSellAsset`, the user can only get more by paying more +// STATUS: https://prover.certora.com/output/11775/f7389a715d5c4e8d88ad6f9666704adf?anonymousKey=cf8fa7dda6e2b9dedece7d13afae0f2ddc509258 +// This rule proves the optimality of getAssetAmountForSellAsset with respect to +// sellAsset in the following sense: +// +// User wants to sell as little assets as possible while receiving at least `minGho`. +// User asks how much should they provide to sellAsset: +// - a, _, _, _ = getAssetAmountForSellAsset(minGho) +// This results in the user selling Da assets and receiving Dx GHO: +// - Da, Dx = sellAsset(a) +// Is it possible that by not doing as `getAssetAmountForSellAsset(minGho)` says, the user would have +// gotten a better deal, i.e., receiving at least Dx GHO, but selling less assets. If this is the +// case, then the following holds: +// There is a value `a'` such that +// - Da', Dx' = sellAsset(a') +// - Dx' >= Dx +// - Da' < Da +// Solved: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (3) + +rule R3_optimalityOfSellAsset_v1 { + env e; + feeLimits(e); + priceLimits(e); + address recipient; + + uint minGho; + uint a; + a, _, _, _ = getAssetAmountForSellAsset(e, minGho); + + uint Da; + uint Dx; + Da, Dx = sellAsset(e, a, recipient); + + uint ap; + uint Dap; + uint Dxp; + Dap, Dxp = sellAsset(e, ap, recipient); + require Dxp >= Dx; + assert Dap >= Da; +} + +// @Title 4626: User cannot sell less assets for same `minGho` by providing a lower asset value than the one given by `getAssetAmountForSellAsset(minGho)` +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/f6ba80137c2e45458ec7c7f3fd54a5c3?anonymousKey=f21ea27b70d5c54e405794b70e5f6221466718f7 +// This rule proves the optimality of getAssetAmountForSellAsset with respect to +// sellAsset in the following sense: +// +// User wants to sell as little assets as possible while receiving at least `minGho`. +// User asks how much should they provide to sellAsset: +// - a, _, _, _ = getAssetAmountForSellAsset(minGho) +// This results in the user selling DaT assets: +// - Da, _ = sellAsset(a) +// Is it possible that by not doing as `getAssetAmountForSellAsset(minGho)` says, the user would have +// gotten a better deal, i.e., receiving still at least minGho, but selling less assets. If this is the +// case, then the following holds: +// There is a value `a'` such that +// - Da', Dx' = sellAsset(a') +// - Dx' >= minGho +// - Da' < Da +// Times out: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (4) +// rule R4_optimalityOfSellAsset_v2() { +// env e; +// feeLimits(e); +// priceLimits(e); +// address recipient; + +// uint minGho; +// uint a; +// a, _, _, _ = getAssetAmountForSellAsset(e, minGho); + +// uint Da; +// Da, _ = sellAsset(e, a, recipient); + +// uint ap; +// uint Dap; +// uint Dxp; +// Dap, Dxp = sellAsset(e, ap, recipient); +// require Dxp >= minGho; +// assert Dap >= Da; +// } + +// @Title 4626: The GHO received by selling asset using values from `getAssetAmountForSellAsset(minGho)` is upper bounded by `minGho` + oneAssetinGho - 1 +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/f4ebd94360be4faab6988ae46c11a488?anonymousKey=4a045705983f7d61295d79023c49d981793c1a36 +// External optimality of sellAsset. Shows that the received amount is as close as it can be to target +// Times out: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (5) +// rule R5_externalOptimalityOfSellAsset { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 minGhoToReceive; +// uint256 ghoToReceive; + +// _, ghoToReceive, _, _ = getAssetAmountForSellAsset(e, minGhoToReceive); +// uint256 oneAssetInGho = getAssetPriceInGho(e, 1, true); +// // assert to_mathint(ghoToReceive) <= minGhoToReceive + oneAssetInGho; +// assert to_mathint(ghoToReceive) < minGhoToReceive + oneAssetInGho; +// // assert to_mathint(ghoToReceive) != minGhoToReceive + oneAssetInGho; +// } + +// @Title 4626: The GHO received by selling asset using values from `getAssetAmountForSellAsset(minGho)` can be equal to `minGho` + oneAssetInGho - 1 +// STATUS: PASS +// https://prover.certora.com/output/11775/944a0631a18846e39fe519d7e0f631b8?anonymousKey=613fae239e703cd94f7b6c2c9081bfaca941bf0a +// External optimality of sellAsset. Show the tightness of (5) +// Holds: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (5a) +// +// +rule R5a_externalOptimalityOfSellAsset { + env e; + feeLimits(e); + priceLimits(e); + + uint256 minGhoToReceive; + uint256 ghoToReceive; + + _, ghoToReceive, _, _ = getAssetAmountForSellAsset(e, minGhoToReceive); + uint256 oneAssetInGho = getAssetPriceInGho(e, 1, true); + satisfy to_mathint(ghoToReceive) == minGhoToReceive + oneAssetInGho - 1; +} + +// @Title 4626: The GHO sold by buying asset using values from `getAssetAmountForBuyAsset(maxGho)` is at least `maxGho - 2*oneAssetInGho + 1 +// STATUS: TIMEOUT +// https://prover.certora.com/output/11775/d98963a792454a949ab81f99419bbb9b?anonymousKey=c9f93b1edf28e9c693c1adc0aeafef6cce912a1b +// External optimality of buyAsset. Shows that the received amount is as close as it can be to target +// Times out: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// (6) +// rule R6_externalOptimalityOfBuyAsset { +// env e; +// feeLimits(e); +// priceLimits(e); + +// uint256 maxGhoToSpend; +// uint256 ghoToSpend; + +// _, ghoToSpend, _, _ = getAssetAmountForBuyAsset(e, maxGhoToSpend); +// uint256 oneAssetInGho = getAssetPriceInGho(e, 1, true); +// assert to_mathint(maxGhoToSpend) <= ghoToSpend + 2*oneAssetInGho - 1; +// } + +// @Title 4626: The GHO sold by buying asset using values from `getAssetAmountForBuyAsset(maxGho)` can be equal to `maxGho - 2*oneAssetInGho + 1 +// STATUS: PASS +// https://prover.certora.com/output/11775/944a0631a18846e39fe519d7e0f631b8?anonymousKey=613fae239e703cd94f7b6c2c9081bfaca941bf0a +// External optimality of buyAsset. Show the tightness of (6) +// (6a) +// Holds: https://prover.certora.com/output/40748/b6ded393db3441649a6969f207037e79?anonymousKey=840fde79dad71cfc241479f2856eb27c0aa446b9 +// Counterexample is buy fee = 1 BP, maxGhoToSpend = 1, oneAssetInGho = 1, ghoToSpend = 0 +rule R6a_externalOptimalityOfBuyAsset { + env e; + feeLimits(e); + priceLimits(e); + + uint256 maxGhoToSpend; + uint256 ghoToSpend; + + _, ghoToSpend, _, _ = getAssetAmountForBuyAsset(e, maxGhoToSpend); + uint256 oneAssetInGho = getAssetPriceInGho(e, 1, true); + satisfy to_mathint(maxGhoToSpend) == ghoToSpend + 2*oneAssetInGho - 1; +} diff --git a/certora/reports/Formal_Verification_Report_of_GHO_Stability_Module.pdf b/certora/reports/Formal_Verification_Report_of_GHO_Stability_Module.pdf index d68772a778f3d377ba2c6712b0d236588d956bfc..2f27b3103c3d239539615378548eebe895ba4ef1 100644 GIT binary patch literal 873699 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ξU2rlQUf4*K9Z3>mydQPR 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 z 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ª@;-nkd)b?|08c%!Rpd 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⁣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 z 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�C-PDxncpBBj|_9j&g?T^ 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�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

i&#`tvNZq*&8EjIwf4OOQf=yQ62AUs~$2Hqo~w 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%0D3mJoU*8B`SmL%{xg8m(?9kG zu3s?C?}wfZo>Ih>o-l8MfEwH&*2anD*^~a)O#A_ov9Ng`JJfYX@TT2OSb-4fg?dg< zJ9Y+?m^SDW2&8QsjP#B6y9a@AAr%!ZL9}s{mf!&q%8R;fpCSri|12zA_Pt#zZA|Cr z;D{MYqdfZKnX>~VM?4w$jm0=ld>^e8t$3HB67b3j#j3s$1Ko>9)i({U#-p5&wfVSZ zNj~5F%?nn5i@NhAeAW2DAZpXSm-0-zUDd%D=P$~2tEs7{PCHV^mOV$lu^=eK&~RzP z-=zD$D7t0`he?JgU`ov4JkVSKY(|>`+HT}6moR|@zQf&iq-76Es5z(?fEEHbZ_fF3*yg>JvmjbxnAsp^oZuRdp9pK3 zK+ew<)fOdA!n)wZcbYf$|6Qxf{m;Z;WPzNlr@I#+XOfb#C#!TBzntc!3#x6-%BuK8 z{j#_+EoU4CiK?7&06ev35MrDb$k`I*a|DxTT+egzR6zBX(&{%W+3Dx5xq zveXRyrKPy5E68$l6$48Dg#6eCyo#E=R?=tg;^%TIXq@a7B~yU}3+ZV7BTgW&WjlUO zuM>NH>>ub~B`3pafY#1x@&~FM#5inkQ@tz)5J;gqh^+Au1S4`rEC!tv;jgY6wzz4r z%3iWDVQp=LzlGEC?&?bD<4|w`P&o-c*HsH^m!T4fkwS>dx%L`s8_n!Dyw)$7qo2Ze zCsjq5sPUqOjL*_!p7qP@8DCYE|BfDp`hqE(2haEc5pbT)3SX85N{W_NK9q9GDHF0Zrl3wp>JdRFBiI=dX zy^KaD(0$>8jOb=rcJe@NO+Bo@XGA_^7g#!bJghd~ajvI_Jny>2-Im_!+Ww*P(swC& zsoxq}$RBEzBuf^%u1dSzLAj0nxG1TJczWuf`_-lqr|j9Y85WqVAj)XJ4`FViM`Gu$ z>4&Y=K9jyaF;r>9Mk#PW`M$)gKv-bWPfL=VpgOboDsXC(Kt$Lr@F~cqVcafCxXW#OkR1JtaYQdNrYVeYz+dGUO zW@DY2Iii$be9>&dlxwE?d-#t&Lvxg?@buul(WwHiI=?iBBP;LFP~Y||gM-}Q?H+#i zk7Goyh*#n_E~&^Q$@Y_xmULNO+B-;Gr6tev@hSE?2Da?>FBwct0loGDh`}+}Uslc? zu7qO?TtEDyqQb|}u1P;D1{^L@;_~d7wzIe^;=?$Ddv46_)AD?inUnh_GgM94yWV31 z8W5o6paf+{S)vtQiHgFF_Tt*W@FJtq?<3c}hNjFQnsmD(Eh!43IdMr+h*tm_s- znqnnD!+}vDc`gYpmZx*F;fnxeiL4VY&Z^=5&D@*yW)0M=?A;WyWTC2konj{p28>OB z3v_f2SM-Q*`US^)ay-raXD>>3WM32|2P?{X|BcvBAcQJHu2Xp1IUvQHn@^Zyaxq{R zRvhE&4PXunPfL>$?s=?&ld+EJ5gft$KnV~?ECwRtF7 zQ|&(m=0OY~tCPMnE2<$3t`q^FGx_n!)( zD%^cSm7C+p`8xH;3w`OxfZEU8xsG__>t~ z^Nm#QEr;tfGfsy^H$BX3%J69LurY8m|H)G=UYVp0kPVRDg3uV{$wt}!3H0>YkBW|7 zey?&;_&82f544h|oV1lr@~^vTJ@a9_i$0_l#UdJHNS*Nk!F+EA9LH~mJ>P#M- z_`VAJ?L$QBuYfS6TU87g2k6FHgLetEpnN8)r+4l5|J47+#`>Gng}Z78O^)7LT?shW zlQK>XI#Nyl;{%S4u})__bN)ZZ`G)%1I!t|iaw~2*kba>sn3m}kBL6<^e(%2)igVcs;cLW8}r#u`bZCuwl%lDh)eKJo?1@1Ray~U-0Hcg z{Stu<&I3otkL*Xa6{z?D2n4ps>*A!#qbm_-Fxt~lr}RVNeg#uhCg-u?vfn(xu@&Z+ z1Oeykw^!+MAThgG)#v>E)^E%b+VJv0eA)#yV$^$3Rv_erOQtZntT;6rGDjkl+Brr^ zAYh2!Jn`CmitZoS zi*drwKNAAyZtzvSLQ5ViyVT>arNxw(@H^-bjCXt!a@2W#{+xwI8;F_b*rjiB;+)ge zp-QxQ4f~*Fwz0c;A#)tH27Ecyg8hr6r-Y>123nc4Tp?t{h9TNl;(HY`9))+=j<2F+ zogA(&rtG1Gs!34TZ0g7B>|pFz?lenCBLs4@op(!?{*5Uay!UKTG-f$S(h@}&^7}~Y z%(>`RR1}Df>)XNTcJ$Dssk)`5Mm&!@n1K9&YRuJI2wWBJ$a~%EB0~8IWpS9)DuM7c zDiTDvSA49u=jL07A65%DSj7nh!?Vw8Qf}l56+-RKcm*!WQOIh*bf`%yvp=jUMMJVe zPEk8{_d5@zxN?BCjjXV=hkFB*kPeO#4{9xD-B>~G=f&nKtwepO#5rOT5?ksHmcn3v z4APnEcdI^3Kzje>WLB?;unK2HPy>^SK|M+%z~{{`rLpx?6z-SV4V{4a;xyf;jUG{d zrzj`KKu3?Js=oHV&@SX@-<)asC#QZ!6{KN!ZPCw)r$1t7h}S?Ih}xEw6}ZuO*&OUmwi|0p@}l~eYnBV??5BQe@= zc{!whEgi}S1Uh5wKov5Y_a-#wm#d-Tnwhs1R)6q;qO5es+XfdkRbD&@4T!7TEy@M( zC|FVqR_YtHa9b{DRNuu5S$}x%xd}i1hufadlQJt2D&*>| ztUG_AY3S+5FPPn43dT*2`xT%zN&1y!J+3qhc;WQEevy0th^ykb@3t)@SdfEaG0E!8 z5K{$x4jbAjVNu0LCGDpUs)mm+^s(x_FQ6Tvr!!exM41G!6yY+XSBsCVkBNWND2F9t)OF#wtVD4TO|cuksLl z17}NeXD}$K0%LcpDFk}Vy2T@bAlHl%Y9+7ZNR9*R1on-4#MbSqhE4{cBBmG6g5UrE zK8MmEP2*%h0|iB>dkyMGb%4&$Shs_EV6ClohiiXa7U0yBVUX{ig)STiz48cBQQ>iKe~ zEv#<^iWuo+-0>dzHh^hm)8A=Eztdnmhotb?y2?sG4K*nRB$X&~4k;c8XehdS3uoT0 z!C09df9%V+OIO-f;E!8gA`g0$;b`Yx-w&IOU){}8&&?9o)yJV~he^#i(bZ&I%gw*`8W_dZ8riRmaQFcaV=q0O1 zi#E-Z>cR|t!CfP8KvMQ5^ef*JsY(Bnld-jP0Qz$}H`Cipwyg@~ct|ZE=BCrUY2ZGO zyg<&$YpZ`Hq>uaK%be6k#%Ce=%hme{M=D&Dcdx`F#6?QL)y2V2KELw}XG?Rdoa|#S zS&Z7eWp3w%>2bTpgR|@xNxBM;g;5fJF0u68ZLhsx$t#SD^Tv038 zEctrUg2G!s$d@FSef&mKD|`ZK=Wvk(4B{jOA~7@+kD0NvGu+cm7z5-lQHHPIHZ>xa z|5tr-&^tTx99@n+#^{##nqI#Fqs;5zj?2ndYG&J{_ zRatY#r)TvwboLF0=IZhLzs+`HKtF!m-KkMUOoALEko0R38nx2I~Z7;p? z1U)TcYDtNS@`54566cUKrc_ZsH~w2jVc)0?SCleHeGEE6XRgN23Fp@|b3{TzwIo2W zrDr%{zI{qYL=F)P=AoAR-a7E-eEbU&=rQZZ;n?$&<+;!NwkUaaZ}CJJcg(hLgY@h`S(vZj^A=}cO6!vx>ILEeP&zvDeFwLvyAER$|ewK-m#rNQU4IU3nVE`AhqZH2Vk% zl~6w56BJi2wzT+ezhr4OvUD+SoV(mQWCTZg1lbAMldIPsA~OOKSq>tj!S-X6EGDzfNR-SiNU_Eae5WWil1)E-;_}==4t< z=wrc&9;deOzOBg{g^?DrF@Z=N@{8RIwnyo%7iQIN?uDr;?&&GSWh6X*O~gSRROYz} z^%iaz_>fP@Bui7wjI$FREO=jGHaAKQx69Z4OR}gf@x5_GwzRZt)G9!JSoZo!1ld6F zEKhpsd62CzIh7!T`DJt>R4*8RsBs5jd$$<=1+e z7jX)(BO-=_{9uT%NC{L_B7!F{P2AqW{`i?VNGCCumV%`4_1g}3wq75LT=Yv3ZsxZ` z_3K+a%h_*ZpoxPKi7SlsOniqf`2UrF%%_o;QNp4JZg44qm}*nxidjw3HKsbANXM_4 znGzEE0ipwO>FI z_l3gi;4SyV)$4p=vgEMA>CO51Nytc99(W5J((G#I&CQNA(VP9n9{l(c9D`8$?N^B2 zf#U?8w2CLk#J|_eL45}J>0W=IeY{a)CL_qK8}r1WiWf7-LEt@k5{5F->6!<$)T1gy zNrF{xwDvqHxb1A9Z-mPgG+w!P?)>Z~I2ItkoFs=XWTHJ;T|ETP;0@t-A_vMy8*=Np zU;mdi-_*LB5*DchadOS^8z}A|z6VJL!$t3()zV-u@epQyh|-E;ByW61XUqVT>` zp=c7g=mqXsPRMx<<;Wp!=&q^v4;gt5U zc3YW5{K0RB+i<8|Vw?`ra-+$Ebs*)2&d$fFJ`>hM&|TUh_AD zeC2-_w3DyVBN*+NI{Io)Gy9pyP?Wy}sVw(ADLhYfsbb z&oC2CY^a8wn3j*1zkG6F%3WVY{6T-m)LSy_0Td#$&rO5urO z{fUpA>3>?;+BdoBRjluL=%`lWK7H|=sB9F#Ka38LlVBDdh-_qVTDl~_N(B)`K-b&1 z_M=N~NJ>Iigab2R;^<*AWT>D3N0Ew)6;}6jlz#XZ5@bJ)LWfsNVaEzRRL& zlSAiip*@2Hn~eG2qM14J=FxxsU&|{rG_H2F$Hm2`Bqq?)Mm3(yf`&loxvt+aD&Tf_V4^5?`3OWec68 z4K7*@!oZG0rT%EQaeb^^v@GlgX9m;-X{c(6ZQiOg`LZ3tvJ$_7Yu{#O0ONFjL__-E z(^BTO{S0B?3=dJ@`U#%DefMMfO?1P4NmLNDP=_$YM6()7|G2J%`k{6r3XUoTVr3lP zNXR{LOyZ~Z`6_-A{{6#r7-ORx@}0r+*ptAy>a%kHrURo(S^hO{W@JoVS(oi)&}T?TL>^B zOtn_ddAr%4_~`)*sjG~nR_0IC>_;yQV&RZ<5Ed1d)57(a);4U1sl!dQB&+h)Z&3sH zng95TDu}4~o5(Q(bSe-cL(>RRoulca2(r5ScBOeMH0~AW<|a^_{NDLX9Q7Gx6HFzQ zEvIn$f2-JfqGk=lSd=mB*f0g{sT zBf&(xDvy{zFga=p-9WoFFs9i!Nn#m}c%N%mwLKj_tly*Ad-v#>xB+ltx7>sS8ekZ& zrM{D8Gj~ousky`*R}HcnZoM-a`P$srk{B23sT}`ai+5;fu#Y=V#%l=JUR8iF*}Uv- zDo``CfAiM=IYjj|b|!wQp9`CA{&pTxrgMGM4~V`Yb!PI_@#%rDQovdfN(9pwoVD;H z!{>*uYg~EGPE?9lfND!MBUz-{Oc4t#mya2~fyIyg{q8>3GXmBA(=s%3IOl|R=L@jo zrGNP>8ymF&;te-|=d%l6zkmKa7>nN4-6iM|9;P9~Yek z9R)>DRNyh~_V*CDEokD-u~K{Pt4?^!FU$o+Uc_?`yN6BDTp$Q_418E&`C%}fY1<@t3Ry*1f`(Y zlc;&12Vl}KeRWb+R)Q=1%bkM=Kh|-m2jTNfNs1s0^I~RZ1LO_jY-Eytn(_G? zJTuO>57I0&Z`+~>K%iI>DU)z)+_i!CYY*@Io2I+ZP00M;OT(C5Q;OJY1sV zb>F;Bf@u!MUx(`*8@2n^7b@RZEbTa8y6O<7nSIn@KI`XSUXD+?%NPk1`{87jW;N_f zKvVExZ_w=CsDY2|!Fv8O#joxO?0-uYauyhC8(bTAD~s#v>K~i9jxWLVP+#K@rzPbW%pc4=eL2kso6_oOI3kadADuhb9|ru zsY|SVP!5jYg_zzcIPtw`dW-^ z^Y(L-xUAEBKeo8-jq^UztV9#mB;Wk&JuVzaVlFyE)ayW;DNfLQBRrnJ+|n!}S^`1j zm+bQVMH*(x=F$)5g3#m~=IOse5z+^YxPG)KO51#c1g_!DHD#(%IPG`7V|bgZ_t zj2}F}5k9@OWrk;(mQ$ErQ1*TIYx#WDiGsI#Mt$kt+>anSwxXW4Hk@?_o`Z9eM9KH= zJUgKv?-4cZInUbZY3Y_ISYE-;o18WFJ7M0+x4)tJ$K`J#+-nJ*4p)pI4f$JlBKoS~ za=-Bj{b%P=j5aQ8%?2K)50Ue{{j+8xCtBIi{50@QZIQd+PJ(%%nVZn_c5~Cp_D`P0 z@zDQI`aN$XG4{FpvW88ajD*>pZ<=;>G;`AY$JLg64$G%^Et3a3xpA==U(z=+(5zR# zqQa1ys(3YB)^leJ8h~V1Wovm_(JRNf0(>K$J6|=-FD&Qd3efH8M3#2cagBxG%-(}< z53$SCDQlCO-^Ga8%AKqi=kTdC&aS`xJ*-x;i~In3(I>9vq>^hb7^au!vZrxY%Wgcc z=iO>>W{JK;X>PFc&v+S(3Vm^H=Xoskfd@!Fg%64|_+dg)e`~8i;%T?_=|v-n$1XlAG$w>=I}2Gm7E5Y71*O+Rcr_^i2Ogw~_vK zTBwj9NBH}klsVsq3jgHHj5PZTH#D0g(_OiCh16jP^yyCxQs^_f7amxc)`Q*KVs)_eL2ZcS8NfTDXOMH2quN7G8s_Y> zR+qTue&7IUV*CraUF}+a-jibadB=FOG=+;kc-ie>%j@x~{HZ zxMww^J&GMnx> z-CCyB_oLq))4x(M#?K*naL|%mp(Dn9Uv#nRg_@MUt&1Va(*t!RLCNlF3Fej-CGU$K z|JoO=t1hpTG9cyI+}yhTNN(!|o&`;$=1%n?I63%#z0~Y1^cmeD!nxt`(6WGdse6V0 z&sxBbd1AJC<*8euftr6_Yb3}cWkpgVEk2?>ykK`bxJeA|D~6sgX8F%+CeF6y_rGj1xd46?aqo(jI$c5$F7})I_XkE0 zbysc0vazyP<#+~$YM%LDYF^Lk>d*)86Ct%zN|UjVUkn4&Q1zuu{@-7yIh&q!znK~eofOc`MEbyq5U!2jAGh)r zg_G3raq^qV2JbmL`pU^HmqujjT-taM5*AWx#?GGT^=^9N#}6%yL9dZJ*PUj}cFFzz z`)Det&;KWPJ}b=Ich_ClH%-WBBD-{4TH6Xt z%nZ1_{yhBJJ?L6-+W)B8kGKzKcXl0g9Ujq5v#}?FiBW57rlbt}gV82TtO#|Lkd`(p zl=w718(LgY_U9;1^KkzSuQ8!CaTD+8mS6D!H8mr%A$pwDho8619QTmmuJeelmwMfHq`h}3-KN2u&t}BPN78GS?1pE;XB;zzR~HIZem}=Nj}`CkS51#e>kKT2*+Yj#@ZErC~)#mVtStE zaOHFArNhizvWeabqd@j8S`9JimD z*RCJQ8+H+wyXsxzc{j5%=s`F0co*2n9_+(=0lcb`}4D+y9zL&Pv-@UpTCO#o8IXV0N zl8~NnbFEBEX8bv~+Ua7qBg{%cty*$Q6Ba;g@6e zKgzzjU*s+&<>OPzO?*C`inCukcRrvsuBmBKf$2chd+&J&JU#x(8nb-v{h8QlUC+&J zcW{5E`@heYOC3^+BR}*?OU&li-H;%847g&;Ovv}kubm6dEuz}V*W>>)zW!NC+{>xo zHoL2-;iSErd3I_A$E=f=sWmJn{mnmFVmwoxqNWEz{qHe&R{k4%LHK&25DYbLR7`l2 zD=OM;bllZd;NrAcMK}l!?8wNjXOHUMmchE< z(_>Y&{&tYp$`12guyW;v7zVR*D4>|Pv%zD{D|U^2{&L4+ely><{ZrjJ{rG{QuC><% zilLcSQ$KXBZX-L?0z76?enV%gK6BuRocQ|6H9*8&n;qzcIe4R0tzgblsQZj9Q@MNS z@&EvLDx~SY9T*xU zrwCQ=>1=5^{aHsP|Lf19<|#L>o~7VS6B>zsFYdEHFz{jqQ$K1NY@*92mKiEi)Omiy zJCaDA6-DNel9mptqaLxdy6ReK*49l_U+~&}QNB#7=MI}=Ad5;HkIb^fcH5O6wVOrh z4KtY5@oshA=iJwSFTU=bo$E;a@FAoN!taW98d>wXBpTM`RULfv%rBc-%bVXZynZS6 z-G|iQX*)xkd{%Gm?V_JmNl5?Q-II(}`R1#e_wi+*lqU2bL;ihMj&N&hx6jqJU0q_P z4nE)e_J1_b$0|==rp!pRsH)(*$nR;i(US%F##R9Pwf=Gn%CMaX!9DA`=dL2m2iD7q z98a+`5-ppy%ftdP0B!o(zjpTwdERonztxg+3pvl+qt2!CadEIHL+FF3WXCfRy?;~@ zb8))rW3B^>>=}t)qhs!sW`9k}rRWHK|6N^qrugsJm6fFmsVZ$bp4jGVbT!S&TJdO> zL@A;R`#P;xLZl!G1Wor;I|BnRU^@a_!_kp@0I*WyOTljN>y+IoXPo z6rs-(Vrxm193QCjKnVm5aQSs9ha{zyH1}K3y*YdQb+v3D4_3j!U`7)$-1`CFm5R*q z*9|Zv`vk93b%-7mVBb&T$VWn}aD@4V*?45{+ZN-mEUisj=cyHr=e}Ck?VTkoY#t_i z03U;;j*IKWqsG|*7+Y_)6`&r$4^z29=X)kK2xZORI#k7_@4VGad{+lOFzW>|`V8*- zAn1i82@9Kf;4jMS0ZB=AS&!`3X;Tc09+AY8fof-xc>a&Kw~Wd%?!E?5Q4vuP0Vx6L zF6l-}Lb^MpQ;?KY=@yWdmTsg&x<#aNNwmkV$2`{IgUoU`{n z`&5^fYG|JQg(fE~#4c7>YxJhDUOQTE?-gS6C0|!;Y1xjgcSqTQT4j66!%0aoBJ2w^ z(}{^l8UoA2V&s{4Ma2eIMz#hTu|L0tkM|x*eTbeM97p9(L#U(!4=xYg4p;)1$+z^) zTQwfcudJNJB_N7`ZjK5pB+OlxLEor@_Z*?&$-T(2b6X+^Au{rxJ}x8`OUI5?`y|rl zW@4K5vcR1I73DGi8)+R?%{J;;fC`KrEcmUc=5=M%Wc9Z;i@lL#FZ^brZ^y+*I?>c> z;HHl*7&bIi4q@&iOP~9KdVmA##L)|)rKjamY>w^2!bo`N2{Necsv&;LpwtvPGM|w@ zOxW1?^=`KV0PzrNLM2(p#l7oM@dz?$+ufakI%_U&_R#0ROrQk&4Kp#m2pdW_+<_U* zUGnjqJi7RSI2h1P<6SOA(5gTEo+H_dXax-MAq`nmyxe%^OnbDAO^VQf;!VWD#Y;vaDJVD8*E!kL z8Yw)$$XM*Q$KpI&*h&q_Ry~cF{qD{fKL>2!T9b8l!d;Oq7#m8k^qv<(QFrgpw&J4n zo}!^z16@De@=45;$t*O`QJh?siUll);YiCy17p zvBAI4J{^>+&NhvU$X%^cb&JP8nZv8=Ed$=vsI^`U4`J)BB%h z`&`9W@nV;sVW|xLF0M-X+TdFZZG7@YbThI-bA>V-4Opu=MQ4vJ$G%kAq35kIttk|SJ2 zX)itNLhpcGnmo%`TSXZxc&W0@K;Q++Xw4wt1RPFI?&q4AG+h58#tMY_!eGoW%9jJe zkb7-drm_9JZWlN2{0c6vaySaCWq1<~e9+%BN04MfhBL|g!DHVav^742d_QS&sKXRf z3ED>*T=^MU-0URI4|5bDHFyVuEOWkb2J*J9HFal^p{R|!B4l^sm8{pnju2my zr@)ZGf~_X4)YaDXG>%vaY}<+|Sy*_g0Y^UN2uS_;j@>O`*I)dmag*qhkmUK+))Z@N zH53^^7$uXGsVNohaO~dl_7@a>yPTalY{$<z7(hTpUXp;%@0H#_ zBo#UM(zHKm+KqC_RHB;J3mV1+-lVc%UoI`xTS*~f2ee8=qhG7v%Dd88O6pUGd#$br z7ic%C#fquleO0xoam}Znl~DNoUz36*%6E_BD(_K>{{lBC{lNMIiKtu!0ls`4;rc!q4GImcX zLeNM`ZH|qtvG5E_MoJpWi*@~dWhrZCBM3W1Nm*RLs1O^tIG z@t&!xdN5*nuI3FIGp%OVY0t2Zl~EW`ka73dyINjy6RXi}s#VPN$3^D+aDeC=Ko6MV zFe7=w(UZTp*x8+}Rw5@h`33otP@5YrF8p2%T4vY>iQ75f&2P~Thu>J6ciK!!4MMSD~KYgaB5i|7YfLOWzEa-8=vn(ceF337e<<|m@D+|KQ2tq z%rJ%|8=y>Z(T)%MGs16knF__lEIiB=B_&|&Atu@$+>=+Lvvi1xqBoR}SaQ~V@pD~F zR~94K-!-6_20Z6!=?YnXR7^*abj?NCZ^f&PbD!V)2+nI!(G55_&y7n|N9~ow$Kq>B zKEjf@!bu*9^ZZyby$C%-|(MiD(pYlqDfbI3Y0R0jIf1I!ey zGHi8H%-T%xceGv*dI}55k?}EMa`UnB8oV{i5*?zUawXvy;paGDWCkMP zmAFXv+A$U%s1tb~q#TYU$>>*crSjIw2ue^L~ zsZU z{oVAR-@|euLd!`!;$G>g`PLI~4}1IXV+9($HF|c)K_D3B)imq6N6IVo60q*O5djea z!@SP&Cc+0z<#<205*^(l+GhEWP>GSMOG@6pHS*0zkBDfRj-;54Qlwf_oIKBjwG~o* z@axzW&xVt^WAG5@4Q>iB6>=59q{G+F&MHjq)CX0DWakWj4GOYg7`R}<|A5#sd%tz2 zrpA>f*W4Sg5Dz&tpmjFN%xs+@OBBhwr>~bLR{^STRQkYx2cMvoB6BL73_DI8C_SkA z!^PG>>sW&nruOU`d2t!HUYv!SYHu4Lxe8_%2wOnV6fqy4g_^b16&QE6mA`*O9&088C3jA<&j%WhKeY zPm>hV&?%u5kG4?>p$tAJ=^yybiqEaHbrboDMgKZ4z8*{u6istIIq81VIU7o_e{!*X zGCGeQ0r5;_R;P-UyN#2HnQ3mmbJ6+#|z>TIqJejj~sHYU^6}penSw7 znnsUsVPnBYLCiJW-0orOyjTH|rJLO0I2UyFb2SbHKeRxf`0?=v;->J;)DnOiumVz* zk0L(RK`du%Yz)tRG_18%F$8)MB7FiY?t?E!EM%7+YJx%rPmj>|#K!Vh&I;AB0zXW* z$SaK4d@v~8nslWNhc*sz2}zus85z9YY|N!=D{J*jkAZ8?iQ{rKdH}knXWO5MI{x(J z!T#RS6VSV4vAx09?M@Zk?E6s+w6G>?*b=`Pg$74Y()R+^VCq&!yda^l7^(Q)zH28O z@F{qHYijD6eLeEv@vL3uQEMg?+;XX=7-N|GZxV3#iV z3wnRTATDttyJHYIRL)PH0<@#;s(I|b(s)i>b!$dpEG^ao9l`|v%%-o5M|f49`NelYvo6;@(Xe>=^z>QRs2? zhlvpynN-@b6C__>7}e8yX)3B;z0oV;#0S^TfX_$1(G`$_!-V1$Dg_#;ST%^~wfHF> zWFm*h7|0^zSZu#Jc$E4pzg1d5dj%th{LG4`zfFfpJe}u)Vd=TeyW;w0_ms`RoJwzg z#$~!?PfOutWb54SiNfH^_tI8C^an~t)Vo3Q05*18T~FvX6XG?-p=u7~0ei>+Kmi!; zN~l+VhFy2Gwtwo%-QME1SKbi|=jG@An$ptTJn1?TNob;$6t7`oX7wo0PkG=^IEnlh z#WIO5nj&{@9)gDKDkVsR@NlbX#88j}HPy6yHtu>Ri;<#JWEsV&jcM8EBO+XogId;X zeY&oPL8{*k7B~-;5I+@p*tljel>p*}V5PzHSIR6Ds0DtIX`{#h2pK|#(WxyyRBzU@ zLy+qiPGE@)K=!pqDgmkcwMM35rKYxta9K(9dw_Q#5xOffRQWMIu=u%!HM6(|C;5I{ zyi|Wrj@)6oZA2WtNC3HiYKlOFy}2#u`L#5}ivyir{C%L3KDN<9CV$0 zha6TKFj{_0?_tOQZsF;*-ogX5B$AB~+vS*`N3kyWeW_VCkBjbq7*zc5N5zjj-h}dp zK>&vrdi0c+gAsEz09mp9I@G!5lHe3at^SOV`*9%#%>L09(qTtO@VMdHqSBUAQq$sQ z<;^Wf8GyxGR4_a>MT>e&@v%GR?VVBp;Swh6=9975j_BEQj{u zZ0C4K7Emh;(Hu+JA>cXiSh}VZtt>3GYaxOo#CiH`e_=Jsy-Ecd>-_M5$^nqY=0nRY z=$ZNCIWz%kUzDis0e}Mx-~d{0Zci39hHxHiZ9uX%a8*kYEP8y13f(m8Oq5B`{XuOa z|C@O;VPZ$ZtRlopJR65l{VxZYJP)99`GiA`T(V?xNHabRlbtGof?74e@54r1_2(C} zav6)5kR#ppLO35aWdV`O7Oyk9T5#Mxb8_=yKKfNGQcI1mQsJ*Z>VB$9?veaP=~A_!Op5;exko*+ zN(4pG=ydT@a8#@}X**v{Y+bgpBSaKzMe=^bsRzp9tN{Rlbf~k<>N;pn_N5lO%vM0N z2D3MBYmpdzqfExy2?taH%&|I&{Wt_Tfv#~0U*qJ|E-QXm>pEB_HqYuh*4qK~sBo1T z@I5anBB^zLm*M_9cfKC{TRVf$i?Pz>Z0qNmDMI6B%D~EMET{4jeW0X{rbJO??L|t) z;aSF514>LcRE&GlD)|TJ?(JYuywKj1B4mE7xXX2I(p1L z7(A6&yurm=BeLUpu&3iNJXowIZs${K= z46#qWzrn!a@_y=aJvWOX@a_=9&F4<;qxrW&h6x>dqgelYz|Z-cmfQCQ3HYx5`wn9G>p#E$ z3J$%@$_wVzmx(L z>L56UPVrZJziv(*fzPM+ZOoUtin4cCzy4m0&Bj1sV~6(5|LkZ0WeA@Sb&hzQ<&k-o zkzIvZ@~`*#g))TTR_-bJX|UlPXB9#t6kI`QLt9o89wqE|ea9P@p&}ZpMT`uWHBIYkimQzN zx!8KRrrbQqnFdKxERWR;kYlF*L4h5?D`mF3eas>x*r$7D2g#eLffV|L!AbCgF~kVw z5a4V&T(d%wP@8-SaaQ*b1C&Hhjn!pVB(=|9=DhwlI!HM*t@I^6$3{)=tc)7VK=+kE z7yRvoB~~sr+tW(u24m+!p4fMy6#nmizy3y9T~)rhwz@t~criw;i6{tBGURhmmHw4> zxYc&rQx~#CU=eii{#|inER>{eU7F0#;1V1NFYVZc4-5bBYh@X?wb!c(h10YY0_05 z`U5WXye{|+WwmyvfG{Pi$ign6r2vu;yZ*jD$SI}hHrMc`z#eKm@ZZC^b^s+>Man>5 zCmj#Zr+maqP;YCANxl@m}O1BU5P3q^Rz%!xh*A69gWlZA#5xcdu2?nx3LH^^DH7hxpz@;Iuk!L2 z(Ga8XCd#*b{+K=q09(~3P`nrR`k+-S=ijKa`UH-g(U-5l?W#CCws{tGku;P!q#3*~ zSxQ~5Q$&a`rrvx0J7E>Dd+k|f08s@}*u-q5B=sw#i-uO* z0TMb4^o0}eJ8pj4$+kXth)mW26$!0iVQ7Pf<^29wxFvkDofB&)i+w6BfJ0s z-dyzDe|{fsur$cCfmAtogp{9c4xVS|$b~dkH~4gEJ1p;j*4kTKJQGE}`4vRaBM|b( zCoy5QWwn51THE=n20`(Z%gKo=KN0|7C#OvRZqS7uG!mnvWnQzrSQAR}hWGtea!!=$TFvfB^--Ve7yw|iXr*AVIC3VIcj)VRC>yIlpA3-Rp2b93RCfW^AM0uMlVsSGukmlWB8iPhy6cfxNIfB}KT7kb8h^Pd+M z7LO^8mBOtBI`+EO9H&1v&qmi}mpL9)>Q((`nR6T;ANPn$z{0{QtuH>EWKVgCjq|UK z3qK3klE6UfhyL(Fo0QxbK$4py7`P}t}I4kVmvAoW0aR!T5X%Y+rm?jXW@vk;ziUoPKI*vC&Bi)2B80YZ>5B!uB4ELf z9Xl;dV!#S~r@cgzV^U8|Db!;;O@$oetJ4TjyHePy!kW38NBs zz5m?%WF}@dD_|Lv)0XO}xwyEn{DnI>fkH+@rpS7WuE5-pqsU5E_ssdzkLUkFAJ3NE zPI2(l%M3{=NKsR?a0AH`n3#(yhrmR_RgwY0@IK*lRIz@QS_*wk_?i(rs9#DI_7w|z?gdccD-5b z8}6jYevQ`w3hed#4nR~e9#ftSz&cmOGiBT_CfCW2%@#j@N%Z=S-?{Q3 z7Kuzvfnt&C%#x)L+LYQ<Wx5xmhFZA_dIv8=x+c-|6vUZajh<^-J7f;3hgg6cPfOS zUi0Wo%ohdj>4g?$!0#3N+K9NEXe)O;|LlxSUgwC<74Fcsfok(Qi)YHiWC->x5_wSS zKpg{MY_Mraaxb@L7;QlFH(71D3;}t6*SHJf!WlU0)HAvxbZ;UE zVZK_b@>Yg#S;4k7gE1r|qh|+8Lzz|5n=W4g51$UG10qz)>_X>q1Q2c ztJb)jtLGdG z0CZE6-Vw5xu8)6=C<6jo!HI?l!@t1I7IbOkk%tD!aovmHgv9HM{_5G@ehN&{S_ z)<+5qWH4N`+tUUgK|qCUmJ2J&9Nb)z=OZIS`jUY3V`KjTjt|g!lt+9qgjNvOHzuM9 z03lc-`*oHakB`73aOc!*gAQCDfojvUjSch-jR?ScTqsPGJHlGq;IsqwV&J9MhDvu4 zuT-QvCTSwf;!Q*ufc)ua=p7%>^1<4{$*_+TWUaAZ4w7dgMqosJ`gGj}Ki%Ax!luPt zK)iF*t79a2p+RnQn*O5S7YctWeEQ?LO4T6YR&rgPUOb(M+@gipX^u{6YKRJ0Y~UYG&Vjz74V(kZ3H51ELto3Xc)hJo*=XVFAoK;D=z- zAw>KPlZZ;5Wj7!PIUpza4IQvxePVCFznBe$#x%f}gW?MQ0|?QPANj5a9NI$dV8N8o zJPV9X_Y*2m*fQ^t0t;otn)3zaYHy{*81jGeETgU`9iVV6q{)Q|hKn125ZptB`}dB| zbwijLu<;5bvP(Q(4}$%`Fn#_Z;xnCLpnI8YWfuJm^W-yjg&z7e)ke&Mj%1LXIfg6@ z+-X9fTwU4};&srX!$MCSj?HZhu7Lo+GcX>Qg=J*{IN0@s>~siZr~zv~fG8pEbQ{x= zu5sS;Of}Y;jM!*}4;~acBSp3%BL`mSB%N+u-cOMQJydQ6P4+4uPQPQHjJ`fB82r4RSs6V<@8!IM^Hc*9Y`^7sz z0epggd^cUC%g=+>8?Zx*WQ@?wKzIqUC*~td4Y3~(ndG^Vk?|@3e*#Ywu;InGR_EvU zsaDkh#{*3QR0#|<EeG!*BpBkP=mRVEc`Px|OX>Y_68o7# z4TVfe$vZQX3ux`)B!^9l?*CN^E405s@A1B^u541e{`v}+v#HWEZz77UG6>;a_tGI6 zt-Jg{!)*-Fih~F%n{a7WIbER2&$oq3OV6zKZor(zZ7{j3bmfPgT>d4vKs^ak< z=?hdBusERjb>TAD>G%uJ{czZZF?=IMSbnn%_)3QDNkP(-j7KR0Jsm9Q(9L!lSNtfD z2VJD};>{40Fn)L{Nrl7Xp9*3dTC6}&WrMz;@z;(y{j!}i92*XN`iTt4^!9lWu-^=5 z^bVN&h-5>6SpQFpF43 zA>{S@-JR8S!iD|Qx(}BC(tyHnYYNqVJ3c}w8?sqgJ%&RHx);fS4}uX4Nrx&i6CWqg z!YWD%zGUi1-q0!?TwNWv?;9%R1bL?dyyj~BEWSBBXgo*;WHB-I1-jD~o%=l#wV#61 zz{3=j383U&w3CrBg+NBG_(1@MI7!nKY)H){AeWg!^@f=zLcB{A{CVi@eAFM1go7;E z`s4=oYoyaJ9fNv^fdN~Pp5beE@}KDGTsOvd#Q~pZrpOBdK+H#p@bf>v8DognVV=L3 zl><}}wrR*R5KGjR-fU*oImgltgWw22Xw?hL$R}h*){3kSk@Cr`tUuN!*nwZB&M`Y# z_Q6E*rVLY5WGVZkGqoSy4XvJD=HwK4~QPe3-cSz{!;q4GGF;wS?xK+jU`oTZcXW z_Xy^iVjb*IAUXpM35tf`nH=nEXoVOb^UVKdV>Burg#`khJ;ozTixWR-;~oZDFmu^; za>ELo{5!C?iYEa5e*Z9;SePyCp2$QF?n>mid!>Lpc*IRV0>iJBi#H=buYmWBbe4$; zMHcV+$_70()$uMWxg5)aKOEF&?)M1Fy>|c~)ca?E9P1pF4$uohy(b*C5t$)+Q@O+? z)R?|1F5wzBE)qUer0`4{=s<^<^PQBMjgOZ2?+8C)d?rvxm>5cwxKIR64yCY=tUhZk zfX53O(eMFVC_sgWarkIE+eNfrXW>Id#4v0uN$Gp}iJ|}?9H8_95Vx|r4tm?;y+=Ge zT=h<@3$r9Z)<7_4zV&PHcwltm3=#;5d!a+?nZ|q|0iKxnd-M<`iYyHDKtSK_-}UZT z;ZUNRgnJ1jG2Bb|vmLLFWXNj7YIZnYJv+dZTJkwYM;DC0psWhSN{zpYj(v!zaNIOs z?UioCtSNqg;>hgSF`9UD$>FH$Dha>dw}677cbGZfZB^rpkj&dic>8vlG}lYC9hP3$ zbAZ4DR1?Y}$+I${b0xrB;C=`Hj2L|Rz_1)5w5exoR*m;;pz#~PJtPK6A3utzC94#@ z?wo<`_kkfRE1ebyX;(%+`gfYrl9ER*5?;t|)jkY1%!o?O0StKK^rPI+I9EV5sh59< zWaUNdO|IV%HK-65;^hwoN)TOwx$Wr0Uuaa{*}L93xR4X~7fKswa)V&*|1P!DR#7Y+ zv&b_fCgv*0$=vFaAd`Y=1o?nW`Q~h~L#|RIG}rWW61)3i7b7CseS9LOU=R%|J8) zPmW4w2{Qt!x*^4k7xGdo*Z`6`-5 zh>uTCR|r$h?K?ipWiYwjvHui zq7*?n5ka{_Temr|anQN;JocISltH%8?Eo0N6SNUb%*jekNdwW4u7#eyo&gAl7N31R zqCE$YFE`g*7FlYTcSMxWY=UFVpNunX94C3%i4Y}xIh{#CG@YnF*!)-ulK!wD~!v;i}>@V4W z)E7G&sSqIwLJ<{g@&`R&q0qJ4xhir7J`Lap;zKAJr#dQo7zA4+AQBLFfg} zNS+kk!}Lh3q$sczDE8#oL=8>#w&6F|3lujnT%!kWVjna^%(pbjbJqaLX?amu&-J>t z$jvGIfAqRgeOdYr5PsMeVdDjl82ScMtiXNb04UA?+}3z$$(rFGuXB-WVQC#xmmR00 z`bzFVqmY-A^U;G)&@_B$n>AVx2W|{d-)G0BW>&2<*$^thW-4rS_`~55|BDL`QbfUF zc6RtcOtcCbV%4S%T#cv4*M$QqPGU&?nt(xrG`&-Q^5SpPtehmbF}le7Y+5@kTOia1 zjmb^wb^9qkma|F-usIP4(Ns_^DXU25s&M*}aFOQ3t*QMgC3C4_z9Hnv2Y;~bE*(oI z5Cf{kaBE|$nD2P)4I_3BUY)C>!g}B4Phle;^bq{Nr56%7&q99l)-4-HQ@WX(GSWkQ`szrzr z1J-je;n%^}E9C@r?spf_{fB`b_sDSxo}(f?00}}gWW}BEyI4q4=OHwMMltNIKB+6< zp(m@l0JQ&6ajw}KIcY|3U+=?DKew?Fxw*Lwibp}>3hOo;ykXuBE^~&^*vN>LiA)G~ z6$RNZad>M#6kxo8YVF|v?CcWQ(kL8!<3_sR+yh1mut#M_vWR5-=Z z)&_i(5liBr@D&^!O1L1}4V}CtH~=EH5^5#2;4=W0V}5=cTm?%3fNedBS^Ys3^NSB41+!g9d6p z^m6=n3S`%Hmv?|2eMxiEn##KFh9f!gb-kBzB; zbm(9GAP(73gCWBxZIrdZYl~NNta>2DtnFa{!92(Z>h?r}l4@q>kr2J13KgUu5V>~r zP&X7UfCaH6MQF$yO3IwGdmlCNIeEAuNaUfsYQ?^-uWzgQCKDlrQFq}z2hm{Q;EKJd z-QSnD)h0otVc~`@A_wwm4;!0iFA@-l$RB;q6aAp1Xa`tBan&g)lZc3r7+4J!r3XPB zultlafetMem^*{Qd=5Rr`s5TY9O3#l82kU`xXAs9zM%um7L1aN{KyhqkQm1Io_6;@ z+Ihyoh>cDll4^33_m52iD5!eso8D!l`@Nw4NntuUnGZh~-;xc7D(C&9MfXMJ5hx>( zB45Aw`w};i5BlvuKSGQED?2@)+p{zBdHi8R`t^6X7$g~XE?vv}{2C5}BmCb1@$?I5 zy}}e3fHWB%&Cj;*{%630Ooo$vRsVZ*aOe@o59&T(qF}Z|B3r4s72k#XMynZ`lE;&( zrND*(!v`(rDn4UZV`GDN`x4qM^Uz2I6+kyoFsP)hLD`S{ z;hP)K#v>SnVQ>=yYgL|!flnMD(!h!UPYZd{Yf@3PkG-=+V+ozvI6$oCISsY^BxfS4 z%gH%@a00#h=n zp$8o0__(;7;}QzKeNWBF;O6CZ{h;rex^nR|HAd$fk2u-Iz&sQO0JGd>_NS<0rTTMQ zXZ9+TkpO&)8|)tb;7@}&43ZK%yJ8QJVgXzWr5N)R{#h*QW};aBso~*?`(qug`lPhX z>L9O%uyB62mJsnt6f5Xbt@mO}$3T6>45f>;-gDi_0^lA5Po=)tNX3ybI{yXI-0V|< zp_kwR{Up)Y9}EaT7^GEKK>JT$0cEf)^$Q4Ym_5It0IwedM*-NsndtDM59sAH@_oMN z&Cblhb8XdS#G7UxsdH_pFOEIEAXDmpEefbDkH3I&Gfg(=b78fH+=h@Zpt!=Z4ILY@ zHgpjotU|!PzU5md9MQUh&qy32KqnBfLN*AKI_~d1s6z!3CcVrUVo1<#vOKZw2}_I5OqLg{OxIU{;B__{>gkfk_4UBU*{3}hQ8f&LRwz-4rC_aej+#I6 zkqMlR7M3tEqc5=7@bGTaVQ${X>VJj=c|X5z?n z5)2W3B;>)DEX}h~fFDA!7wjs?0n`B1tapLEhb1?~G2CjX4EdfHLdFUBqLG7{<954` zPjiu<30R9~F7p7p{oH2Kl^o0EUmJ;AQK?5$zQ0?)=So*{SQ=S z(P^a>?}~4{zMd(93z- zoRCLEvV3k|Zph9Fk7zo-`{Ta$lpnw9g)D+h_$r==BZ|J1g+`}6iQ)riAo&o*_eRsQt3@%z~>M!h-;i- zRD1I~jvVv@AYqP;t%Bh|hDrCx@-jakx*LGWLmu#Kzh6?*f2b=j@6|5_S=rAydD}5O zNF7s4T>h3?&>joOu@ruTd>49p2!W%;p`IMZ=IXl2z^~$Wc7!;1Sue36Zvv5@NJinc z<5RWUoTL{6ZNr35Em^qg(k~u)<$X3{02#$I^Cq}yp4S-AQXWDLkIl(dg{O|#_jek) zq-lu7SiChKh=&mg76@*=!Vng|_w|)Xx@QLtlCD>}|7?AW_XN`IfGB)LBr$a)G$M@G zY%$MOX|4x$ zD1+%~ggn$Ub-MiZjwmU`$ns_Nu6u1D*BUHi`0n=O&0cvDw6W2|+za!kgA~8>wtJ=R zzE#^F9{>aam6o5x-bHme?Z_-W`?kmSVQ_^trNqy*f4-$y}BVWqIT(qf=8yM~9C4Aa>iXulX)d zMw*deJKC)cB*#u}&O?bVh)Ka&eJe>@jep|Da2Gn_6X;{PR#sP8;AOGmNEz4)4VJib z6C$ZHYm$yWi@jT=P0mX=hf6kdA&-A*Gd$qmwsqLT<+QGqgVRHekGc_AMHCsrVVdV9?{kP-%s87 z%x-MsB>ejq#_nc$!4`peO5oa$>DVcEfL_{{jo8>hbbnT+N%0diih)VGPqBDwBHXWxQ!~CmX#L* z8}Mfv44HFlirSighTR+dEPxF1yy10Rl+UA;@qJeI*_yUJ0*Ky3pT$IB2&7i+LN6o3 zhdRs-B7lB94wjJah9V6O<=oDm7)A2X8t3t0uP*)bAy$?`Qe1M6d zVXwDmqbbVq{d+q?jOXebF15xa{hx?Cf2K<0PP!brNYs=YU3Tg_(}3lwrN_lU4tkw7 zLnIBs5PP)Bl`07ulw);a4suP_(APLT>ZK>>$$i2k*=-itNs2L2?s#SK=+1%52asdZ z1arR3CGG#(y9E3cxaB9eH~_|Udms%Y0U35zx*n5#6q7@@2bMCAHV582R9Cdij3yxH zz`pQ(bp3&Nrzy^~@gnpHDRZ!||LT@8kk>#M3Esz=2fB<$54AdI;(C{$xYV`k6xIBr zA7I5ZlBMMx=|1OKYHzW98>i5;kqLmSsA{ww=>eSy!pvm z-wc_Porsa><_8`g21REZBO(St=rC-L%%I?)Z~yP#Ql?hs$PA)HEXWM6tnCbq?1(fN z;X904$PDsE2KGeY%SXh*#7@u2#L31%#QKtno|%=Ak&TE2eqy9jNe%@ zh?*L+)7w}XgWVY%z~0Wmz+P6*&dAE1h>4Mrk(mkJ{_kaR{J(Np%#8F*Z2#BGVq;q~YPK0c!V^{kx| zHa~P0kc!)lUVacEAiMQ+^ZYi-y_K9Tf)xP)QoOJNVgGcZ+SHaOcUSiBYE05H6Th66 z*J9mRs}~*%Jg{N^G1=Sm;|s-=S}E>l zW1xzv4o+An%hF~$S=71OU2V9^>Tck*Y7xnGV{^eN+Iwx6Kqx4Ka6zMGwBvFjePOOu!u<9pP9`2(n z{C(R}6%x(%RiLJ<`0y;+-^#MgZOkQLv*hqExzri1-^15Wly`i;qDxfnUD%gE+-&##GQ#}t zZ;P{Yd5xCoto(8`W*-fco%7mHviFJ8ZLQ+}nd zyL!jdNRq6)qfs00k!(ere!6uq-9p^Xtp(@i_4W6s%>N= zZPykl%9j+ISbQ-bW7GFNhajZhToEh$gxp>z)N9m zw?)8JRlTK=fBhoEGNS`6MOXwwV|b}fli}St07^rU;G-s{p?*Nzwy<+ut-+( zwQxhS2Fg~hlDo=@WAk;0X|t5M)r-aE*u}KiOU)yl4nL&JpGfBne>UsdtQt1j3F1%p zaqICP^_x#KaEJ*mcE{MBJYO2Eii&%-6w2RBvo_A7`Ib+eJk2!pIP_e+Hy>;oGqY|JZPEedtKKY-8g~y+t3SGrGO*n_L+4PI$@JTC#?F_?WKG?;4_wypSC6dO7?SqU!OLqU3{=qFzlHOE-0L7Lhn`Fcw!AA%czp&|M(Q9}< zxJc0L?!V+=xX$_f@IoVz5r?)s=t}*F@Lti`duDNjfTxtX;`!fdIP4d(iElAhM)&Gd zl?U*du&p3|ZF`Njk4+S#P(&6$x{Z{$zkQC3O|+ZUamU8w)+u7lG}G;3RcdCNF9jRy3nOTw*wHEqksi!! z_xHJK`Bm@n6dDJFSElG*l8_xM&De{^#uDZszaoA6oDuEg>xlp_5h~%iqQSOdvn*69 z0xvwFzbW`*OrlfFW6x*A{K6|O5v?pPTqpMkDiB%Tz|VF$=hF~xS_+Z7`O4ODY}K0$KxECScCg;E9@QOEu_q}lTg-x>66uLwq3^LS)5+E4~0fWYD0r*P3pJK zkJg&=J?VH7R2~Qv#a-H|i`?N}{XLM6Xp{TO%{z1Wz(k?w0o(6#6*Z<2y=A4_Hf(}* z8{{W+Bidx1<^kCp)VCswd&ls3y(S$Om6eOokFCfM3MV8GydyE|G#<>bNunjaYDf39 zE2DEK`zdNV=T&0xK$n+EMbz@=k06=Z_f9(Ljr%U-`-6|j$aBu~;!59p>z`If`Gs#N z*U_5!zF=y2PTwl;XriNBH%`2ZF!45^aE8tO6f@*?%Y8jN+}py&BCloc>9&9NFAIG7 zNji+g*fs`#HP?8tQaFLJU1qL;b4sHiabCgp&hwY04IMpG;_`}zbcvo}j`^emg86@# zo))1?P?#IV(sy^&eY!>R0#ijff?7HF7b~9bVyRVh)IxQ>@){m`5$>zb)-`l8+T8aj zPt-9p5Y3}vBPx{KK0nHfP>e2KQ;hA-nQHy4EJ@R@{-K~Yzw25{v-`}`{6Tt4eb_!t z!>7R&p^<_~4*P#~3dWR|@!=u!!B}Om@+iWtd3*arMn8Dk((SHelqpI!F9*^ zJHJia=I{!ima5>vW=#GCO`)U9FeZ${-q5h~QVtIB7!1$D9znci|DODcxEK2om#hv* zS=d`D1YN4W!D)_25yda5?EiKZ&+`nu^tS(l(eIn2G2yCgNmC_&JUVrl&|S>3u94Iq zw`KGA((c3Ao&^dzzjiNmCSCQu5^oA&Uv9m2agU4hAE5@Ejk0-}^JMSG-0xSn7%T|r zH?~Nfu9#ObNmtHVV}qVnGP3qFmTRvDBDrY`Rljl^HFI=|y5qt}lDDI`FAzr8wFu6qx7*U0N&mW5l^z>; zh;!|P`SiJV6)!IOB-7xf>Uvu7%DLXM(9bg`R=3H3m!4y?e~lEMKMZxkESRFOsbhT= zzmtIddcBnA{_7Z-6$~L(bOA0UMN*82JBfA(`a^dSn%?9gS)iwg>_{;&e?`Y^ynO6{ z943#e|4J;1Pl@&P1vw8xK1!QDI)eB4_!A`4GbSzclWRBRhmFH4q`Yr=i|^X>g)O1p zLgX92OO#>XlDFK*Yxw5cPb4Jhmb%M*3=Ce4dqkopw9^iTomMt?1t&0A8PT*d3V?x;m4 zO)|+z0X^$`DE)EF2xuql3z&-BsyKJvp~YP@dXnh~QaljoyBHYy!o<4Yo`>HU!H}X# z{qnV+a?t~#Yy~F2`-~q=A}2`^B;NX38OO?zIJ{lHg@QveB>w=xH8S78<@UE0t$fibpKD#yX_AQrz^erM^fv60$wkU}fcOiEMFC`--M7yt|vDH02 zny3w3w2zXKC%SEArP?3i-N%%yqH3XPm49DhD=*baMjj$# zb9DE5QjmS1Bvw9F$p4>=^8iHw5;x?z4WAjC!A@DRI z2TRmJLQB;}4PhHSGkDdDgAPq$0plCN`7wIMHkrk=h z>kf}k@uQr2M)=a~w6jB?Ne-E}W>|}aD@gNW_Gh$uNYuoDkRwSejfi-cJ|UM7#*bOXL8hO$V4N3(I z!%5>Jjx;o6d3F5RJLN3T_x~0J36sRg{CKAUslpDDM$fFgFEJY z%Q6djJghXUH;zJ#!a{eyM+vhPh$LpH3;BfRi*4T*#FH|cCdm-{b7a_WTN{Qfh=~&t z2s)(61m;0d+zehdcRCjfC7?LDSV)QpDo&_Xox}qOnnCiG1m2Rwz0Jjme@bNcn^=zK zPoKxF<`$4fztJ@9r^fS_D-C4v)QmQu&PmTCk_T6f525L+Wf6e^!nppH8b-uQF#Cp8 z)d_bvAJ};)*T_e($-1Dd-R_^bcsCx{DHB<_;qXdm;)#1KCz%-H35+Vg-g5XSb@4A9yu|#Fo+xWhNUHJyM9?{GPWVpmdm5=#36;U9RK$OfiT=o-8q`~wYTfD5{ zvSh~}@0C}PTKM}EY@l-}-CQ`nrSy{c-KSkUroTiq`c z1!S>od7QWg^G=%>c96rf!d-r?(c67nznwd#w(4GPB_AtGPiXcR7J5qT<8|~F#z@rL zZm0e|YT&|of|XScGK28Excc>tD@L1Zpgl;19?+j{4Lo$CZ@j*TY45x%Rz%f zS@<^&qf=lWtfd@8eqP|=bQAp1{j+_rf!SqKp8ICJ1DnM1WcjCi>52mo|E_V23eK*{ zVR!A+veg_uqzK~7W_T$xJk`2DzF2d3i}MJ+#=cLndoK>Yd8UeA!{lICxr@gxd&_hB z#Z#s4m0JuN@8T~?W{XdQ_@4J4ovQwQ9nHPPD>M9R**U1Sr2QomuOK#TT7@vW<>y*C zE(0^l@mf028yrYqPjD@Le0$@+x?FT(493QQnE3mjA*on^02Wc~9I0PufPTLRU52Ji zfNu7CrI?yN0+|Ff^gbPxD-x_W&!JJHvzgm(DHt)q;Vr~b6Jtw|+Wpbc>4^Cd0_!57|8a0>)` z=+qx2L0;kv$vgs5mU#x}=zWR~VRmineToF2y!(C^!%Cc)&DAg^a#U;$MbOG`vMIPx zk$U{TU`4%zvwtF?Ys|^-w9mv`c)`(^mWu2d0Bz*UX}$vzpk=b6Sn{1Qb4Nc#-Bs5` zmld^NXZm48%h{C{c$5uqKC`5&vJ%-0~fKXzdVIf-~Va z&qjjJG6ab?+fqp?D#dFAw` z&Sc`J{qQ;!nKWzH1kilfUtVM=^@Lp!T5*6ZHD%jQ*6v_OcBWn69IQ z*Ym~2I1sOJ({X#ESA*toSa>wUL&>cxSD>hEQ}Ep406M8KwRnT%-QVr@0D7><+Jt=L zK1wza$i~z`V!R$*0)%!6fL0NSjY-seN@m*w;81Z+lnk(sy(20QKy7!K)s{`GZXH4O z)t9E`1&cw!puGTVnbc1O7s!D7R?YbtKK_~lD{+M$D}*jc+ZvoUya6lkuO(PmNKx`Mu!eeZYp}S6N?WFX@I5N#Zll^Lk-Q@Y z*@5!eEE-a56q!DuhWtFYZ2wY+7;mP;27)kr&y~RXI;ImT5%ljfi3*ofB6P{j$~*Ou zc(%yQerrl!*hKqj0E1P*NtJ+*rH&nefY=?IRMs6JT~hW>7QKgidJ#A1_xE>0qks;J zKp1!!);_W8nWK|5P~rm9qL^P+1F2P`VO@=$#3X16swq^GmD{Yx%|bwzu`q`XCF#TUw$-2cg#9N?FmAqKJCxB?@8DO10|0%&EQR6K@&%www(djd<~ z?xJG`@m>GrjD-r=zh$=YM5UlDP;4|R0mQV=)5Syjt`qjA@dFNloQ(;vs$!BPQ8H8j z|NF_!cdFbp=%4B40PxhT3I(Vhu>Sf0vO)iGRq$`5K=u)#Q{>kb&_;%uoh8Q0cHwYYjaejVW z>}=9#RF)VY1NS(^zwf_NJs}IgOUVRmre*?mk#2X%d=->1hu!jXypCHP6D;cMW3c>; z$@%kFPPEZ^4}#GCkSQSOHA%85*zZgDS^T3|>>hak zi?Oq54EnyYRP0&v+p1M4bg&HdyYB4;2LqHT+&6bhLvB*=34*F9QueOpQh6CW)#>+F zRikbX%Q8t)ZT#XZI&$r~2j}8q5Cp3TDXCe9t37W`N^d5&2)BU<`xg z`n{q2JT!Jg%ne&fw+ITsirZgJ1?U8CSs7|qX=^v8l3s|w^SCA+tYtWZxVYczw}$d- z5tITG|1cNy@<#!drwHdmKbZ-G+_T_LR|VVnzkh=uJl}7^B9c+oziEE=Bf2bO;<+UX zdIV`#e}NIoFUaYye^+BsLGslYT1;Sk&YAW>h{AYi;jD{{Vs&-dX!Avfz8&kl>iK@i zvj!T50hIG4(BqXf9v6YGvPLWV{skGQuoz5i%yAG9=op(0W#gy`yr4PQk#*^ujYhgv znNT&@`9h=s<$9H47+>>Us*?ker$*QW;x)(mvxa>*fyP>l6R?y@J3VAT=q%lO0D~PP z`Vok_@JwGJG-|crGiPxx9AY;%4b*>ecdL})8eDq2NYflzP9U1hkxzfYKD z`hl>6Z|ci%80BvRzw3m4Grz95Q3L!oOk3TxOJx{jOm+{+3$&swpONL@_VL@Bx7H;%J7+ZzB{;32?Ly@Q5uqY_b9`vq;{rjwgf#K z4OXd*Byd)m-gKctYXeuy`~d?3AW-uX(B6xo$k?+mnGaUvIfiMn38VfQ%kz!gFqEeD zdCEwq1D8TwD6@46vMJ+9T)o{*Ta++_XvMMtB^if;pl}tf$`XvFTt;Lp7pU2B-Se@1 zl(Olt;+&IG6XM-ElGraSh2cs^eY0gRTSupB*S}pt+U%^*WG_6{#=F~^l3%uxiJ#-V zQ%rnX7UP(=pPLy|6U-9_R%RY(3c>WW%fB+1Fe7Q-jyhZRA(- zuf`fARC&YO9pwY}(+e@)+{2+Xjn3CQFgU_4mKEN!%API?Pd_%1*Ud2`?lrPd9{47g ztb8})<7&zgAOWPU|2T-D4@GpHv})Xpws}GeI_2sc+#0%&e0QvejX%iFLqiw4hWh(1 zQyC%cE=RGzOeG!0%HKW4QkxL)dRUe-q>tv?K<6d6vsKNqTeYMup;jLi0KVpiJQ7Dr zlUQnB=(=%#tUY&D)yUdjCjtA1x#Rti1nk(2o30lIxbP$wo^6VUD0$ZAsJ{KHm=Gl~ z2EAs_&v*rv=lK99)ydOl{HzBqI6zN1gFvRtIPCeHNqqPp_%!2WYF!L2Mzo+YY??!p z&6ijr`}~@QjxL4E_I+& z+NMM38KA=BcCU;o8|-$%$*HO_K)*@D)eQByP`7>Ajrucc;esD87e-Dkjg~KViM_7*v+~U_u=TP8?cMk(GD=>k zc1%QK>@*V%!j?-CdXb8`(6sy+{X!GB)Kb5(lqq4c0~^v-64(bQ+b(SXPDeh40(k5n zAdrx7b+m>7+VPu7Hmtk?FG?m!Glx=$7g1H59X7=>c0V&1-{vE|DO%TC-w^`m9}Zk} zwxw^Rmh8lD9W^^Vla64GgLoX0*D;v`YsiEZ96(S1siDY|wUdWT>UK^{dK$541c-EzM+ zy!WR;qu!Y8l0?CpuTV_$Yzzp+Z(jW!&@kgM%oH$bse+1!-R9DuOrOM z#yyZ|@JNl>S1H8KD&>TC6|I=t-Guy=Wf|K@1=Z87bsWy{F;5XE2`yMq=1m%+$UZ_g z&?AhaU=6#)n1f;K8o}a$z|Gm-C#IRp6I>RHxCpV(c@xsH{X3(PZR2ud6u zzL|6LF$Bt6zziQ3^%VgqgU9R4ecFqs}pm0V@wjZK4#hrcyh zlf;R%UllU%V3e7_+EOA+(x@r5SKXKDOcHKDQKc6o&S_k6iR$?jPE6&BVGWiPVTIQ; zuwB1>!#ohycB89FsIV;x5|~IrE>2&mD3p+2p-Sl#R$9Xlk*@!v6S+k}EGhqdiNa;v zPSC>An={Do(56px3|JW}LvE=K@%u5mroxwzeDa1>ou@+(S9ECq=!l%2Vq274&XFUD zkM*kS!Z1;GVU+bxe7wKKhpZu0RfeNV1J}2nvq!>ugP#1r$s$vh!Eu`<1UYh^O;V>K zZRDpAaH3)(2~VlciA#=h-RyTif^0U`6~{)o}h z^&RyAA?0}@E(Z7Hk~2aJJOYhNl5n7Kun)5bDpZ?+5zwXEKx4=OA5iCPW-=H+A$}k> zJtk$|5AVv{cm}xw5esv&jv|A)a9WJe0zalE4`J#;3D6a6Bf$PRbMgzMz@(9Ok@lD% z-GP=dA>iduwgFcu%G`h~YHizzdS3ah*JB`=;A)|;uL5*4FB2VLm z#VIPRkW;lKq?R*yz2X#!KX|>*oXrfOwR+L=h-EO{_^g=nUYRMi$W;x-T=B-*t|9qv zDKi=qL{1W9NGOazLZY?IBprs()WGbV3K|&at%HLPDC@ zw5fhuvglijo~UpuC5@A@33b^ttyDvSaIa!1!k;`JTzyfMc3ydud8_0UfVIIO&{m{I z`iD4!elW)za{OTIPMr-+Zy4=9h2{j=Fod~2XV6cFiP|J}>!csaiAR{K(n7*ng$tlhTM#AxE*K?B=&&=B$+G_ZeXyEkON zgN7wd)?7ne>V`dsEpB=0UN0^h%>PlQ*alDc8;*C~E zIn|e!^yugB8#*oA#o*P3X!ZCbyJ==A`b;B0=GX24em9yUZgU+lr^Xu=3ST|`pNmdM zp@fUOX#A!9YJtbcrB|Bckz4imOpb&Lj7z%&F53wLyZ+RmA=xB#Gyy6tI9Fe_s!~Ke zO>%l>Y@GIP#pBa9YSLT=#Y!Xz~bjcsqyG^KvY4_wWN7e!x z#K%s;r^TyF-TS8n_)m570!>!?x$H|3^A1YAvtKq$pG~jj5gWM2KhwFF11@Mtci0-a zrEXd#L8r@S){P@fXe6V%KB=T0+GK>M%cnMqDojd4*-J0>`Hiw6qCe#<+F#3QNMG0* z`J`^Tr22INKk1Bg(m-4Gz0L5qVL@^h0i2^%rhs(h=UeLYKLGVcC+Ov)?Y4JGccPY4 z$djyXDniv_2sLIu8LY#qci4^M5mNQt<-0p(ceT^e>+%)^n6mMdWd^aSUQY{V=p}M) zHAm7Fv_%AiZHFK?Eknz2RPks4T+Rf4v zdh|HsQ;JGJjFNjo34m;cKm0R>e>qlF5hAB$U2-0P`m{d7Z@)p4qy!lFZV`&w$HAey zjM#(xTV7R^AQ&g1bTo2eK|3O=v@^v^V=a6|udy>F)Bl9t*tq;+a4D~$Gv!a08NIPW z;l&`0;`iDhe^wgFCf^EW#|-(*8Gj&Q^{3GrhI|Ay$dL&3DnF0idL0%A%$bwPW>TGVk%cU?^`kl z>yXOH+s9DRKll@0dzGlZMP1v~hk)1q>p=CcErwAnKGjY8)TSe+=V0e^eAs2+I+-Bz zDXaO;c5*y3e)-`nKHcR@GF(&J3-W_)V9J%ZL+Yx-jre}b#p}7QxH>XSa}vu17t5yV zz5;%4=Qi2`<_i6g*L`EQoco_=u6DA{qfm`ODe$WB*HOOVNxtQAdnQ*jeJYo1EMF;6 zWrT~*^yUkGM3VDMLtMT`t4I?NP9B* z+)bC%+=Lc|xXmB&h3@da+ZMTMEmRwdqx;E>DT?BfOTvdV4-S9?u#*n+3jj^U|@k3l8=L4QJ7@X>M^xZHx&qQPSXT0o4himF9D0maFf3aV?FfRlWvsT2&tS|Tys+ozVI`-!)!tL40Z5&IY>2b$&#HF?3AIhE+ zJcOM1bFK*mHhTZfJo|*8`dj4O9^j{drcv_HOjEOIu6|doR*W>}1RXNtLXycmaxq5s?{gcUZg5?zUx zhJ)ZmP1+ChVqJT|NlQkD%GoP7g_Iribe*nI@WzrkY58#F(OQRJIjK3$%K7o~>J ztsgoozEP?q4l@d9hnQ1T;J;01sqtsysEX*K!imi$?4&2-`HO^&jqwjqCo(1m_{Nk{ z3}8MU;okJPjCXme?`lQ2_@lxk^qb@a-qGhi->+ZXuA2rI zmQdrVX7+6gCkd-^{MPJcjSbD=Q3hu0N_v8{wtt&FiP0Xt|5ZDpCbc2B$>Nu~S)En0 zyHs|qt)A6-Ty%Ff>AlHs3XebIiGAJb-8T=7M^D@Isi<{*{6L&6d$a5>H|Wog|Lt*f zdZUe(Dbb1$qPE4Uz5lHpbh+O_>+;o>W$+1ai59JDEhfAYrNiRO*B)PO-o$$3Y6I?n zrU`G_Tv3JoWA`DHGgdbJ6q?4>^tyI9h(fANuSnHybrU&rjD}6S>ohHf@fF5lV9sb$ zY=|Nh9-BJ}Oz&=p@=BtZEj6+FoZ}iITGQoV^)bWkPXd=-7s-!A+dY?fwQ8vS?!{+k z5y_^y-avl2GdmPk`&jb9w>scTBV5Y*JKukMO2C|G?hy9&k>Z=mv=C^4I+dC055sxt zk&)hx)(ZY1Fm)fnkN{q= zXmJ1O2r7-c73c;ikEdx52z1|-9rxCk$ZpxRIIE?QUw0%#0fh0>-v_XU?!Hie>-^M& zisUH)tWHYDSiacq>H~`u%_Fp7ZRK?jQq``M1W{a*vO7Vdax z&6(MppfBAXgfpBFh%o1Ix#O_-6zca8QznS$u?E+afrFg) ze|J#e>v?Asg1l`WV_z4fyN_lJ{Gyd67Ay_Wxo_IT=XWaEs?KUxUbNKK%g1 zM1`%k=>U8^%NCYCKmk^LtYebQ*9wV7+<@EKB%@iZYrus44VSJkl}xVg*d-0 zC!&BL$3A1Pbr`bL5){2U67oyO2U#ZAybNfx1TMSwnJbZc%f!T;x?JOJPLDNCX zpSe`C?1Lyd^D;se+L17SJPMmrddh$AU{=cpHg??p@jO;(yskKPyFAJ>|N3LEc}Cm} zN8qKm9e!jKX6tk1S1ughHuTHvI|Ez_!P`)NrCyFdw+W1dkt(*Ml%QgJC1WdHUyV0&r@ulxa#lzhvPq@7UkkhO88WBXIPQ*!$u z)|b1s_RY)>pXBsDZhu|8-djheN9WA?A}yV(@I6Adl&2nE(_!AY&HM;d{`C?&9kX{m zUv1I^;NKRxGy|E#^2tiZ=_?pZZqWsXq};`PZ*l3~d2$N_pppq&^a2pLFsrhI>CQbb zw~(+RTE$gd{s0ta)^TwG_NT^&$U#e3%+Q}o4@;AW%CaE@7^XXZgq z7mu0@ux6dz-z}MF$^8nw_HsCbA=G=OQl5B4{Y0OUO`STZ)Kv+@R(5STze;=#ImEO$ zhc$QaIr+2@^7b_BNpUsnhes{>C5}UiU*Gpd0y`{>U=hskbndSsS)=fC4naW}#IVsl{k<3~!->^z~j zPf|RURTc`E?Un*}{;C6x!W@~Z1MZ0=b9F|-;w&U=C*jNxBUtXDY83BP>C|k5Ly;?A z!v*-jl*$^x69Wss5BKav%l?fwSk_*WIDWM;+C2K(Ra1S8AnN|zn&#@+V!=}iu=-vU zoGy6RWpU{=<>0Nd&TI^p=jg>}+A6IJShRRS5R1qi2N`B(QT0a?5wtt$TN5;iIGokB z=(?l8-0MPjz$58vPxK_S!l1+TevXbUh*8eWyCj_AV`<<6ok_&qK>& z^Gw5zv-LmfbUM!tY;PU#sz}z1doESc8>)sbei+v~TrgKft&)b6tkQ-S^v=m5Q$M>x zgrQi!1a5`WHO3ETG|Ycx2T`IwBF;{8wHkU_R7-Pd&Zs1O^|y#2mBb_}-NUqMdN7&j zPR*bGySQUJJ%#)8-;AXByuo=M#E{cNI$cpui*qFht-3Cp8#n3#2Q^q}S4&mW*5Cq0a}G!j z5qmbMJdr2_iVYFJ9zjrcHYG)WG97xvTD5;7(cl=;ORO%sR|_cuw8Xa5x3CQ+_QalG zgk+Yb{$BE-wO*4&kVdFV0quLMs8V1}8Meg~|8z_SP&A{QcrVqJg->jPVJaHL6`}xy z?%c%{00AM!jst2^OTYLNWkE*N{!$5oRR}@R%e@1Vj?2FvB%IRaaDfa_$JpP&yNFMs z!p{*qeWQ~xW#MuC|8ngOpjS}TG4JB$D z`^yrH+TnYUF9&{=c#tk`TB{Y(tt|D3)c{Ey7n>9Oq$+m5XcOBF$oP|4#?B}Pao}^kEADXmQHCC%~iPAe?lwZg)Cigrp z<`w^jf&xe~XXmkxJ72shO^`NtH9}Ll>sjec283x_t*Pzh)>-#nj4or?>sZSTA^R!a z2z4j3T-3Gc4`f9K60<)(T3Qmet~FP0N)4`qt*d1h`Q!4?)mD4Uieh^KY&EQ`R1TCo zajTCL2RpGf<>}Zj7d$2X6cdH5%D^M6$pEBJcz(8|Kypw0Eyt$dTGBCfUex_Rz7jeX zxTv>K1=2mz00;P%0s->yQP}f5Q_X}{pzSX>-7;{sBZ{Wm2;h52bIl_4M^&nv90F)DdN|2?4k`MC`{=$`ZqXjaKnj3(1BVpLP@6a9Y~r;M zw37;$4(js1LH(-qn?V0=ImL<68#F1J%JfLkq*laR)zOecp@GO6p7KtpHk`6fsKV_b zgAh z8?rBRWz1Dt>#HfdZIuwk+S|i3%5P+zk>+BzVDtmG6@DF~?3Cz}c4R^q}vBWLr z`=|DB);0MNLf^&1o%HK-tdgb$PNU%%CZmN`r+s*wdd<-j&E=-iiC$-v)w8kvsnF}= zjnw>&Y^|-@B9{M;m!X^?;(ZaHafv-K=}-EY${hmVxWyAB@f`5AU`4e z8Xxic3wOm(f4fb*CgGzfx7_~gm9UkiU31j5%bk#t>d_(6@;0^T@i{G5XUL>E>*s)P^@ph)2$ z!dnTIL9{Q2-0uD?$aFct|0NXR)GS(Sk3LCwL%`pXgOhch~vR^=-Y z`id@N31DEI!V_gCFh@v^s3mrNy;mOlFH;^7YHtWjfQfK0@B_4YgK^o-Zm@!iin^K4$ph^{zMQ*`xfegj+{dM(~6biRS1{D5_wl*o%m^YkQ0#kQ~ zrc4FIq{CD4f=E;GW1J)c87Qa5h8aH8;EuY2L%jXs1?->NLD&OV+eZuIWW~rqvFUU~@$uL?8l$XgDHn z8!Rf7^J@|j`V@%J>V@F!t$6#NKx)#BF7&EWM;7^p_qkcA9Yq;&jlgiORA>j2ZE!a! zFxwleNFmkLLZfEF{~2j zNBi^iiTRF7@nT?kGR!sK&7nAQp>GC-e6RzvnWBjq=h3K;iQaUzmw|D2Vum6?bfpsi zDfiI%KWNR)62WPUSC;JiWX{IEt)03t=Y|=!N7s@rhbuJ;mHVO}q}{&>rx_EsCJ8{J z_cED7E-|h)`9?(kq#Q4EYwh%+RXFp%k-ZszERn`OMKPqnI4AhbrM~rh z-#I%j9m225KKbv_;z8hcLk)NLZam#d9gz-Q8fDpvY#@X?&~ob+nLs`d}6Np zWdy$PgQ+q2|6`>87YzPiTAGo8>Ho-Y^63BD%G zP&gQ50UMMHQIeS!x*9TV33_H4V`6=2B4om|TH8sDT|zsr3*%%b+{)V8xT~1wrkmDM z?`^~SKd{&&!@)9}Pv`Rk*I)A3HA0~>E{=&BriCxIN6^i*SEjE9)qoT-(TdCuRdd%`9HFMd}GC}gR4ru^zUb+ zO|(lHdyiQ7KN=qGPYB;kJR!1B9IcZA&)p822$#RbSdR+G{ssw6o6;WVde+%Bem`Fc z8kSaX7TNC3!KZN0)um*A_I4C&JU_V=%|Tl`RoN8IoM;*$=1x=ww@fp-lQSFzbVqyG zI3WM#kM@vZL;y9BIy)*YXzJ2=Qr>;_S~eM95ZJKDa007oWWYSPVgYvuGSl3~p;ZDS zT_wV*KTA#-?rxZV|dxER}AM%?aV%IH}AAu&^>f;t;Zc9>Rm| z<`lzQ76?Xzjoe=8TL(-q%YC9F>E>VFU(Az|x_h=3v^38MO&ugF=Mos)n0WzY84mzEWB z8uB6`z_(f^@eboPCm3%j;k)VKu1Y<}pn?FaJwmNmTY8eEaDLO5QbF%kxh3fFf!xJQ zPAoc+J+@8na^ZSxngsBlZR^W7kt27qDJ7Mn z@It&xlZOnu--R}s==4iy3_upZIj|54^*Cj86Z)pgHxyt6_Rgis?5 zNYxD1mK%EfWo?dDe`|`4+iQx(!&Y~0&H=jV4>!&>FP$>o%MLuMG4Shb?0~w{3^p_- zG}pDYi_15ASn64N;E);+vu|gAIlf$vAGG_tZhgJmZ25d`AZCB=eSO}I(|_H5eHy&U z9q`+9e|A&|+W)^Q9=3B64IH@mFZP@!-=*$!LL0)ESupg$K@2{4bvY zXM+_bw(NY)Y!8Wgct0h*Wnc2EC|}z_T(z*f(xmP;tR@i-@UPhHrLA#18ZI>hgKWyp z4vV6_QLw>bPq|5ZHcuxkwbx`$nvHwy zE=Be(VSjq>(p4i#c4xQXTY?8^{kyWe3egSZ1f`~q2KeB|Z_kNu046Mch3iT>_~}*{ zf(oas1I``)nfAhlYU2HLZpcSzI&>0Q=V1qxs^kFEC2r({?d4qP0)ghf710ftWcRJ{ zIAYi1t?`Sn7`O`J$$`T90}5`Py0*plN3zh{ivBu6Hb@fsy&ZApxTscf)+nSi;>#;%~Ck4=| zWz?bQ=OZ0KpMmgbRxH+0a$zSVo@5hmzoi=Xg!9px_*<9<9XQ)&XU1j*uJ=nbaIu(@ z_zB*7U6=|pPgroKEG)0$`_5Hw%b*VK>9j?j$P z?w7zkB5(T>^^Io=*sEzEXF9nx;m}UEdFn=8nvmM08pLWO8%#3JSByiLydcyZR5;LZ zo!Osr@?{+}u7*sLkBts~)%z_p*ZFNa2?hLe0u|@p4nTQY3}wViL~&yRk>$G8;$$4F zKNYE>^F^8NP?wFltK-V8CfP;>j}KQOl~$KMgNEmV7~CH#s{rxHJ4G0OPZIr{hM7tyx%-QnT=p|k8`y{*!vVr{NRFHzP-&wTxm zcu$p`#q#a2Q{%7d#RJu&yX&g+Auj>Vndh9d_tZ=huP&b1z!~mGsY;eyh5d&6F~gsJ zt{G>R8MdmU+)HbWr?S)%e(fg=l1#G;v<+UZ$J;$87pN8^o21UGyBPG_pR}gMV|K;g z9@=ShuAGkA_v+TAnoTJ?L!}O^g>9LWLdP45J@2->h4XTwV6e|U*-oE1dmEd()Nl4hQ};XISuKrtFEe~$&u6z!JHVO2tU9rIu3BXh_(Gv8 zc()mtKeY3qZY346uMB*fvXvHo+SgkuLa7&m2yH<9 ziP6oLiuO{3{EKRe23F!q1RZ_Zo*fxavQmlx7y6J^b{$#W`pLD;pw=u`wr~$4L_3I! zo%q<*!S$Mh3^jFcBNMfeaY$WtaQi94xz!BS(H_q^^oWx-bqSr5j}?u=@s|}+Hb3}l z3{zP$IKFI|$&1;}^vZ9F&$ga;foBg=%{0-G9cn4h-%##N{{zMl-gz6}I>=8wEv)To z^%?`IR>g95-qzRm{?AetD=wjajElDXEB6xRWDTC-$JA`7fRcqdPCPVEOOL-u9l)f1 zDwGs`Ea)Ni+14d-gK4%t=3Jkjy7&HI(7`bA0*=YwXUPzi$8xY$p=r2$M7$n^Q_SAF zj)z8?D{T^6&PNanhBokgU|3-4f-33x{*%DlAJ@hhthYuu@ZdO?z>986A4$9p9x(2 z1;>yD3Nm87$2X@+?Su%bPW)iu;b-C~iYTs zj_>$uxclx95NR-d14J}9f*>Qsza%|q(Kw-hGC{;dO9$kD>Igv&V5h zr5d~B;}M>l9ZJAo!-1@u>tye?;t*aElJH*u4snPpf6@Q!Iqql<=VWM$#@-IZN80a- zLZyiXXziJ%lad2G&SZW^|4PX>G4~B|43K6#4oU;j`W|mV3NRh}NqpH3alU2p!@D>} zyx`*4;emlNAVKt4vSQFgGqLmH6cl8zyxm$Aj@vGkn7L$?JsSAYe@W1Pke`&G88DGh z-#Xrlag6b35K=LlLsX@DQfCobgLi=QK`m4D`;dIK+l|#6MnZ|3#f>k zW5(IOCw2&*FPKo1J)=Y4hZGTJZsz(keZ6|9fL})NbbpMM5wt)`M>PTcXS@dwRt21W4Pfbo9^o)I&*Ifh152Ckm(j`E>>4 zzm$hC1emb62ZZ1?g&-YZ*8>>nTD~Vc5gZGx%0dB#NkIe|L&$f6Oj3D}J@Uti+Zo*6 za8s@rPr__c(rY0j?cW=+{Ch;pbH+}_T7Zink$irS7R0ZfyJH9;HYtch;rf!P1sJ+( zW(Fq#GRBlS0i**Ac7dQD0fE!VcXOyIQ+1IMOtB=dW5ysz%&ypehU|W&pm}V_5oCK5 zQWO}VvxYcEg-AEaBZfF=qF#EKl|0ZWP?-YwYmoe&Z3A2?-O8oW}Kt#YYr*`H+H6)8DnU2P;)Wh#aOspio-Ha+0j)P||5#$9l$yS*(Q$~?+jRs3Fqrh>byIF;dbwrLb@`19^7JbKS zi6jH#gWd3A^OBx*w8afV_@4ZV#)XF-@Q3ST-F3v^e{B!US6%>XvCQq~=cKYE4$PTU zM-eAw1yn0W&LBz$kmvfvk`fk4Op1SxL>fqy6IQjA)C&s1ld%sbId7%mU*k(*3J(@s z8qjc8$U_K)bo`Ct78t)9l&9J&pC%w5x6nTrwYzCUIBKM3)hj`z&(!+}g&PpR`0@kw ziF?ueB~aZLL$ekOP!wOC$Y)y0W$$lFGEx$-Y>^X9#zVE!)W{2+;4?&yAROwl|1F)s z6oM5ir5I;C>fPF>N&cQaWhv4qeoyJh%v093l}yAMF4Z|?EG|nV%mkWTIza-M+m>Ok z3=H{DTEJn{QV$6~SNoE7J6lK-BFA0Y&<{2ur>pTq?ktykm)jj2&jeHKi1A&{V}HHC z*K*o$&$i%OKNwFx)TY03jO{&_91eTV{Jn-P{@l2(>j%Sp-G6Y&`oroXVDG5!Jt2Le zz%gnH#oa>Whvi;$ieSO-8KcoylTjOKDC{h&SV01Jc4^lXl^t!~yNzd*a0j+VAL@{j z+sQShmo>y`3O)2Tz&Y?qG2{2@!+&JM6Xuwss*Q5OkR9&Gk+Jm_{9HYD+a8L+0T4K$^-Fi!2`HXNCVeC&V@0&_MsByAAI$fEfAXp<^RRX4UdNK zf4P2$a(GsQ+**XvzfEH7ZT?x#ACvo29p67XyoYVF=g!noc=g>X!)%{<&xUfCA&|Qw zs8EKmm~AfY!9Fo(;?O;niO*n}Q%U<2s=3rH{0SWfr9mexaxsKNj^l>8OEw*ei|NHQ>f zv_W5IdukN!r%B?w`LhhSYwSukrt_D$ACvfR!YLazPGD8!m-PEvQ2MO&_E`2WnP_q2 z1TAg~;@Gp*k?G%VZUzU#Mxbht_&7{WjdnqEqzUKjy5%~ikbROraMamMaaSewbUv@Gbb~W_*s{waY;)cNq@YujcIOU+}@C{N0qwB~l^>d-l%I5^2eP`LPl}l%t zGoo3m4oR*+#f-8WW`XT^(|S-xfB~QUM>k*uYPwGY8UYB<6A~~9XQ9zw4wG#}N(oo1kdhjByDk@D z+BwkI$;zc=54J)Va12Soo0vHWm~uqdy{})^0|~*y;)Y;`d)!<;0c`={T?@?w86iBw zb_7j+8mU0{J>!_Cq4qu7o{#AXAW-8XVciF1C_2{Y14Z)EPl5(XFaQ$%gONRO$}4w- zC&>JuLIjKy4~)@$Z%Ty5G=P(1jZ~!G1O5iM9}M0SFW7`UPulb}y+2Q04)hNox-B4n zu$qa+ytJUH%_&eX8~#>>K0U7NNC>U-S1DQ;(Pe&7)fyMl=%te~PxRIBE@uc(t}y?Z zr%#I-_)b*LIHL|nTngME6R~>O)(7yAG;^V(LLiJ*I{&d$X*1P7WYrg3TAjBqU%cx3 zXAaj9{>3y%{+=A(Wvu-_?7atA6iM?x4hUw<5z`tmps-ewtLsx; zb=~MSlOCOzziU@yO^r*S^UXJnN*4coaO20^jW4}zb9&I|{S{Ay=Xn&pYGqKvMb~al z_g-_?@A0jXyS#q17~izPb-U{u8U`M2{HEgW*L%i}-aBY-GutWNkG_nYWB;!I%$Jio zeN6o3_jbXp!KW*=I96%TXumaIntH9xbMsiL?&=6v|HY50?x_@hTsd}9x%&gZAO2ci zIU?Wp#(%hlzgRVTVY6?A?2Aq6wDQ%VDpiN>e-`xlOaC?PdNk?3@#LK=EnW;d)hToT zk0EPvU5&G7_;%6K;;~V+j@FzqZ%LuFg^q*fURu8PlK;`lZj-j0Ug0vZ*7AFMdNxs( z>DncE+~yR!zsk3^+Ek{`=8emWTcnMj=B}|{om`^VD}S5RsRy{&%JZ-J9q7SU^Dm>w z<+HJ2a$&ET3ANG|Cq%ZqW3jeXsGri=V(Pvmn~5h?GfKOzo;)>Wd4Y3@%#M`39XBTo z>+-g>MPku&E$5w_zs$$_#1r?ISDOSYZ#1+nF>`s3``vq8RKH*nN{m00nUR0*+U=X| zYPzJ3F4Hsb(}D5U12Z1A>eO6w)1j>H;O^=xyChbAdZ+)H8ci0}uD@tXo-#wmpV-jR zwvJVe8&}p>jvJYmj%PXCH-bN}9dv=uAJyn)_|5y)MND zMbwC@a(qJb!19M4Z8;oVzF(mBeEgMpl|2jhIOH7L^X=ZA7xokxvZ2n8NsE>h^YPB# z{(RJkCN~|1RXu8VDP#phj(Dr6l zcec)LVYk)e*of;cHD9fq7udkgKC|~dw-)cp>$$iHt+1RiW zW31;*Mw?Psv?;xzvq>xQ%(LvJEuH>w$#iR}nxzdqdFxS$jp2WGx_ElETfDk)(yP&x zDy6EG9&NfttXR^m|C*?b(#x8!ihen|!Pl1Buc=SDZoR);+4-s^d&OOur}5I4+Yb!a z#q_wH?_qQ?RoJXI2S+wN`uXja9h2_F40m7k*Z1Jief^Wd_c9Hy|J|x|mGH~2F60g= zALet%$LU4f+nVuF%Kay2PFodKcVMSO!|U}NWUt!geq#RK7h6j_%O6#}NL`)9TdN}0 z#b56%GVx}!yhk0{Tf7Y@YNcFSyh*`xEuF$&*&i%(vYk`zvAOc*??2LEee~86i{~@e z1LHSa=AUz9hI<3ITtytcD;GKU(&EwXsp<}m9=2P)v7K+;R#ht;bWIPf*Q=u9?BQIq z3yvP6>op)_>>uOD=PNwVVf&%2yB%h=RlKb4;nUfrYMIQM7ULSG&Unx#cN1N}iD<4- zt$OvR_}{8#IeEu(hk@;SD|=q7w!`Aa#?^ndb+1_Nn{T0MJ2&TcK9EPX`%$VzwEx0T zdrRx$s`UFBr@$IipXv5RczTK1e2C4tH?XPqm|Io|IedhBh z#<%Rz^w^j@J`RHuidozk9~5roI(_8wy}1|7-Rs!1ijDh_BCcmGPKGsaTdC)bMNV-R zZLUO2SX$)a%bD*g9*pP_`>xiw`QK}nza6ZI{U>7ildc0lpE;G{P~Z&Xduq$$Zl!|* z_niB{E*$jzO54DuBR{1J-=#^|CmRiZCy5`qx_2B{ZA!^ z6q=d)+3XU1+c~Q=tmuhtgt*PxpHkKXUyJl?g?%{kfW*^!NI2Z~+ZJf@43$RH=cT3!e-vo zPPJS;-M-fRu4|vR?OB9fr<6;hPg=Tpt9EFUPmXx3*|cTZrK_hmxNTJTN-FxMk?+PI zN3IrVlds$Nq^dV6y#Dd#Xz{BDp1pnbveLU7oj3m(-($hnUeDe=>%Mwx!m}HVn0U9Z zleQ*YJW=WJ4abu=9NqFnjaoI@&U&Epo;B^`+n><+#j}yl-fNBwWUD`^7TowwSLcem zzBku>ZTTtceUJ$luS^}Z)o9!>2s+{I(Sm9MMTteO<5UH8w>OPwyJHd}J} zWSxth-p!k!E&L>t{Z{GO-1mj9U76$ku$=4U@Drso9?mN6a;N)0Tg$I*f2QGS>$c~w zHLBJ&q3xdbg&Uk~eB$rxry@Fk+;OMG0cP949aDqqem&{fu-b$kn-9Eyd96{&j2q{^ zP2bV_Z*|F@$E&Zsa&ukhTw{>bt=^RDaA^CXiB^`1gbBqbFTY}O@l5HhZC96U^0u?z zxC{0cidzS!mASJ1c=cx$m$w~TV9c&n#STUlETAae!>Y)+KP>0_xy-XGx66HZ!$Yf6 zA6Kv5_Orc3@mqfsQ1obI)ibZpn}R*}ukFp&%(vz7+{ev|k2&ALLQy)=YIb>MSBYKr zHuoZLcd9i!PpwzpO^(^P6 zUayhnWl<_m$&E$EgdaH-(#5&NW0zCUS3fW0bhk(~jg{hV^=g-`6?Z@OuDS93^grkK zU00&Xn_a!zowb-cx)oBow~w7rA=9xJr#s}`65VE4;hwtvL5*6@E}VPO%2Urq91HY4 z=d<|2z6NX0j|&;%-ZuBO36&q0>ozn`%vEym z?GBwfsHku*y=1wV(F3jyarY|NI#2W3eYK0rdiGE4SlW8y!{u97AGuJi;GK&OCE6UB zJgjp6ymOBo9DXWS)YkB76^jii>lre>Y)FxvuSRus^(nh@&(cx{T7^a4{@#1h@b!yp z9(iAFvmM&%FIl#1Xnc!9t@gbr>(Myv#JZ**IxT7OP^o)rpE`8h+@O>BJpXjJ9})R3 zep$wZ@G9{OE>9WlH)>7og`P`1{8xnMZ}Zo=#M%j-Yc4HJNdD64-O$BzyQDq!>{ENq z=oriR4So8QY}moO(UkPjrSE!e8$Y>`_;A2RUHcVz9MGLb(@F(w3frd0J+R}{sJR!wnqnm(h~{OhGG-8~Yn2Om1F zb=&AsAWy*aYHg+_SDt?O;lSG4LYnHzc)GlaT9I4<3E7rd_;WL3BOJ{KT}(gzj_K z&N#FD{)XV|Rt{el*!o&jAJt)^dd<;2iZ-vWeY~tcw}@G^*zMZ+ZL6PnMc&$fdhvPYRQkoprcBcF zdLjOt)75KX#XNWH$=6GLuzlTf1;ff7*|w>`(N>dvyRhEnORnwru;#=wiq^iNPC94L zhbKEalna=-{YLM>BNSKTdzEFaD-7N|=y{or$-c+7h2C~PTVq;`cIlB)zPlYu+t>Z% zSEqAq(w+P7w);BIDsa0&IiF#}qaUQ!8M;5s;eg}WXL}b|^ld(1W4PtgeJ&rm zcit4IUaI)!6w+lua(Ty_3nn;JvOUNAb3Y?t_5K}k){igw?m1iY>+Fa7`}7{*cKXNC zYl9a(Km1|Snth3Ex|3RmwxIyk83dFL9D@6(ZSnqFf) zc3MrlRw8W7>rzVx>n^%!0zUJxcZ{_Il{jSXXvH`D@lEYxNsg_HyB_aplLPooc;$V))4sA;%s~Z84^8Xk2H>r``G4`JrRlElNt5v#(pBB!Aby zx0ed7joQBYXy@n8axDn%cE&n#@ku}1Tum0Vuj#cveQJp_u}duG`^|_g6jH+iU1iG@ zPptjnczXVjy3M{!@yqbI*XG%hl#+E$-E(I9)!DH9kBsI^>-#mYHht-^&y zv_1E_i7Tg#QN%C)Yk1||ZtWuii*{=}*2RWdc(I|2GVexJV;A4N0Y_@i@qcCgZrzk3 zp|&1<+SDp{C^BqCw=s&Pad}e}=?kY#PASsOX3qEmrCX)Uo9|!rXyJSv9P@T)KTtL3 zc+CQD(4O-VYUW~{pX=9R*7u!7JEeE1dOo5>t51s#B`v(%PxZjl{_^DR^)p+!K6frV zc0--u@dx}yuBZn`&(DSeq-7;&6K$#?e=k8j*K`nlAr_odg|JaTvY zp4Psn{&*aJ?ZSYKLFG;lc+%{Oqc;Bjg^?Kn)_oiA39w!t8nSlB$HBHWs(1B@vQ21F z?&djWVL(`D<7@7-UOaK>Vtpe09Mjj*bMw*=r!Myc8t1C*reULkoj$x+wIa|d<+baF zQ$1DJS9|nv+V#q#le%x$z3GFPh0Y_pty3>_{bSu7cBw!55~FKtFwa--gJ-OV}qY@K>k zT^FH>>!w{-g1I?1pKZlAC58t+@Lk>ELfv{t-#LdZ@he=z_3@<}%$qi~m!7S6qmRd@ z5>AcEDsORn{#=oFjoZGm?!y*$j`}csvSt77om+-1_R5tWaj4As^e$fS`*;QyTUd5e zMzmXOSGzu)uhdW$=y^J5YvRI?Ti^aZshdMz+9i})x$tG%@|v=1q8e=+*X*v>lq&5LUks|` ztqXKcEOw?~+to`e?91<>?pV9ynfX)SL~h*}p1yv*OT^ZM+TU+~NlI|qw!*okZQqrn z)?4=XjH%q&D|q61FH7e_?t%Sww!D&fzmC_Tt7F(_UC~#r+xD1N@=c@M??+_x&K+iV z@UOQaUq5RaztFIMeJj1D&%1tw(ifE+Hmc#}r^iO`9dNUv-Ky%h>clwbnPgGHch!#4 zw?;IzYH#~_+4ZB*){CPSH(43k_>TS9gd=(KX>N_a`S@n%i_zA0VUJ7Z)1-|bG~+qT zjLnD|RefvqT~2k~+SETewpQThhz+-2cDnWQM~#@Tx;k$&uFmrr;gR-t=K5PFoG+;V zTo-5m$L5Qvr6RsYj2M09?dp1&>QSTqyw<}e=6s>&9xiTkUcZgxs;m3C4vt-sXGQag zuV;R(c;;Mc?zJn=beg^A^wGOR)P*}=vHkvXm)o&Wk5{)diya-Qdtc{ly)UnV_E!Gb z=d_FJS%-m72KQLEWV3rz!#?-E1|3MalGN!==D=kQw8ux>3>uyFXX z*sisqC_|`>3(ARBbDDAMokw@t6Y^2lh5=(x6=Q za!rJfM{=dLYm+8+S1LdB4*22B*i_1cj9 z@V&gC`xzMip;`JPbjZc}dm(b?l|r z6}wKdU-jwc?aBvkS9rJki(=mRw4hN5Ulh-~Jd1Wct7|nIeazUp`9sr$qmO!C^sf17 zLyOlvhx_>5bD6!tQhlQH+M*@)K3b+Y?Huylw^*ZUHqChU=nnBcypYWzs6d+o@S*OQao zuPxTLuGlm&ATA_h#PIQ(U(^{>ta*)+&4M!;B-nVMZijY@^iPM1Ypr&4`~39MgmFc@ zC(NGBI23wTq)B4YO5fT}C^E4A(3hvb)LT|;*0GV+?o~3QG}S$A-(8xM>(=7<6;{Xm zldg|DUA?F0felscaGVe_t?DqFi9?7ShqSiUiJYIRtb&q-H} zwP|*5+l+_G)lKr2Zy5fl#wGQbVvpBtD?HFQ=+WtF7H1QB@0nt3mkOiOs^}9tvCkBjL#qt*%Co#)&mQd~i(K-pRcJ-@+>44KpAs~a<7?Nl z4Y2oeiN0=g{-UDKx>c&lex24847hgJGxz3gRbrYtc=@|k>^8h@iR<|uCDn1*9FTZ- z#ru{QXBV05?eCL*>{io^3jW1i)#D4W4$b|WRk6NqcSk*;sY9HLf00wCdW9Z&l2o%z z;QPl9dZ(6&E3SyHz027@x>CL9RWW&Myjoe@A7yi1p=^!{Wpj$UsGqK?>-Obzwf-$t z?OGP8le)UfIjOUo92U`UBoQ?=du!`!L z5W7hEZF1dT}Ej1IUI9P6ttc`%ncrAeD~;f2dqwJbBZXu#tQ zXFM&E7j^AZTAi|C{t~a(EA!Ykik@oK@YdpWDXr_Ndp0ikW=1?3LVVZd6U*ee^z^)C z?7{kfCZylrQgiaB%b%?so-9dRI($s!caAp$6G!@Wj(Ium>defpSCZ25_yiPQ?cnNY zx4NcH@8S1r2giO3-ne6X?J*qszvt<*DvN`~MxNMfbuT4lYMHpH33uE!+I_2)GR)$U zQ^$1=wq9SpaU;9A^X*d}B@eQ7KI955?V4y4OF2wpU3gZ_rp%7cOEz72)?$`jvYYD^|Nb_M z7vAgqXOzkvfRCquGfMNw;db% zEcwQlFVhO0ec0gKk2j_Fj=F!|YQxaxt-j{(emtnurov^vzbYJgIR6m~hw}H|oqG9q z;D%N8Z!NK86-UY*ycJwG@6ifj*DVK*pHecYXtfUoN=|7qLo@D=0u}BgS5Dh+*Cdy7 zu7zEX9bS<)A;w+lpSrDln=x1WHya+h`2F&2J1pxyc(%qNO&_lP<6OVZDHR6XKJ}t`t1TG`uXIC>Z{EB$ujT#9XCjz~in4>--bi-Sbv;(Q z4(c!ey;bNZn|`$qS}l0hxWK*qH+M9&);#uL>&IHytm#@d?3TsH>6w*p=Cj&)x)fJG z#v;RKTHFwehYKUy?{O%4aQWliH&U$sm|1H0q9GHDycsajXPaenpO3vJ=1uA4lIU#J z{K}AR6LUrMDY)^k@^<@Gm-_p-d-u6hZ+T$Q>=XY)IP`nIZ}zjm`$tL+8I|cVZn$GY zIy1Pu=g3lb7mnI}=f~Oawv&#pIrd`X)O*gOJ}2cqGa~heRgV`_Iy9M7c=ki}F^3jK zzYR<8zy%%lUT5{z-g)5Q`!@aFWp3yda<^8|D*G!JtrB0OS>M%3nQh0f{oJvN^@o2N zUAi;v==S8jRf?{-`lMLpLQgVN`^S#m^R-!$Q$Nk_`gYf9`ptNsxnuI)Qy9|g#q^uQBDs_i(@O6wKkx3owQ-tL-JewW@uQ@D znNRiq9N>8*X6x79HQd5lj;itI;mbQg4cPIIznwmpFYL>spxs5b9jW}p(c;0C3-EK9&1zj?^4~)9<>dv-tp^$A>)Du){oS6O3U2VC%NDB zXE(c#^lo>5aiic1-PCr88+|vn+K>_z8T%|Tz5eOY&WW#Y4tua`qV-j)*cjiipk%xC zr@DAg@DGj%p78c~W@ybtm%X+}MYMDGs#D(gL6WEKqA9bUEw|ratVP@19y1=_KXJgL zVMbV&)f+~>+tk2o-EsASz9;t%o<06e@al^fZih$uZC!FQF{#}+{t%<()C<8|%eHG@ z{qBV6Uh8%qshi1qCr_-CdeZB8#>oci+G&yAu2Fn@RO7K<~VL?I(yo;#UD=k z915wsVtr`$YoCVKKHfa3V7aL$qU#hZmp*P!!iATiPo0|kZ;4%Jnc%ZC#Ch9J-Nm!+ zFC8@JaxcnUH?!BfRb6|=?s&JVzGuO5R;`v7i|zIID))S+t`76N-7d7pCcAsZ^4KI< zcI|lRb=O5zW_11B%eiM@%=;@YOxc*2G0v8qeNJ}kvaa^l;Ob8G4%R-}XEoy(JMa14 z^=^4;=F^Tm^yu*7)jo#<>OSgszLrA`?=|TQH^tj|))-iOUfGE;A=}ocP1UMPHyeLG zxXFBW@cNn~-Zhx^V|3|rgGbiryJCI*frBEsf1d3<_wdimvelmKYyZA57c;6uvF-=L zRTtvwo=s72==IfgmW}Jou#p2-JEk=LtD++J=9=exQeJO5+s0u=flt%D>o?b{+ttCd_JVVENgj6>f8LUKD|OGo)T9er5{u37`ms^D^V_-T+BT}G zcB9rW9(TD<7q2(dfxo=3G1sazF}Q3;`{sJg`KY3q}D4orbxdoFT)c`IMr5vU7crP()|33 zERKJ0ov_TpdT>zQmtNmSwm7vm-=Z3yMz$yyoWJ42*HtT8X_k-F=qxjwlc#m)ncJg9 z)eZSuSGQ{Y^zex2(S^7BZ$$}!-JQC3aW1Of=x<-l#<6r}c!dbdef_r=+MRgk{W7;* zSMChie%34Fm~GNouOi3WH!aYu!SVLq1(MFsj=NsUyKR*nx$Dl|J@nL-2Nz$2`TKTj zeSK!$t`EMno!PT%*Ob`u{Zh8AFVlKr-OXvKCHADBIprLXzQKA$g|rb)dDl<4F#Yl^- zFShj!vQS*PtBK3oM7L#bW;vVqwvVhI&d4|Bf#aq2t|yw04B30%a(1sKfkD;^d)*>G zPs>SmX|X3~7HCqa$%Ou0YBk+H!0Y@1ui=+M?{12HvU{*!x#-#@LlU4WZn*qC7rmsd=R znil!eveY@%B{YQSK2xpSZ(Z3kI<@xZ7dJA#mmBjS*Aw*5@(KMv4)7U%byL3Sl@ce+ zE$}BdVDjc2-G>gam=?73^R{AjiaGw>cv6XdeqY&P3C*o;mbf|g)z)Bjdc`fn`sF^{ zXKlGHi`Rz@zrHuJ_=$;5=XB8{TJ(&abS7lS?9j=3T6(X%T{LgGPc!F7)wy@vZHMj5 zX2Yi4@4JYrI`dWF-3LD7cW6($?oILa?pW{W!-k61362#%d}WRuPa3!H#kI+w2c>3M z=W?lDwP93hMztAX*Oz!cu#KD718oPMqwRnL+75g^v9({zWVgNZPVQ~vHtO$i=Pn!D zy?$>sZ^|WwtNZ%U`5&u<)amHzy2fpSvZZhTHAh~TsH)DNf0c_;L*E84X4E1zt6)X;bEs!|!rQ}Wy!J7toS*Mm~U3pZJNYlXY$LI9LtD4*>%w2AKsa#a@(|kJ$uBlKi z>gDl+A$f9lFBiUbO#Ekd)xoj#Jj(4T^d&uEe)~=B?k4nJUu)5}TD$tYbm$-KKG`m+ zVVk2%^#2Ttw~P9I{owPa(e_7t{wLZem%#b$sgxV z*>bYsKvXua0^4$bV#Xbh$5a`3@gkT>N>_ zc5XX!l{?-3K%v729X>u+6g(Yu!1nOL7oX6tt}9=AH!ZU;eCdF3PEHL+yOth5cG$P4 zUlgw4KfW(7dnM1CVwOyBuJ(m{9klBfMmM&NIb8V1qiq$e{SS`$bpO(XYI#d7Y2y<=mHVfE z^ys9c%eH$g%y_?}ZIRqN-5#yl*%5tq_gTOdI-ED-&8~h$S~=ypG9%h)h3;ZliSb2; z4oWz_EmvZm$J<)u8_+EvzWuaC0jguKx4f}<-mziPd}D^M?eNI@UinA}; zf=ktJjpCM#YpX1yjI$VDOIb!y?Mdx3Dc7y-6{nJSPg`DWY;XU5DfyaI_Zj!OMAJe^ zJ!jS^-L%J~9}}t_I+eEX^tz`Ty0`{7p7_wS_slPm@oBd{Z6D>Bdf4I1_1^if?x_55 ze|RpH-;yP-Ys6mq)Xz4y;gqufEV}9*8*;g1{L@lH*4IDTplII{maUz-{dsUsDet&V zo|BovHLX+6*NJI8aQvCb66K5cJYj?CsY*MXZQ@XE#Du`|vz4}mgOl?e+t@ASu=2yf z`p?*a;p@50y)9$o1_q4l9{Fzk&4?|n54?UaoQ=PqE1ETI#BZRkGh*4#pi1G>dBL1dp>`@mymbnTBfgH#pC4=(c{{09_j%r<4o{gCbFtj(?!&jdI@aUS#BG@u^Lr=W^DqDK;fawC zUzX{SFsVn;(VurT|7idI`?l9_X1pKS@^ayTB3?`O|FGInzxgL^*tO>s=H1($5!rdb zF5kcIPj7gp;>)$4FZbK&Hlaa$->B;ugKjTBu6bVVruXNI&B}$Uzh3(``*P8@ncVGN zX(_i){nM@0g$sS2Kl*#cw|Ce4oNLW^PvUa_SI#&`RB zd+D_?n`d>s`uUXYrzeg5I*seIvBl(af3LD|n>)FCvE`FrPpZG=%frXB7W`BAP2I!$ z%^|HufL461vAcf|x*yjgaPWZ0@Lqv~^%oMmhY#r0DG=RY?C9R2mBP_8Fe*af*tS3V zVl&~hx$xN*-C^7^Dx!6#2z1x3{y%N4R;UqV)+4`TYn4)ge$emwONo6t1Ox}7OOer6 ze9*PXhCjC&fbJ+pe{01k82q2LVim0L8>i6U!HizjN~_RcTde<0r_kT@tN%^ugf2HW z{H|0ec~bhns}$%*_>Nkk6o%7EsZpRG;qMH(3E1#Et56y!DmexE5x%2UC=FDVItBW{ ze^)sv(2wxDN}=LuHA4T(@7O-DcR&AT1ETOn(2Pz~PsiwVtU{|%>TiM8@i#u}Z;>9X z@Ky2SQmFVLDOCJu6e@lo3Kc&Fg^DMyQ1O%%YM!V<&Ce6Dy*XkXy5V`SLM_Y|-TV3T z-siyzr~HmTuYl%B{d-xmTK^2Lw*Eab@N=>MlO;l;q1GtS4_-Poqd-5x@2o=2b6);3 z{>yzqULg0CBHY)n>i=;+o47A%CFH*9*WB0Wwdnu2PvAb%4~-ICSTE>=Mx{VMSU)ss zbZNcecVxW{I;3F~=tuYty4c=eMm3xQ{h+^RL7y~&&4nwf7Fkif2>joQ5>_+|+-C&O z2Dz{KHTN04y!`)#`#Ir17^3%PL^%E*cyAQVF(^XgbzL9mxcf&$1crz4u_B{UpdVh@ zkqI%xbN^d$8gb#Wq8@^UgX+PGESBC3{$};iFP2V$e*QnWCMHgZ(JIgnb}+1y0{vvo zsjz}qgX_lqdfiyPR{qE9X1rx$IR*MLUC`edM-x>@A5$A*XY~8eCDQ+{R-hkY=`;$~ z5Hqlh0{sYoM|(ZWxVx#aePZ$6h~=f+csIlmJ($*LsSUS8#7A19 zJ}Ql~A*M_5Kc_pvpA& ztYZ}D=YM5=vm7uXLyYpu=!c&PZSGmeJ5q&?*H*Bmd^nZg(PT}Hvo9uVs&vw8%Wqy( zQ;+&{*O}9{lr{)fI-!FJ^na>V`k7kB-AB<`hskmnr(?{PL$8%)%Q0AgTo8$lT2LI^ zu3vBc@q>O$3jQPjec)i4&y9L0G`tWf_{@%ng2CRGF~nX!4;2hr^s`keQM-RqMw=~6 zncrG@DEP1&ePCj|M@G&aKkBMu)@88o9 zC4VXe-huhuGBmJ1;=RJLRllIfaCAo2G&Dj{vw2{6#DH-BT4+${%t^3;?G(P~5DTBD zwQr7A%sogU#PjW&w{4+tYSakL0{v1mY(VcoC;oqGWi8`Dn5~=1AYA)}gWPc-${ml97kR{c{TO*3 znZ1`|ztRwTYF34GUR0AVu$GU0n0eei--+IU91*)^My ziUlv$>lDR|c>R)|k%}}U$V#)|)^tXC7i}^lgC~F@s^W}i#GiUn%t-JhQo5lw7ERJ3 zYNWn^8ZVnIh6WB@N^GHc;bUv*#b8N()s+Dter(_nI>iRl1mr3@xvV%YSX8e$bN2>hYD z7{g2^BvWs-gb6Xg1Mr9bVuXK+3a%2s)>Wtx_-O@=Jbi?LJ%SSqD` z1eW6Io2eZK)D8ur;%aTeQkiO}Bn2uAa4+V?BPI&}lc$Ed6nzlDkCz;%@U905mJl(K z78NKc|60*SH5XGH=bG_U3*=udzW79RN`~OiP_n}Fl$S=L zoC?w`##5-FQc(~|PRUV_7ASyuxrK?enDF#pHT-GONFjle6b3QCKd2>D?$o* z$cJd?lNT#gbNGue3P>woMk7YwWKD&Ao8+2G#?DIpttCIjov3Rl%9Z#Aiq<5)K?;9Z zXep#Tnt42jYmdxURt5YOUx-A(S-Do76n(HD`ryl<#3;8h--zL|DYGf5ffkt8+=v=g zLrssAu&9vpH(y5VI#F%wuksiyFit!%u}OQj;WY^-nQ#z^GfimHP5CrR2UKzF9}tQX zE}eP}7#OHPsjJY){$Y4<|Ncvl0Yf_t^bb=Y_o^TDzyAV#-S98W7^wwX$LF@h1`D;$ zP^u%zNMT4Y9|RaliV0X?k@%XL92gt&oDz#n@~te0S9nH8ZO`xl#Y)c z3G2`%(7$(JI7$&4e|iDO9ivWa8BOY$oy#xYNV5c7hDgqUZa8DrEyl*|jCM16~)uu9S-N`@IK zQZkJL8q5cTff&TNwbYcWdmPEu>1HVqN)eHltrhk7nl=@3{+Jd^@*t0W38 zFfx1*V-B!Vzh^hKZwyS7@P(5(L7F7GFiFH$=8BOf88|+)LfA|Gz#o0`ITQ5B$KB{t z*gObjp-NmAD$^ilUnmB`eZGoWbe;qsC4^$Qdf9Xhopc~`!AZra(Bk6iSn{z6lw6V# zfXNvCU7~Ztkrpn@#gP_2To0LRl6@NrpmBUHt=PCtSjLN;9F`ICR}9Sd@TI#sL7I?g zVqngNuanII()xsusf;o#kWs!iHz!CF5+n>vknr`uIYF9`|6pMLgReo(3DVMThqSk4 zSm43=dgz=O9ntMT{i92P;NmYC`bXLvGH`RqmmcTDtVz}q?y~r*wVWU=9W$v&)`0^l z1HPO&2S%qRSqBbmeEHhpoFGlI4jkBK@uDS0T8Ki7Js3t}pso)>^daC6lmY-jDIgG( z7=nPlCwOzAcu|R~-_hTNXa*OOqs|eA6QJL@qejJ(#+3;CJVp6o9LA_7qCpKkdKi6#G;1Okk6=?1~jNV z+n4~K{TF2nKAJKqpcHDRl{mwWl2F1%216Z@3JIp-CyWBBlGa$2ROTi1;;JM!id7R& zgYh}_uMhYb4s3gLdTOE!!Uud9T);~!o)BqkknIP2N+;t4j><_&T!4nDaHYN+4I`$r zq1_@Ln*(N(Qx!rIi9c^8+CC^Ndf!639EQ^@Q-72L%K>FaYDX(*FUF?`h8jClVQtK{ z*LXXka+0cJGFfktG77ku#30Z(^i}b=0?~!wosbIS5Cpw2SR~VhAe<=aB|BSAl$1_z z+*BdE%855*a#V!0Wd;Rz_+7Ltqd2xyI&s;=GNo}Wg_lrt+&Gpp5@ReL9;kDe!HEI~ zpmYLC&G$7EBVZ!NvK@eQid933>b1r$QspG+0R&0^Hyy6Ro!aEZ4%sK^O5<=#g}`Cr zrV?`12=QTd+6;_?hO`?2WsoZVU1AH0!!4DQG0T2srHRHN+a%pM+`{7#9XCPJ1%r+G zXJ)XKK$iF}d}0Jl)7R*f&_9d)|5yne}n+E=NF$O-4Z%|0VGPwp@Bb|KG zkj^}`#`|s+-!d^LMn_6MX(3~z?2?Hr$z}{WlH-pggs@pdiVr}AsfrFgr82anl-wU{ zh{9VSo}5?{X?Ma%pV%?vFxZ&A4AN$ab3aB}dKseh0>{e(uX2D>3{iSP9L57S zbAq(A^fDyr1;ukJzD;RPjE*F|ph!$5S(=?iwPvKHmz9=YmgM|(AnxD`#dCmnEXl{| zfRB^Jlx2~3EGfgJ1CD?WMF1_n#rL~Pk+9qMlSfW;d%!VYi zEvqX_I#AF7cR~l}lfSZ@w6<~5zJeoa1+enGZxxddQsl?)J5fVxK0-&ILX<0jWwDP% z`#S-;t1`5AHuQHkG#`7p^}8# zWtB8?FA^SzBe((92`Dce3{n1?XbBl8)(PzN_y*KDpafb%Fvr3Z1v;P}#jFW#i$(d% ze_O<;B=KZf6bCJN>m;P2_;Uz?J!N6ak`87k&KG0KM6(1ex#Wo*1zU_MldKZV14|-` zvPhX^lwjIS5@nY~$|Rcvlc4#Y)a3gv+0sC&M`x8FcH{wIIYFAdF9vHuv}wSO(}4jggq38}RNz2Q5^j`LaUdB7 zXqF@~ZCNEvvJNVcm!gCE$!9pJY?xI6lPHNx%i^q6qyP@|cT&-T@hE0Z3gAF10+l3U zAgi+`Ssl=g4o^c&^$BhpgPzgVRDxT^$Zhm2xMd7rM$dv<#`se7EVyN%21+FW^Hf6P zM->L>p}Vg5!#wn9sDgk;;!t9wTjb~w&MKq+I6{nx#$!mOn7kjD0RBG|V~~&&0{H+# zjzd=YMz)>M0;?(64avNuM#!TWm}M3>L4PF)=Yc|tp^7r%CQ>0g3mOipBte?On&3MG zaIEOnepewm)t?UwGlcmpF22BP!bwY#=VsK_` z^d?6xNWql~mjhK9wk<$aq6S0?x2%5Fg8gkf<>55zh@nNC-MZD%wJ#mpv7oY7ku0!2wkm?IJ^c zNPr*KgtTNeGCoxSETgG&Ln@O^ECac0NvJJJjD;{4^Uq9-p)AoM22~hoBxg;e(;*}P z4XXyzmxNLZfffcr36gGz+D%PP&PqB+D) zGJc~Z*EnRGq=WR6Bw&{y=>qOe;Gemq1IEz74OJK`Cr8prCjn|G4tk9gbKZtE5!PBC znGH7P(S(Nps&=HVhqVTXpC*Sn#aTC#IljBgT~mFt0|FtvaN%@ zQd^2KNQSrwfKJBl5FLhNlrs7hw)PlAhMxJL1%2Xe z2eusO>L!d?MW6V6Snl+H$JuqfBKl{VWOcS}v!L^n?9o9AK80--78O$&KwY+t4*AuR z&@>?VY9qLnImF9&LqLKKu#B;b!|#%o0kspq3E-nQJX{hkI!E_Vz%{ESp=pq17|16h z_#{CdSjIR}p{4`mspXRn6bvW1 zL(tGrEm?D&#aaIXqG7DOB!~tJnjWg@Fm>`7LxO0q;GPOK9bk@vG;&)KQ49%6!Gb=5 zYQD@}%&KK|*+{`B=p(461I$q{hGZQ;`#UuqV2*+`$vS{Ga%wsR8U<VJ|qhWl|z zc&d5mE=VKNRKwQ8MAE?-gk-N};Z6|Pcu6?0RtSf13YE~SO(pbV6D$!L1Aky|D)LHD zJ)x#Uwy6zQLP?${=BpKdd{1Qc${pZ3OkOz>2 zSHZZ!sH#dr38nK|911NYm`%(Yg5@Bk8$g#$wRGVXVL1#!XzH@Ee>q@oL=q8;wO5VN zh=T0k7G`*&=Ew9fdG6|GSXw#o)2uz1@Jv0FwBAg5SZu0nNiu)eLi9@N|U^2C2pX zIvG|}e|?o{{KtYmjrd(M))IsFu;cl8v)=D@JRokR!%(U*#!wE+NS+7um&EU)Wf>oa z{B|)0+b>CoF+q$4tfs&}Q&~cHEE-o`NVa+-rf!8qr9zFf4Cqr(eWCq>T4?W}#v*7o z1`Q~;qPw0@jbVav42YoUK!0la3?~ILplK(57o}hdH}9#1oA)s1 zkYE0dU_fwFvsxMi%pb9;jS#JZcB4U)k67WkisW5)CbGe2B4lU;u?+%fZK{?8Itl@m z5yDaZOQ;_yJB4&Vd-AX_5h;m`GhvyKo+hP9LHJ8--vFAas-=-yICTwJ#yb|7P8dmF zHn9wp2TG$m&Ba)_GzQPv`~(K(^yyH4YBAIwToYn;3VwwYZh}U%n4G97!pny7le~7R z@%3ABmo3{Q9fX^b$T%qJMgTdpb4|T@PHJgNl_nYRIKJp#>H04M0sVqDN@u2Zo^a4LHa0WO^o_Lz)1(`lTVri z|K>o4ST!A_kAgJeP>BN_V%3rt+GTOA_2_By!x>;VNN8aWG?7))q5dcsLvSM;XdZmM*hV6RZOVTB2ZbVk#;`!1&5d!JrCx0^xd1tmbHog74NtpF+wJU-5{Zg`*$= zQG+=mw@5Mj!a;DBDA^ByheB8)vwR4+;88;dEL3AukqnEkCYW6gbmztIlCh>n zHw5D0%3hP~iuJ&WgN6=rs1ds?5ZVWVyWl`qVGSKvkb*S9U2veQu!asSD4#S570iL2 z!5TWSAO&gZ`aTjWm;)E%Y3T5T6r&^TmN?K@Si@t)#54#vGYZlqcL6#JYj{XpPLP&% z7aEeg0NsZ*bof3B#*nNU=;Ev4%k^`DF(m5%+W2bdAbJ$DCRqp2##ciJ(UVV_gkt7E zk6sNOM2~_rDVPL34>fcUJqpr+c{@fRskN$OLmYT1WW={T38?RfXR5o%3hOf3z&=(F&a8>pax%^BO}Hnp{+U4 zu^GRMmSz7*8WYb&Fye}0sqtV$2hCdt4Ti!BvMD%!y!K|A2}%_-k~km}&6JxFWl#`H zSTg?jRnScRb&IB><3MY6jdUFef8wFRcc%%{r!neCxw7YM51g}W=wO2yG1wr`Qhjd& zbCww&w%~V(N{l(nehCUBoggCt%_f!^_aehfC^~L}qzgU>^UstqN-c<~B%wl3(#5Wp zgKI*xi^eA&8cFOU4&gOMphpd^fkJaKH95pJ$u==4wcKYY!hSS<6*pnqT@CfV=QV4fq!OV49Xoek~km}F_vqvNf)?s01T~> z#3vfWnBP@mYm7_yi^8eK<+M=N_tvd!7UaqGoLY}`;`Fbau}Rm@{nV~&xm1n6a{p~K{9WK$*?3D6Tt zLx;(ePnmT526{zm=rDQmDU(bOXtbrF!{o`QOo|^shh_~O-cCMc6h06#CdM*Ix@D6C z4VpEQ(4H)cKM9A(frd~Ty4wTg^F@DqrxasI_6)#*G<3*1iqR1b1Mre`7YtI6CRzqy z4e7vf6r@R}0dyGB@YTFIV2G8{$zUZ(i9uf%jUQGCxqt$TpPz8C_ESL`ow-2JqvezVuz%E7EUFEyFN9-U7s3!*C+b-xRwzs zrvCdvxQ}s>3M@b9?*beRvrTranN8up3RE|1B)fzV!ham1BYqix8Sv~D6pd>nF+$Kv zVMv~gU{*ym-@s`}q7(($FuIcv4_Ee@WK;aF0)^EYI`EzbBdX-Ej1-cB#?AO$GSmsM zj0OvmT}LnI@=7DLwnh>QOAuo$YDgUoId>q&Do~1#x4)u{A(bEqC$S3QbPwgn1rvfB zw;>hcukl4=Ftq0aV^9LDzJ>=BiH!lOk`e4od|#*{#TuZggGL(vgioH0t}4XCC8<)j z7Z|8u;jtvh%!E(;n#j=~>Fo^>PXf9OX(Ta?Lahd1r9nJQPttOLl^{DL35pf;%INMx zEGx*({e(IKnO1?idX40jb0%xWyKWh4r6z@Qpc9Hl8m@pde@6Ef;^C5Hnvk*6OJ%kk zGpk??x8#K*CM^3maVc&FNOvl7pecq%5~V13RKPMm3X*qxrb1=>*~2nedoGE1C5f>R zCGvCDFS&^rgHVGGm8ZcdA30)-;(m$5ftnPbgAVtYoS5ScuIy@dDipK*iL-CG;qtL^{ zq`o5UZpfD~;uB4wDpEr-ub|lqLx&BdU<1j#g6_!-9X61HG|9YzCcz9HHjsie$-II# zxeOifkAgJGyn=SH3?1-KK4~J{3IK)~I^Z7#Y0~ZjG*)HkP<<4nNfj=jvnoS}>Z2en zZ5@ax7tZ)RhoJ-hQH+jcbpRNep#%O=kS19j0QF+%fPWOENmd7-XBax*9|dWW)d9^_ z8M?dqC`gm64ge)Fba(T~Crzwh2YEV%4s}OCnq+kV7J{L>c#nd#bnHN^z6Ho1h7Mat zF*?!~7@$xXx{LQHNE59NFnDwq?@^E@Ssei4U?g#2U{ggwnq+lA8$gB*FGoR|WOYD& zIm4rd#P$YRowaoSmvjXk2fD^FbnrL%jL}!en(o&)(0z@e1GiC-CdDM63J||bY)ync zHrTJ>!xFq%@KE5$UH^$Qb2z5eKl2$*^oh?~ap;BqjxQrbpZJgkyMO)P@!lOfM*Xw! zJ`8_G&%*mKHWfYd8!ZL4A?W)UMTtIz@!@OO&@;ZB8n3YadxnE0St+z^%X|XhfJ}(F z#yEj5K+J{pH?WM#4YV9iqEJgBb*6_Jn12N@o0y^l-yr%?pa_z9 zM$&Td{tOABsUOOLWY^=465dsp+8*-lfM9q)gK;Hv~$Nq>BFj;TGS`uM# zz>*SzOf4v!VkAL~IG|w+S6(5Sc(^3JAf2fp$gjgM3$+ui)F?!6kbBnar1y!D8@p}`17hlczO(a1Tb`PKE~({Iq?`u zf0v-SO#-=kEn(N71?6a%oaprVItd1&pmzP* zMa!~ZS?QdWbl_bi0k;H$E!=D(@XsvN0hoA(4hzT_L{-vY>+cdYC9Q=~7XL0eYr=qzOqgEvVsR_}XHz)ynFu z2}v_8XdcSYU5Q6AYeLdY3z~;Aboe_8(!_WMs6HJ4kAgHQE&$b83>^YbK4~4%{TZb6 zSC?68VT}VFNKbTdfHFz@K=l(t2hx*I87ZH6Pyoh8(h<-&l%d1u$sZd@MPR;(4x%TY zGSUzUt`G$o#MX2GJ^5oJfhM(}u_!|a(4!ztiVs2R1iwqnR10A}M!yS=RY;xk9tQ39 zFq8y+3aMBDn!^Y;DPj|$|DF(53(y=ahv@GDG=~wOIhY-?Kft3dF_zkQCfwm-0S8xkPmnJg8 z#f1W2&170_jM-r%k1|YTn$J7Pk!ezJ2J`Qd$VDL(FoG=N;mUQ@NGh`@DGIueFp}^# z6PEF2Sq{rc`!3Mam61kR;q00*%P_J}rdv>FQ}1#WXq&?D;}JDq*ew7t=0#0`=d53H zm=p!QXc#&aAA`|ma@K@c#R04msSSY^rfj8Ae0bT6t|Y`W`u&m)0w77y8EM`*4$#M7K$;9m*Y}k$ zC9PF~qYasWKE~+2K?Yx>C)fI9o52P?j_v|J1|Q4IVHvT+85#!^+DT*zRMJrmseOSK z=E~_Xg%oon`f(8M(cSb%L7M0fL3kt$S`w_pzi0Q109s-&W>LXlaF|>P%{KoCSSSf> zCRq)^KVoq;Rb3V6RmIT31Q`relcNHpJQqwnNP;7UFb`i^$J4~a{q4>V^mAh9t_@`H z-Fh-uMne5-;VF(}9Uk<%@=25Ob1)CZm-C55YFQ3-EB;6vZ1-pNi4ns(>CZruW z=mg91;JTb(4C#0abb@6mVSw_*fmo;n{1@r6LoH|)%Tl8A2PW+E_jw_ zDRuy%BufWnqaaO+9YEhtmJZ5BL7HS8K;KW64$4MBnq(b7-%tE5v0%-$ZGK001&IFJlEj5MF%rJ$z*q z`s4vdX8Scb0Xje&D|Ue#i0AazRGE_2g2tsR9UzW^G%2V8T}fFww3~d=Bp9w1bR}i! z&~6l@NoEstC1rWohnTQ}Ef)o8Qc%SJi!FKISXN1sf-2BFlBI)!QOsI8sA5TG6SOd7 zc^FkrtO?0%f|h?Q9pH#(75k^^^H7Te9?Z;R;_!h;iiPiy_ zP05SFvN~&`bpTPUB$6nrq)9;)=%U5a;io7VPO>_n0~AYlqZtKhlGOnnpjbKxlzh^9 zxQ$sP20B2ok^qY=uC*S25Tm zAWgD5ph*-<2T`IRjjWE8I1sG^u!)l0LkL?gp%(()a_F~6!d43RLO{>LRton4K+nR~ z41?SiI8;LaozN&7M+o|746w$IQU5G#&4fnUtWX8W;>#Kp*s`JT30HMto!37LTRj1_ zgyl~Ecj0~fikO$Cz)g*0Gc{NJR@C^cLf8tU`5N$yu=E9Nv+;i@7Lk$8*Mze}1M*yG z;(*Ur&;)TOLG+0$uW^oF|9640LQ@T4|BTF-X@2LC=1#7{jI3S0;;&+pI)R5H*FsKQl1~X$D5}LK;tE<+O1B2rl76mD0FI z4Six8h}BPT6Zy(&voXN4LORGAivb=oj;?+I-r~)-&}WnsZh@|Qn40Jc@P)yw(M5JF zhMo`%VD@)QfctPd7#xeCF>*Lbjtz}DNy=z}CW4q6Ehi1~W2%EWz)9nRI=q~sgXI;E z#polPD;AJP0$a_59wv0?;BPEOE6G_ZQf2_ORK)KRof}^t#bTrso*O@0xwSV)D6^-; z8fG-;uyHH~bje{EX>S2qLE?AOvW!;`f)yZzK`5z}O)N7m&csV7I&O0@7JzXA|IEeM zxEPqFyWfsA0&|%c0~?zY^5LHGH;9X7Ty=|yiB2BNIlhETkaOOF$z8N;lXI|XqPrT8 z#h|!f$hk4cNc&jO`xC#4mSev%(K##TAWV{kuHtAPSZm?RHGzHRVs2b4%t|6|VA911 zu^=wyr2Rc;c*;r#Xo3*`3n;;({q4pYCgzd_n!fnKk8 zIC2!hnCm^;m&N`g}fihzYxAuNHJBEWR7Bxc7%5%}DV4BJH9!T}wZ#1G<( z25STyWHI7N?viAeHHR5dIxHQ_90X1qeFiSVcjaU>$Uz1tLoatfC-I zIA+#?Hh%bBVo{NBnqven#PWeMfdaq^b58$k$gaXu40yODi4uasWds%y_nj(&nbU#( zdn_F`ij_~AVCHn7%^b_a0>s#y)manFoDQ^WW9i^c@@GwgH|apTHvBHJSrddyII+Qt zr57sU2=3?AX(qx2&4)gA7b9rGW`3V5!*c2G4VAE~q~ zXd%bZftn~t6YVNo6Frl~)`TPk`1}`h%tL{PZ+`v?()t`7K8eFeo^serGT@+B9Y=>x zq99E&;Gh#7M~6?MAWgETpcNe_dEgDSje<1Eo`Ozu_+4~Dh2=vpO!#aYb58$k$PYrx z0u$_#ka+%Z-#ADV+%&Ra{3Z&0^412?`-Ph{&hm0}*P|KJ6?c2?4NLo5k=m(pA`DU7bW2w zmj3U8Kf_&Y(6dm?ClrdXc&mu~9IidX{zUI*g`iHjfC-yD^mpC{=|Ay%v3Ba8@q4k{ z>Ys)833w~aUfD+?*_NCK=aJGq=FAUc`K&kMBVKRQ)SL>G26K|tmN3S`m@^qcEkklk zpwkQ|3G2f$#9_P}PZJMU_L^i@b{?E~a&)*h4%ep2VHwGts*I0$@w=qe4zi37N97)9 zWS1C&6G=QC(Q%uJF%}P`mY9ELVhk?7#HX~P1V}Y$LIoD8d&8!K#mD*zmOm5ItB?@N zV-YkP1AuyQbjUvr*C@-83sS73GTsB@cZp5EjY?k|ti%vhL6v^7Er9|jwYfGi4|0!# z7!*WFBs>`DqXz~BB~ou81rMOF5GM(nbT{W6@5;>N0UV`qbkIKz*QCpl2NaY@%vz6A zmHLWw%88Y(sL@})Dn*DSzMxGJp1PR$ny&z^+&5nVrBQyi*8}2V7 zOxpMxqzDT1N5aI!=1fpo3{Nnhv~1 zCzu-n$A=spK##*94H?Tw^0%N@6MmH#FL7>>iNeHaC(S!hbIAnGgbsYi@i0NmRPjlZcEzAvoTJ0u$)`-(6obxE93Avd zK4s+ABo>;qbp`FUIXd8-{IQYBOmv|26n+<_j0vDByqG936hKvY8fFTo2B)ta9o&xN zfq`;lPhZz!D)u_i>xz@a-avzF1i=v(d(wpoI?(HiqeC2V@=23SC+Ky>@o*cl70&9c zN#O)&WQC_8Mq04i7;JIJ%pv zC`glxDd?ER(cM%U02_(lMZ2;MF_i0EJtt1xeKI>smm`~n#hG7cRDI50k$u9KNtsC(JeB8>2x5ewcQt~m zh{qKA9^$5?b)cgdM+e{GzjJqZlVypr6&X zCOHHE_2ndyBv~X)tnC8GZ;lQ=BcI{FD77+HbYiI$XgbF6*pnR4KT_*z9ZWMz0+$Fm z2?4l-bysg=1kZ_Y8bi;*(V2kjz|2SA!w?%&gP?}BGLmOhP)P7?QZiyCwRAE=O)^&i zG|NeXiU{n&X@B!+8z0Sabg&i=kIQ#?hfy zC>TSsSD<$qewWy+NsEmOKrzSkGEdCyt6@nE9m<5`Q8jXQe#9Ck0BPpvP$m?lNpT-& z(uUtf$zI`<9}n9+O9N|mBpcB2!8tg_5?b;IDN>Xbazg2Ew2U}|gG`(7EFA4&d!S!t z;q)Ibjj67y0E&d81F&$Sw?Y{!vW67!g6?$qU1B^ZoD<**3e!2MVWkiqJcYy67&7da zMmmz#kRoXoY(*t;JLYEzxK6};*2Ya5ILSIo=&W$fiJVy@Pb86$)sO;Q7Hm!>aXW-r z^YUaqYp@xmL)>tpuoob|Bu50$pZHz0@=H8TP{ZmcIy?=B!6b54lH}n4P#M2VbWR$x zBV&9^koh`+v=be8g%d@PfOSHyQ$jk4^=1Gm%+cXn7Xzaq)GMM;2e`)EEA{3-a_7C83 zv~)-j3erUTXXra+s4g;96CG$Rg{jf$D^@KJ1r}ocC*Jnr<<&o9eZ>8Wcvj52$)`-p3xak%S~|#xe9ENYMGM>r z9b!a2Wzt>@RHSO@03-4#qaBlk43biJpl=H%CMF3&(1g((ykcOTLbgjla%hE{bMV^g z|1Q`xe%|H^3d(e}l5hklibkjevm-U2e)?)C3GNV!h(K={EgeonD}QvP008us(b8QZ zL_wNlm_X$xy8WEWJjkCl$ufbIAG$?6he(r56DSTvmu2S=Y2wKO6jq`U0VbR7z8x)Y zxh}(z=}Tjz^n_?ez}`#pA|kwKl2+{^MM%GjcX;Lx@Iw*;2_ZZ`5e31`$5Sk zx|vvlfzZC<0)H8DLo6-=U4OKaNDM+yhrs}5a{{$m=u%<2Iq?NVa^_?ns4AU6L9130 z+t7wF%|YVf68sRY1J<%GCUBq>JN=j)C}+s^$+V6IJj;=J+60wI=voqRP=PECf^Kfdp8eg(IP#)H^hDK}muR0l^4Miq;GL?jD5hM9}|gY;ugg z#^;~G*USU~6#i%>FKseQ+zWg%f3Gou1zp%nCt$+-Nd51Do!7U@k}$Ta|Hs~YKwDWW z@uSyk1t}J=mt#ReP|ogqTR;R-$YIIXn3#?!CkM^VWOoJ@2~f`}UlVB$G^LCdte%(ndlCoz{h27ObsNzNeXW zsplObDtZwdyRG`-AvSZWPs_3#@sQ>G7_Fb+^>KbomM{Xq{uL z!g4iAZ(Y)-7af=;U(flThYaLIZNUYpJg3{F$>KL|WI@Lj2GaaHVtdJ90nk}0Bp*LZy3C*m_a$O}} zY;VG2emNUR+a8!veVY@Wy!oPY!tk5TEN3a{X^QVTFi{II{nptp~B*560iII$_BY0j=}tUk8pW8#v5xWSNhfA48j%kk{B#1ziL?&g<`|%`oQZ(e`P@b~s4VQpkASLu>d=8#$%bW7 z1XS%)hYrX|HY|%GplY8wbihcmVRv-|RP9rT4jM@|ERP|eYM(lEz(%q~1NvQ^RPy}G z$on`kxtzVKuuO;2xz6|&!ER7N(SZIf<=VG7=wN?j!!jKLxb|r?2m2!%cFRUqWheYg z7^kC1GsT^-j8E%0@F2RnLe`N@l$8acIg(Dflj@LF|Da&OYID#MZDu`U9Lf_;R)`*& zg5~PnOnY-sgMY#{s?9w-d9#qyv9$h!P1UJNcxrG|Jxz(us~84d)zUd(*MUySh9z&5UUjy3 zcvIG^C!HliSdv9n2b-55FnQv(EytLW9Eq<-n0~9pzR)R7E>E^7rk;%U(8ssf(9n3zykdcBQT3r-MHlrt5DvJG zDQH)?&>bcELh*mSl{;4MAk1WoCewI=Ky>ngV9CkS!CgxsEa6tDf8UF7Sn|yp2Zu!$ zRY-bd42W*6$CBC85tj=UVaXo@a!Ey>J}L+V7bBI(r1WFT6HfktE~*fdtvLn+H&0bo zsyS$vpZfXW4!vqr!5zB0Z4F_4rVOC-nUDh~M?+U%sG%YTgu6+U>!h9FlAj`j;n*u& zkyP0Wl@Ty)n(CkzN4}u<^8Mre!nb&I;COHg(AH_2&x>;+ZgOD>8m0G&Z|Ud+CFR0y z@+iG#pXcHz&sxjZ<4v2tg(OS4gEUVDrHU$LV#At`q@0y=@9Oix(Q)$F0C-j&jF zMZc9n!Ba0eHTxc;V4wWt!V*?;g%VaAjUV^!M!BE()T4tXk}H~<;ErJFt@EizXAdA3 zmXQ(AF+TO^;CbYVW-n|Z*WOTJXUioQma|bh*M49@M;tuBf|yl~uog`u*wT*i?Q%Jg zAGxC7TU%PSPmMWv9=W19CtF&z&na`jI&wuf!nU+(pHt>8>`Tm5bKGd1t5&Af1~j5h zQ^J$oW__IpezV)GvvKg7HKslz5IYXebxpwP53;3&@;Y4khdL~>&`kK$mb=dqmUWUV zy>&jdwKtO2!NSOeWt{|6?epr~RaIElNkG-!&3Q*+2uv;_tg&(j3?mno zbrR4zpW1S69m|Dfodi_vQ(Mj@bh)sslYpvyYRlCQVOb{uRr{PJ2eculQWXmMoUXDi zdFm&?{rJHg2zdiD^VJ!?)5 z$#HUs?s59N^3)?!5nJ_6AE}d}LJf6?M`zrWu>C?I$3^Uh2SYAa?jTI$!ctgrrMJ$v zICan)fS?{^P)o1cryd>jhFn;FN&wfzx5Vg@zlg+OOzeclTv(DwPRCZ4A~D6+W`y-7 zTjx0AMYCu4+}G|k&5~S`Mn;7W0SnC(&y?nKS1rewl6|1j*Ps3Gx-VgQF*zMHU&=uHG`9n%q01`7vOM_B>0o`? zmyYm;WxeF|^(3Y6$#3@xEAu~RVzqope~wq@ z31KczI`9U%tU`lUdFre0&rsc}Tkk*h<;`?t{_CdL7R5UCRmmEKPkkM1iCoeABYEnp z`$-Ojv#D4#klMASI(_C}giG1(e4vEKl-ghT76duBZDGeOCAZCMNF5I&EVCq6a?Kt) zii~FqnlcxbSWc~N3hkQ1l156e*<+oN$m7%;7THpAZ+q4lh}m^&CO5Uv^xs11 z_t<>I2{|=~xoRcz?6FfgR&{DF7Id?PJbSDOPB5IB!_H1h=Gk|4j}1?!YSPPFVW53y z_t-hGt5$3js+xT;D|s@f6NJigoU)SRlohQV;Dd3>N>1At{O08rr>x{SWhKYA59D<0 zT+|dKBhxS}$VP|$mS76#0?A^wz^fP?l^m8o0w8A$_`d{u>mX$|RCMMZ=@_`Bj!q8C z9|@@1ry3o^fm~SrNI=y--RK|=0^(z*7X<;NU2fm~SrNI=ydCokr}3FN}^M*^z$czH1gP9Rq_k;1ivC6Bf5 zEI;PJ3FK4|b0MSPR$b^;2}hd|npP2A>pOFgIfw(fqKP$ZvaF06&5_uTNV;aY=mjAv z9NZpc-4;)|u4hqfrQor#oU#J&b+Qy?IZj#8Dwlq{UTbP`(q6L`fykDU^ zC1O&r?sVM0u;h@Og@`X>wCqLIzXS_7pZN5z1N)E*%O447olpNdm=3wH{E>jFefrmd z6UY@!zlh99B_AdDKfYjrm;)z}3(HF>oofmfh)7~A=3oWnismb9Dc3&z>tF@s!jd!s zxb}IIaeF<0MR&2C(Jf`$=T64$1p(>~Tkn=U`F)6GF$XOGb%(8ZORwAKP&#k{s5@-U zTYB9-jppD5pzfdrAih^xzLePwomRx+CVaZbNzCW^3ONMYg5g6IaiJQ1(j^p|(@KCV)>@UPW4mN2tC;BVzg$Ajm>3UO)n z@4*{8K{z&G7Q8$7+U?U@^XgyN(>uR|uf0O&Ga(MnLWdhrsI6iP-*lEN+4g?%RnVdp z->dmj$`BOay77h1#2ow$)EBhz7t%hTwRI3UP*|YmFTHbo+cypd2P!YNFmc?B5YD~! z*7b415m3v*3xjk z$eNgg_rPOV$f_B~)w)p!|4KP(aOU_<9lU7&4=>us!i)9*@uKW7KIZ%lyciddGdMso zE}#;FcJ#5{r@@OVS=dl#%L`uxI&0R=9)-7L=$^?U3j|+`P|Udk0_~$tDAdmptx|gX zeEKx$D)X@H5j3_`PnK>>jEqby<^U=X^4nJ8+!G%Xi#gB-grByxD#zAL5wRf5H_0F@Urh%yw9TP)YU&PFZ13RJ@dW5d-D^Eq_dr-mH>0#shi zM)}tCIz(HHm$Ma%;FMw_A=mVkFf91j${v?8dQ#t)CnMX0MYCV>YkD1auIgnL{A+sU zZ8(ed`~z7n_&@eq~z9lOJ5cqM z%(rhJ!@+ex1X(dT-%`GPhSULeK;41(Nr&Hl5mJY>!!Na$*z8QEn1k zGJWq2y%>*9XEK1osTO!K9vvrJ@BolU=TEmtMvjkEB1558N90uB8sInBt}XEH0K1>~ z^riz{0WJddX6fzoDo)o(7tLbW;?D7DP6xgM5wL-pvvkgVs?z~|K;?m|v-HY+y3>Ju zK;?nDv-HY+%F_XUK;?nTv-HY++S7r4K;?njv*gOXp?nUq11b;Ho~2jr-LY^~f#KG<|4ZbxD=gl97WWgc zj&rqpSl&uV`+Pdi!H7VTL7;*yy>omz&OwPl<$(&e^vZoY&PlXH<$(&e!)WM}!?(?-Av4OE2pVji~M&9)7b=>S=@yVaz|sFY?q7F$_NGSr-=g%@L=IZ+D~W1l%y z3lw9Y8R#4ovxMYObx@4u*WDzW@48xH$t>s;)udJ>1YR+0hI@;$1YQG1CFAuhvs5$%B(fMUy>g$9 zb|4yn3Q|l}Y;om29i4N-vBGkGLZsd2D>|w4;5^V*EWO*k+TYdCVc9MLocki8;!Z+6 zA;E;5;Frv~FCr@LZ89L7YlIiI2qucL37l>Oim?egNetiU8#3s{Y%6lm zHFt(Qd&V8$03<~RYR}RuhxRNc79JfJci;ukzQDzJ>Fx9AxVV$qh{^*M zY{`}TqLkte!~iM}T#T1qx#z?r?xa)j><`v)obSPtnUo!8e6Wy%q6JR9u>Y)kSy7a$ zDjeWQOsI0p3pNd>{SFKj9{^E%^xhv{^hymc+B8s8mBJIXyE#WFA;|Ke>JoR(e1Tzc z2eSZuSIq2rVqkQOJ?6o2;m{9(d?}k%f_b2rvm$yR?bFZ>W&&6bQ<7L#mD=w<4ecgd zq4urSIndC>I>+OM#vNz{G_RQL$~ci-Q5v0I zl)<1E^$#NTmnYq*W8hQ-GGD3&qkBt>C=t5-GSWWukF%h|M$Xo1pHG9ik@~=@*jkkr z*C`pFPI15!pz^}pP#lngpHdFY=nhOVGHz&ZEHM8kpmLul=m01{xVOl*m^=?HRb*sL zo`>#AMNuo+2=kaWHjW(6#)8vUxO;5;X=WN9Q;&zJ%gx6CfJ2xR>I9V%EF0Y=8mSzk z>SW-?iY8k5oI9Nv6Db;f7%95g7)Fee&aNqiuj0;K)~A{sxC+QdplU3=eLm;TjgkhK zLg1k1%|l^#A?s7RE@VY4FbOACI_F-c>pF6QNjL$O`xf>tXhkeA2`8X(pE`HL(UDib zmBu{hQ|FN-WMGC(>73_$>f8+~j0I-c1XS)*aV~y=F07y~XBSN8`6&ei?VxNanGmyJ zF?lq4`j9O#c{EzA6vg;!e4Pot@h|Y*DEL@ll1r>ml8du?$Q9R>IiId{Lw90D^F<=M zy!7_@bfuej9}CQs3FsW3u5|P6V@2~awwQCDu1q)wJxIw8(-@_9yH8gpTt!_pk!OoJ z_v%V_T~KttZA&Z1R-nf#aue@kDh|Am%GmPSecIAJG>HW!?36C=*!1-A?z+B#2{|FP z`xfi&J}YvSx01wT8?)$w6}y(c{&C&fz{H)9{_&|JH$xv8&0DR1eEP^u(bv2bnipov z&oQO?3NNyk#+349FWA+f6*w7AoytZpe9{=xfiOfdTOWMo3nw;pR4-=Q-(rn z_vydLj#*&NP)O~?eKCl%M+3Q;`Z0B!RA?4PtW)XI8}sSE$ks?;f>22R`1GHftFKEd z#Jg7mne-^Y4zRv4=}|EyY@~s7dKA4F?V{u5#WshV&=?EM35w~PT1wF+F=*r>TddgM z^~sBCu>uo^LR#q4WNr$5EHHB@pmtvlOWaL#j|HXL5Keqe%8NDIB1%+>UP8Ac(s`!t!G2CYjA*CpoM(&Wr&2`3d|a%N&CXC`KHW{?$2 zibv`a`w|fp5a|8t1e{WIi673{*($)6hewx0v|Z6S=7{YHXrWJ&xe45{zzm{TK<&_E z#paU_emU-@dFvX3Wr}a-fB+Z|Sx0_Ld2!<>0+WVfI*hy&dGTKk?aGVqcIdd9dL9eR zEDC9%Z#C&ApT`1Ii$ZEIVKwPPQI5MA>bk~Yc`;c4x_e3W=qvy!FYbO)U^Y=qrxg5) zyeK_b5DLWp!e=ergn6WQLPr+ri->M1xph9T-%Trz1!fzS-ZNe)b**4vvQg=E`z)}V zR2~b=H7dPs*k6x6wIu@HevvPH_Q=gkj|HYH#R{e?*{$=hw4;Fb`BavR4G;@VI|``Wr?XsafSB?G z3W-QWSC>9AUZv$^qs0Q#jsiIMts30K|5#w!Q9$Ls?GHEcKNgsF6i~TW*SfPYFzqOy za-Zw(=EuhZ(~bfv_vvvrKRyFf%@ zmkY%b3(O{p=?sk$78bOJRm4!!O=XexA!x%{C?k_EY-v$?`-=OywDls}=U6l(`)#fE z`S*|=(eY|uXW@wCv7q)L(+%JM+ku%=xmWu-dz8AcLUPMG2+4hwwIcFU9UDeE9vEuQ zX}A6-118Z{Z9`&93gp%OkC)v^I4$n1$~Gme!; zDqG-Csh!CZrsBWAso10GgHwrTBkc>@<3#FU<)F&QN2hY1&+MW{Alq$gb&k(xc0me| z?Y6Zl_isiyo#XRtT^s}CeQmAw`81%5V-PQT6_C522oMXOXY1k^=)yv$s-9_TV)8my zi%^cNEc!f936(Xrx$$4S{tPLXpW)d_Ti?xmeuAT!;rI8pTU)pYI~7xQn@f zq^GUaIfO7$#K}l{m5Xa60~3t`I>)PATq9XDKh8MnwzbjnMgnW{i*zR|it^ZnwQ*6J zVnq|^B>+4-e`L^+z~}ZlPX?7+Py#U)ckdVDGkzku1K{NP3nU2^Z)j zt^)73O8Y!Zjf9H_5)aG?ikI9uK75&kiw6=9%n1sp+_TY>aPdImfjL0|m3u5_!o>rL z2j&C?RPM2y2^Z`m9+(ppP`SsfBwVnMcwkOYK;>TD@A?dZIY9xHOKps-8P}i&<^%;) z?s51NE~Z6X?eT35C6n@LI2TnS9+>PCz`0Muxu_EHz)YUfEBB$xBwWadcwi<^K;=FS z=OQ%312cI7D)(tP7oi~@n8_1RxlhBn@C)(4OrC(seHzY%Ux){0@&r`w({L{QLOd{$ zC!lhlhI6qE;(>WQ0hRkSoQrLs3oE4I%%-VM<~FV_AJb?rjFy2W{ZV@-L^0QhX{)U$ z996BYnWAvcMqH;q(!Vk#n`{uRiPXntv&3YB=-EPlGT9(niWJ3^tg}I+x9e`K2j&yS zb!tfo3l85cTL~Ax0a+Dc3)a#r_bGZ8zabu&DO5V=K0um;i{B7eM`wkkFS5uene&WK z(Yu%i@xbh!0M4Q4i|iBm0BI5~@IX8;wpHUsPwvhX4FM4KwiWDIbGuPxzCEazyM1k!ZE}H6M~R4^6wjtPTfAUO!#>I){^%^y*TG6i?=@kNUDl%O1 z=M7nF)@<`&Jm`L~mo{7t-Zonul8uTtwnSl#JU zG*Kyk^kU^GAtO!ClFEYz>r90Y_i(17d){`vDjj93RPM7YF2qJW zFm))P+r7%)RfsBFc&l(OwQ($wbS-LNT21Mk`!Zw`F1`jLbBp*bTPkqA;KPIqoe>Yr znF-+Br{P@WjCf$qOhDz(a7EOA!l#E^Y>jweT1`Ove0s=53q_RZ))EV!9&#}%;(=*3 z0i65vked?_4@@qJ>$_M=aLl}WkuE}oF07Cq$~$Hz*riojC%~6_L!eWU^S;20A-i8u zh4TG`PZc@OR8CGI2DVt8__Vl-o}t@YsB*I^)alu3%;40TO(k@IgGNGv^-9}F|`jffkCvMVh;@V-9J?<_%19Mmq zLR#WtkOEMPs4-udXu<{eiWdz@j7UVu?ekqkmvAvf;wn#|kVI^8iStuY_ZEIETozw0@LCw)Z+RSU; z%!N!^6Dw1rc45fo@F|Se7Wk8%mgdO8u91r2FH`+Tmhi|v3wxUE$=bX*ZN;|-2;VJ#AYc|ZZ34X%NhMi=bq4uTGG&q(mPViL^gAajfLm@#bk@K=SAvI=^jy+8!MX#%q&Xi zOM*&RBKj^tOSpg+y0AiB?>T?bEf&Y*DK|VX5qSGgLSOJw3SUse#pat=S-QqIFf%8h zeLjcKP2@!|S=eMRy>omkTNiF45qSGg0Ovk6?80pzm~1O?PN8c>#KIe3<|d76W(&;- zc8e0$g-lQ@MhBToiS!7Q4$^5(^rCc-PzP>Yp)R&y{o>$|2S}FetnCr07S{7t@Mz%^ zD&H+}2^VW5QS?OHr)YErj^xV$)=UKE^(6G|AAUu{mx<;B>ZC-upZE;BoA;XtO#KOH zpKpobf@35CQ-1;~_ZfCKfiw}A`V&yOZ^t|99Q7swQ-1;~_u3yDnuEG?J%9Hw+ zHJaP4KFjJtP$Y^bUHKG^zR^eW<$4T(xjl(OH@3KZd3SN#Pkg4;&B;v!rvC)A&v&mt z!bQM9WKZCz=fzr>7ngN!XrGI3kqArx3gO+SW!;S4L|_I`NbNo~>*hWu0#krOYWL|` zH-0P;m;)42yKle6#f{LV71Uy^MRl@@KBYnQA*obSo<^OTTT8Sc(Vxt%CAxbR#qYqm zLCuMxxsP(~$bBO8j~l9;2+TQ3=*v|~adcundzEwTY0-2mpJMeV@}%6j;Y46AO+rV2 zm&BNN<0_(Fd`qUBtNH^IZbDkRT9>tS%;S&-ng1k`YMfS`~Z=o-mEa?X8;_N?6@dVWFRXncB4@{&97#-i; z3dzW>a9}D;NbMevGU-AnBmxsj>kt73A85Mjg%5jEe*beMaF^ej*mb5ySH8KQ60(wScTCrs{TuZh4+m_(sW7}s_7 zgX=}U@vNVdE{;T^Xj(=@rUF{%)po9?FPgxz<+VfG6>~8uzNzRpUY+DF5{l*pZ8;Y{ zo#aANBm!^a36U|MPKq3wsI%8X^K#31_vs`TjR9xrVSY;K((4PKO1f|iiNN$0oB)%` zDaDIS!AmM8nJM4wb}<`tjfF3>p6vmIrxllY*Ub*>w|D0EnQF$)GAF-#Pr+D+K7=0~2byXl3Az{H+}jyNu9%%Lxf zj=9f=b8#>df!RMHE%fXPCL?DXf$2XXwfi)&3uA$!&oF%uFgjjM>{_$H1fUS!y_(py zLV+1TA+`H7ab$-yFa;=}b{_&-GP3gdJDmcVPp-Lles}8;{#f+z6D2kbJAIe!WvUCj0I!RbpX%sosO?%b3 zYfOqJ+*Bs8C9JN&*sEwP(fe*nr2Z#`dS7D!B&=i>6m3LLb1Lg_65sW|EmVhbeN8Mn zCEzhLvTQe=t7vu{yS_S|kG*Qmj40YoB2EORE$aIZObz}B+oa>A1V)1E$X;E6iRsmG zuyjomt!MD$5Ijco2K1Ar>r>FOnD)}~Sifaht7TZ1WjJ*&qf;cyvK-Z% zWxlfBWOeLHS(eYVvsy6Aa(u^3PG6jZ-@5)B??&Z#4=TqyPdRg)b-4~(F2gPk z_h`B4@^S<8SZ>bE%MGk!xe5cIVbFK;&0AC($tN z^umiIMxFu1sM)w#W8v;bT?I!+Lj#)vb>tyg1ak?P4iO@X0kGtga!`zr=ouiaM!6fa zUo_vMS!7|B{RUQT*t$!<9%Xea`sw=sw776h-nD0A~w)lIVv=9WACzekm=0?hOTmzJeQ8NGb9_ei zPc^gqTlr*VYLKCDI$p{1zm=&sh0FAX>Zrp^60;9swjs=%34U_lm^}+tkbLcH8Q(*T zC-<>QWi}3-@#iX^tS8LvfySvbKAm}*oMz+MX_HwN#-oG+xQa2L@3;*N>BxwVpz|13KJ|Pv*lh;7O(O)N90qPPxNRDr zj_6zt&nX5qDAVXl_&X>2o6LTb&#!?|@OPGZ4HtsnEYpmKfZyDwEZZiR2)89EePpsO zbt*djdu|WsUYgX){8NvePC#x~CZD=Kor6n%*Zrq6Q|Y(vCzDZS5~@r-6{k~`8MDi& zLHMoPYpgJ5D1ffpYw{%$JcmrSgh`gjKe;{ZTyc!&yb+R7TaX{!Z*6lj(g?@9JSl63VKpoydf9F2tvp{q3r;mB@civGp z`^aV+Ss%IJ@4Si3yW058<+1)XOKY>BPOzReYi6@#HY;XcFqg3lgs0XIybi)|9ut;H zvm`Q4ZI;`W>1j_--RB4kQZkGHoyb%7528Pqu4N>tof`am%@1M}^xySrqYP*A{F}>X z9{^{IOy_^cdN#@4C-#c<-`P=5nkU=-B-{QZJG)5^4NbBhOfqhHl6`^vllfykm}D7~ zPi`MCM3Nk0lw=*pPg@45U?qb%`{A~89~xfRuSl}~OR~%*S>}?g_mV7YNtU(zQ|pN& z`yKfw*T;*4Bp*R1`2;%uWS&?*CRt{atS9qNu7`b)B>NCa)|*M*4@$Dnkbm-+v2T!M zA0YqacCxGj<5Kq%%V?6<8Nk_8bYMl6_|)YBgOR`2<)(OT19(BEYne^4tfp92^H0rp zie(m9I{M$S%%*rTn_|70Vi`tGC4Xn0TBcL1H&eVwN^z1|isd84er^8A?PhsNvCOAf z=2N^9O7SAH^2vU0ie)~I|rdTdhESD*k%aoQ&Th^(eO4k3i zO)SePmgN-7a{kGE&9a=Td~%<&ET`B{PO+?}*bh#zOy-~5_q=JDV%f|;xo=rEQ*6`! z{mJd)1%8TUHDzR!ZF-7rx_PEqcGGGJ(5@`aGMs;E{?aU~Y1Xr8)}v{b%{0qqn)PV@ zspmwRWi!pPnP%C{KlNNpvyA4Sx}Va#5tC*aO|y)qSvJ!wn`zd^X_m<}+xRr6IHg%e zE1&Ggrdek5Pi{AFw4^Jadd{X;miaX6`TUd1<++e% zJ)dUZwerbxBF%Fm&9a|n`Azf2OIrJy_8g!NR&zl98}577ziHODXCVfi2RdfjMs8$_Gi<)iIsn9J(cFUkY;_IW|>d3o=&sur&&*@c@Csm z_RTZHvY%nu&#+ICVOh_xtY=s+XIL+1SoSk4`x%z~49k9o^>Kz}KEpDfVVTdcKF+YL zXILL+SjID~cQY*08J6V?%kaNGS(Y=UJ#E<_g{x#E!yAD4r-G%m^bE^)hV^rXT(~JHz@p!@fj@Wj+7Y^FPCWaQ>-fKEp_C8TK(UJO?r?>lv2y4D0m_%XI#!ZCr-^ z<_zygWLTy%EX(;P^TRToVVTabUeB;>n`f5wc>bx!A8Uho@F`DvYcmG&MTj+%d?eF-S=76?OC1&S=Q}Yo)7t_ z)(ctI?OE34S=QNE*3ns(-O4BH<}Ax_mSs50GMs;M-?47avMgs=H)mOv^G|L+>*y@Y zc9vy3|KxsR9iC-b&$6s%S=O`ci)2~mvn=yj_M7uhEmK*R^(@PJmSw&2$ugg1na{G{ zoMki&yr;s&p)+I&a%GGvdm{$=CiEdvn=~r*6UfG16kJVS(g1Q>+}4R`_CL! z@cu=X=R}tEd;ZCM>p5Y|ED45|S)Ly`*7Z4_2RWAe{8RImW8I!(-JWAv&p&k=bFAZY zJO^^D<8v(Y`6rjlvY%r=CdV?LW1XL4na{Dz=UC=*Eb}?`XL2m-l~30BIhOq#>+u}V zf&5d;a*q9%9M6p$>-QYbk;*5}ksQyF9M6#)&yoC-%jG$e<2jP!Ig;abX^!=Oj`e>2 z$^FT5CC76m|I~Un$8#meb0o)eBPaYFHE?R|b8G|hPc1Jwo*y}$A32^EIi43eo)(DsIi43eo)8^yfi)@TX@EbODtID*VoEls1?Bk{Q!>wnSUFDz zylDBdUks<_Sf<>Z+*vPLQt+=#$y)v`9iuu!$r%nQ4fpvM(^#Gd_{MaDNdm)l0z3%j z?4_IyN35J@171uwuwMj~_VPuv?A zLPOzl&{jj??!|dGQ}QpS9CLmiV-pn1pI4fB8DndNKXKzL&oHeQQD^W+L)Q1){9}sOwX8pv2`1LqIFx$Oj+y2uxRFP z%*@@GnY*4BGn*?HnGn->(Hpk3tj+xnPj&%_u zVx-=@m{UYZKZ|YLSV!xH2O(~(qxHhl8aItXxz+Q>%~-I=B_zH z#=qhYj~i1OH#5~7_ad&ve3O4M4Krraoaz2Q>|$1g;Fx)7PHI6hU1yA>bqOC&eLlXm z#gZv%oFCwhWoU>kdyfl0*#?*Q-br}n44xsT33yC>`28HL7Ia~(C zlx!xSIcJ7-Gi^5RE5q}lcH_QQ-h)sXe4~uDmR1ukh|hU=iz9NOY-3e5Mi%jEY^e2O z3N$vfI3^9sF@CH$$_B-hV`gSS3aI!CtDaREdey_8rB^-PIeO(uM%7iizVyyxK^0a`UwY?3rz(y2i)Aia zTIn9subBH2rBp6G@mDn6c(e2|$}%1-{R9ifYo(uHgZED0>{ECvx>!4|^pn_OA)%i+ zMAEWg;1?Kje#Q_-%k8JX#@(NZvYat2^w*^O6Ro21cok2}Zud9ZRc@SQ`sZkv^BbKV zH);!ihfZ^UqsL4zGx3Q}&F^!pyCsp*o)?|gJ^S_?2vMoquYb1+{2Tf&RO{0vJ$#ZBess5Ds*wdx+S$tjT8%eTpCklA^%$r&Qcva>|iBWHh|1DSQU zMMh>As?@@3lfj-@ec5DcHxG_Yrk1e!w8_*Gc13J5wS=7xi;Rp_lr8!M7sY`r8i*_0 zK-SaCE`+*@XMjzn2C{Xt$<#oW6`QQON>6i(j7z-mwdikLuLZJb2`;{>oNaa?#3ipD zZ8CAmlhGy z5o3vQ0H z7zWWmAgqEczg9h{HLq1R&@<7oq9uT}1X-{Hyh)Hn*#Lq>e~Xp?p%G*;=K-AvvfvV! zh9Ju-Nltj@+io{;$;%9zOkDE%K2L@vAaZmVV0l31)wlgMamj0On@n8tp0!OTF4Fd~aS0nARB zS?}9rgG;mMx5?l#&JK)C2A5{}Zw`VxRVX>+EGgaGfd>DC4v42S=a_xXClk5iA!O*VHSuiL=)Fofh>A3O27V{D}!hkGB2e*}gESM+P zLgO8@%db_+VdX%Uc85F;P6@WZ#=R7XEf>?39Fe40lf-bH0mz~y5D_E(BaAg}08qbs`IWLf%Z0*Tz;MaSxnvx^2j4gL-+|G3%4A80?5)z<%ml$rLf^o~%{{$oEMJR}R^LL>8k% zzE4U{De`?%a!Qf!lM-tZWDpWrFi*ZuN|+4f7ZO>tgf>c2a!TPAdXU91;C^_J#gqan z0m!l?#HCmUAq$bnLI!E0B*n)oR>zX>lNM_d9BL6+w1k|Tv@ilV-U3;Q4|y|bDL%L@ zw=6BihrAhsS70@eyqUCArsU0}#qJhP%7`r5P2NmeY)>Fz5@fL#hII###aNOzlNP=Y zvMq@m^$M^YA+l%*c{6FTRKY3*Wa0Z@l|p3E650_-OZlc9k+fKx9qkr5k#Skn+W>f|8(l*mG}k;h^1EUdE0wJ`7& zHW>{xXcsma9c#cZY%+S#U}4x~YPWDLa7IaFF^kDr$OyHLY*&zlYk_k~B1gpsxvoTx z4jNKli5%6MSh;~L91$eO5;@vHkxsU^a-z+#ceQK`aWv0ho052CC>$fjk5 zYk|cgk!2xhiGf0~3qeZ^GKxhebCeZZ?pQ2>EG7vSi$oRzK?Wu(ycsMOK^EQ&7K=oV z>Jy;F6Il!c*#>j4WVM@YgNcE+$<#pMXyZJV$YRjQWMrivlgY>mlR?!1@$q zv4M%)WFiZ8NZV(HBZBoQ$igeY0WQc=*hqh8g)K(9Gst3F1;@BV788&(vVp*{dXQAF zLBz4iXo&&HvBnAd7`0lCnXT!iLMO%5rju zX;qgK`w+<3CbCc*w0twLKUM=t#~KtMn+!QIpg=a6S|Thr-4z0Ibh^?d9w0~Mgl^6N zIod$FFrq9c%qU$(P?i${LAL~y<-~f20Q5nQPCy((W7nBZi0Rxl&krHG6J4~0)<>X6 zwE-c46FurG5|TCO;^+{Y0*W3ry-CvI_+GS=RzskRo}_gTB2qMOdCL(<~-Ui2He_&7}#baLi#mLA=kOp?Y1UC0BeY#cw!a#X#-Uq(hheJ?!Y zq&jdk*gsaksS`(o1!U7zKgjW-9YCCWh<;GVi1LsLJ2L8f!56vBI4BYGOC2!E10`(A zsP9F+>WDEe=czhlG}u5EU+Of`U<287k_UqgWYcL}Ogx88SM8Bp2;(S%^T!5IM=+XHL zJuO+5MB5KKvYn4QNGgW21h5~KR{Z*_wrnZZm|YkYybmsLD8dn00<0M`q^OB zSmh}F%m|y7KLErERgP%C(%WLQ0e}|xTx>P~-vVSgDU>o7du%|zps$6of*bO2J zxlnN}V($bSl=QV=M_C!+A_B?-Ukeuz`<6r&s)^PNChx$K6lIab3Ip4jIOY}0*%a9+ zX?C#7N#v+?Nzn?!0Mc1ilJPRB2R0dFDNPXoNQf-U2A9%6rD)+{(h=;kF_zM7VXG8m zu~bfx^^?X7JE%k!azZxI!n4aJF2yi&Q?$)wVDjv;iA%AT2QCYdqoN6z79vNh1X>Ho!VOR3R=-N5y?m9xav^fG zV*%|#v$X?RVp4wC~83Tplq?02VxJAg`B8(9N_@~&xgJi zEujUY$$_!BBtOMu#MorwQtZN~Y0J=L%h+E-Vh#49O@_pp1R9$RE=}@`O$L`HmBuDx zEDcVhMON`R!oc7Vh`tt+o4g+b>Sz}NE)B+`O$L`H zL}b}O;!>=hags!2FALk#p4L$g>xtRT8NK|#}V5xIF7>C zBK#TnOhgtEOTLfv(Q!&eWWgo*J_f@k%WEVnQitXRD zipP-}S;gas6T`HM#}WIE0GFb&MN3pXj?~EH`xtCYtAVs`HxQXNnYff1nO5@#K-2!3 zxD@-2K&v9MFwx}um{cOW5E@J2t*6QNF<6||*W~+{TqB!IT#Btu;9?P3w1j*ggWqWv zLR<<*8(>;Q7CM%E9|QJj7eZW0)l0sQfdaL^CN70W1}+zoqw)=yE+R)&0gf$+9Gy}C z^CEIoPJr!2#6TPaS!^EzfQ-mdT?ITcA`32Q6WSzJS?rMSV{)u)GI1$%EKZM! zEE-6@kHHA&hzK=m=wW}m9g`u?XQVTp^-BbkCPNWGS1(L zEQW!0+p%RG*;xP-9g&4Vkndw4X|0x!?_-c@Z8C8wc5(n`M`SS!wC`hJZ0$mbOW|lE z5`f5Jx{~jc6ea@*c|;bYL;F4k3D>HUd>;dhYm1#2>7oeSKDN8iLKDcEJlnIk;M?xzK=nLPux&CV)<9z0WN>Ma zv28MODg5s&9abr{OKD)p_eqOgqAZz^1Mw3mj;O5CWA|ZOK+3G zrGcrp$>7qU*4t!oX+Z34GPpFD_BNTg6swG!3LqE83;4$LbyV8}?wH78bjbHH@c34h zD%@NcFJL3n*J5;3xVbQ1Ku)Hw#h|Gubg^zgv@E_B0XBeHCbEzd@_h^(ztwK?eGCe} zO(rgd$pADnkwu@7?_*&1?LufQ#l{qHoIw^FQ-F0QvX~^~`xuCRyKLf8=R#VjV@$J`WP7eZVLZ4U@) zA`5{a-^W}lU=>2XkGW;QCKH!p-H@YwA8d3)yNY}ta}|MI2yrPkkAQJa?a>gG~mP=3WPz3@*(z4>lQGnp+=iGPpDs zJ=kP$Y3_Zn$>7pl|6r5BB^KV%*+B6==5h%8YvNL>b@F}8)e+X$6z^khkg&h4Augp6Am7JaLScVRTuR$O`#$DM3j1r~GP;~V4ghf(T{nPCTt>A$ z$i!vTi3gduj2Z!uiOZ-F0GYUqI`JSAmr)}CGI1Go;z1@ZqqYHL;xf7eMHvksN1b?( ziOc8?6y-AzIpRZ5Is=g-x(a0CGHM$@CN85pP#_bR(H$s|iOZgQGI1HT4ImSjQQH7AaT&D@AQP8S+W<0g8MO@{ z6PMAY3bH|n%c#i!nYfJZZh=f(MvtgLCN85U17zYdy08J6xQtp7kcrEvB>|bZjK&gy zOk73{49LV~bYVleEkur}Fp!DM=)wkM;xc+z4l;2WUD$w3Tt-(gAQP9-a}tn=%jm)e zWa2Vvr9dVwqbnGYiOZMD@IrMVf!CWFgd^w0udgG+O7iv2aXG}oxu zWN>M2Q?be5G8bJ=plony?pm?G2AAgQ6`Kq$%}p#8nS38}A&X5WE~D!Px+;Ol5fcqE zaTyH*0-3ms+8vOI%c$J}nYfJZg@H_5M(qyB#AWn!0%YPcYIl%SL|jJq!ayc2qnlnJ z6PM9VFOZ2#X{E^bF;~l2JxIQfxnag86PMA24az1iqnlnJ6PM9VFOZ4L=%yFtauHdK z4(v8_O}>x0GRGzpm(jHpAQy>CX-3KS!NMfkCpv*sm{B_OGPms5RT7udFw(w{xr4|4 znz)Q^k)eUarLbx67Kj{K?;t&nxD+-G_6THQ)1bhK99d4F5E@Hi)1Xj@9PJa#DI!Pv z1VTvUs1blz5jnChMwP^+uxX$ZIV!OVP0-vFlCTK1WvdP4yuxY@aC9+_Ld>?bm zkX;CIDQp_@@Q5tfA>YSbNn{s7Tt<(S&}`x|y2JvR#!}ccq?i#|^f&oF<~Ad%O7eZo zP2tm1ni{Nw>)28gavnN@IVqwORg2;Ym*BPR&-$YvSpRs0I8homRv|l`d;v>GPmH~M)@Ug2;~cY$sGb+^ryw3D1C z&_z4RdjegwQ)N_}JIAbkqrD@1FWag36>CF zieF)86~G~RP0@BL|4Kl*1L{KYE9@*#u&G{QXBEgH=t54Ee^m;-qH=_NSEz@e3wcximAD22*b<6gv5%{O4^fVgPnBUW zZa6?WieIs3iyTjCr?Bq|DiL&{2b6y$!1z(V;#b&re8sP@*9un=YFOx7 z=s;CnT`(q1e7%3NP)wO{#H;sOMeL*pwD1wbc#C2mFlo%j`Z zAb?KtEG|KSf+u+vU;~7qqUb_ym479!N5J>QuRtdNoyJ$(n*ch^UvY5)=!##lUPkh* z`d-XCI-Nr~LQa%_B@hjO>7w`*b`}Y^RE}7ODws&nqw@kOxa#|8|0w)Od>@_H3P2Lp zCn|5q!liPA-BieuphxEsE(K8EN9VhOoW%E0J&fA|)c4VTQ&^PvKH6_c=vChfewBYE zfDB;p)%Xf~s?aN8O$5JmUI%(qzbRNt&;`HBzY=H$s8`9e*u_O+uPR^gtNbg0TmZ*J z@hj}6LdZmW#5mI46|95cOZivgLJh+5QQr%`lz$~)4e-4hUtv#i1%oO_@TL4Kfoy>7 zC?(Iro+`XevThMS4Qa?!zObjbwL#Ivcq#u%;203LkosQ8r}D4NJ(_vFhlFPJz2r;r zE7rxh=|O!j+OPa8abE}=Nj1L0-XS%b$`STX!F`g|i1v^2ufz=_C|~g_&N3AcD73EV zH|1XmWCWC>_!V2fxKD!GDb~3PIuvx#Z_2+Cx0S$gR{V-}F79tsY ziOX$Jj^bDBCnND)l_TUt`B&m18aVVlwS(w-{+N?d@0?-joyS_rB1svIG=%D)oO5GY5JyDb zEAIY5`D%Q{dQ&6Oiratiy&7M!4#mASRIfOQ#l9@Qtfxkk~&c+t@y$`RwG{3~&h z5Uyra{0ch@Gyy6{*je0xqv%4elz%1e7()4qUtwo)JB}(xv{U(4;`Slj6{+|Yb{6;M zsB(n7DgR0UaG)H;uduTk8CO7X;CscdSf6UdTmh7U?-jp#zt_D1mZl0{9^9&DH(cxr zVNhabf2ItXbH#A`fddA0RaXqR>)(H1)rPIGy{%?l)rR@ohfk@vY+$R3A-F5irqXSV zs)MUGY|)G^DJFvYx6akH)OSvmO}h;2(x-n9Dyj!=pygfUstwz88PK~$zwZ6ZD(^ow z6#ch~Ze?g}1qyHIwi-n!PMvB=6>zmD_UtpTVnA8L6Z>=-SkbJaEAGXu+OTy+za9fG z1e{{5QKPa;1`ep`(zohm6Dw|QRpXWNotkZIwEdpfZ=c@f*;CJ`cxUz1off{>c1Y%` z2}7Q!``QjWeRt8VJ8zRaX4cO0>h5~*ti%<&=Q`bV?*TWRebo3zKmO0fmv3D6{uAfl z{>X(xvNevbvuEwcy3QW{&UX{;ANuAQ^Hz@AK0dzXJvaP#TEDV>qdu6{{g2%ncl)dM zQ{8T!GHJp4ZQIA*=yA*&19zPL<%pHvznlJNW`}#1Kl#Iz{jPf8rUnn~eAG#A+&ARG zOMlmmA5=s{gt-WnqJ=KzU>=ae{_SM_m-Xf*|(qU(71Vxmo8d-(yf;byS+o#3FEsQ z)BpONMlCAew8Mz;&!!r5+}vXILAi75@87uR>;3lr_{hzZ_pUv}7xaZX-w>Dq%_eaB?`1r4*Hytx~^6=@yM?5&D)|@?N{%_FBQ}&!)(PH|G7j-Mo z9Xs%b)AqV<)9)MW_TTN&Uv^x1`{eL>Ncp~@B@P|?`?qZQ;m2CN%Ey zU5l!F*Lr(s|G%pre%JZ0^cr_u{q%Rs4ts9z%P-&N?FWuMd(xujch!FUrSV@*ymrvE zJ*zz1cS*&iOa8j#h^2cU@x)8JTrlgyUCw;q?$y6t_TVmG>^Se1?o%)LtiwacAMk8) z?K=;B^4H!iPusln+*{U8>C^hT#uvS@d0qSQ|EpLw?T)ig$7A)_-v1tMSZ|AI`dHUX4MAReW~tLx(@S^Ea(Fyt!!a^xz3QG=6E^oadgs<-7|&S-ax!vnSMS zx~|2`-_CjK%){uExlY}Wn=ilNhEtk9H1qM= zpFFe8gI{*sD|7jdEf!t4^R9iarMjH z?qArbLzP*#zQ6suC;xKPH9ha{+q%~YpMNy(m}=GT`OhWW?_Hi5utW31y8Ssbxm%4E zAAi#0Kbv=3+4X@*D`vL1{Im-m{k`$3hkGxrR=)4%yHEUea=(uneSPL`8*bgc_5rU} zzp>U6H*6fy?AY7y`R>|HKkm2P^JF?kMC}D&80nG-T2x8 zt2f;+dG=|aY+Lolp$8wj(-WU|8gjGZ{acH8@|RXhKD@P=!5xbn3*HU9T_ z`=JLX4!&+qmnyIKK0Ma;jYPfSm%dQ;#pN$Q^6BB7%f9Qi;=v=o_~3>!hdnTR)g2XY zY-kS64y;tpWaQ638Z`(F|{OF5LTK)cB=kC&G>8F$K zTfFb8NnH-8_QHtCb*5IIbj^+(=Pp>->)ju3dwSWe|6BIyHM1^lxyPJ;e(L$ksxO}( zH1)Ju_ujRAud^Q6^mK>E&-(R>Zo?OSdP-*Kf9t%Hs_AVxc|aw!9O;yH%SoSnQC@A{ zAGQA+R^_|bFF$s#H}3o6pB39w9DdriR}O4)U(2V;zx}-KlE;p}b(_OGC1-WKX1hN> zJEZBX*JmGJ?UlLUcF+slTvN2doOnOm@&gU?)Lq*J+_;+aldD4?9p@f z!@1*5I(bBc;p3}5n5%V4m*z*b+-7;(&L^Ew?VM$OPTVUq;f}*5PQ7LS`LR{IuSt(S z;ec}+mR-AI=IVQ^o_Fukmgk-IZTq|GK7R0XnW}Ge{$TF|5`DjTeagtwSMRWXP|KJ9 zdwBh02CqDM*AJelHGS_^*+~Z_XI}8`K7XZ7tGBRAvpw1^|Egu9R~wJ|cI}{%bq6fo z=kNKGw(I%LudRPu{@)EJKGfi<>${y)yYqDe&wu8khRcUfdHu3e-l+D|nj3oES8c!l z4Vs%9lYFA(k;4~1-e$}%yUu!U;X#+Y^H!U6)%Quv_+rPGet2rz{>LodbKecG4ocs+ z@ax6Pmt23;do!A5_t^WcY?b9}tGxU7Ra3XSW&G!p&uMtt!MFbqZ!+lfJ4XC{Q`g<_-i#6NT^qZgbG!T3 zRP>m2(9);&9emc>9n0&i9M2zH;6JkDpmP{ligjpW1Do*@t{_;pPRs&lxlO_K7zg`*p*X&&=!o zTaBviGbb)6fA^6^Eo+bcx%YAPHt)WCM#t+~O{mhlQI`#ydq3Ov-t$lGaNoqXM=b9( zH1p|-r(56r_W}QGGq-umU%Zk}u3ZU|4;V2=^2fBgWp#PAYc@8zw&5;KmUUXQc=FnV zpa19SS^rEPTkFZ28h=o=#jfpIuN^n>*n?s<@BDD&ou|Cfu-eIES~j`jr#}<3|2HqS z;+vrpYhc-C+c6@gHvooJNd)!AGw>hoO*R|K=UOMOWuj=nxcji|=zdL`2Udt=? zSvPq`>iI(+S@zK$j~(2%#-ueJc8K>nH4|HM%e0Q)cAHzh{JpyxoId*J%?;k$@tp6k zI_HaxPqy#ba(?fdmwtX^;}iR>AHCxGZohA{=IOT&Xn5{UW6l}2?SJq4yx-lmhrW8_ zh41#=xL@^M)}OR)<$c7OEa`3HWwQ+(0b$Lh?e(csBbI}iF|{k7ZNxZA=$JNaE=sbsK4pFFB*Pd zZ}E5D@g^6#gz?5^vpwGD+}ft!HRZcpyYZ46J05n^Yc<+T-ud-*&2C&UrSTDOZu7t6 z+O}HQVNru;ue|n#c8~1b>66#4O7uUV{`%e<`ZW7(*AqW(yWp*(cfW9-HIu7!TKCvB zT}LficiGH$AKUS(;p2aOs^ip?n{Jr1>&WA~-Mj3gdZV_#bkD@ovv>UMfNI;XAG+$} zCEaUIzw7yb?i=2@S&ep6?yJ#Z^Rz$j-e;$dWA^XW^r)53?$@v4=Z#yspE*cOZPo%w*{@nZ<_dEZsRTM7o^6&dc@Eg!#lTrr_LXbUc7$oZ8Hx1YuedM z8}`_D$m`zDv{qxM54orUYmff@1~#j>r0am57Y*z`psMC--+`X3 z%R1qN{wN7M{Dd+Fr1o6dk+>-&hJV-;tI7T+wP@C+%SB}kTXd`FH?ZfxAypfm-v5k# zJ!$O*4)uYbE-2rt^aozMp4Af_h($1tRB8QL4iH4S_%Vy1|93qREtNS6U9W<{%E5Cc zVg0mu!JlGB;qXRnL)m}$f9^Xj7f&69b5#{d_kX&XICv>P3fIoWGmx_8{UA#{`}N50 zHW*6PhRu3*?_M#WqF+~RPjo6TYuLm7eJMzV<}1Q!WB$j#)ripB z;vfD0--Pv1)71Yc;S~i z^q^lE`lYs{@e6{4Uuwe~zt98trMAiOtNDraOYMm^!hhr$kVgfYwF&zFncc_|cVIIa z+n?-v)8o~Ll~>#D@>74@`TXa*zS`oqCf6VQ?I%;-KEBD2hvvREwb9v!?$q_w?z?Vt z>dUk4-s`%d-<)~G^{wU&u4q(#UWd_LulnM^r*3awHtIBo6XIyW7> ze#-14r!N2e_nT@~-L-4&R?Ae)U%mF{%~eL9@cyDZ79PKDSjC7t zSD#D?ZqC>bJF8FL`!i^{0EyeDwWWCw~3YIfD=Fd(MWTS2sHF+)IvF zHs|Qtt>?^~+;!32>(?FJ>xs*oFSzuP^M2TTeXRA|Uyqr1_N<9x%l4l#>FM}?d(Aw# z|E9Vu&ND;g{ltITWY>^a>Fx6-ur0%SH5p|?+>+}_~7~O)rMYp-rU-gZfJhr z6=NT3FmU-nt={?X(*9@N^wOJi_pGzs$5S5Pf9GFj|1l-mCDw5Mesli%BzN)wr!;(h z%rU8Nw!de)#z)EXrIc@T*x#71bufFe% zk-v3+?w_lMe{|&3MH}8Z@byP$?{f78@7103*x6&QKlX_SCof9vaewV!$Mn7Mwd0PQ zd%?)huI+yCVUO)`&8Y0iqi$SwY1LDw)V=)SdS|}MFHHBpxM9nBE8lze@uk?1a&&lYXCd<#*SOyngD8-Y3kTF!BAq<>TAWt-k-U4-C!x zv)ibPN1y)a1r0|Zm9G2M3kTiu`ZLXMyXfiVq!-;nc)R>`_$@lV%}L( z;&A{DJe^rHrpYaxV>nFtr&i~e>Xf&AX~^GommK`uKj{IN_INkZZt&NOM-4cw`{VP^ zf9~Nsr!{zQaO~zi#@3wMx_a*1dPlt2@YHL+fBKR?R&;vm!r=oy+FX6?+pAjsxL>v7 z&N=h0CLQWc&$4+?6lWwC)D4w;pjmlTJ8Dl6*tVd`l8F?PfhMs<>Z%}Uh!9> zgKus(d&9Ne_j;=0qoW_0-Fe?9mK?u&!V9Nda=}e4&s*_M-Q70y?9k@(qh4Cqy5+)o z*Y4c$!z*^&y@@dS3MILyPtt)bohz zzu&E4hl^i%@$X@;Ok7g^`N55U95l7w8ExwS(&L%k9vXG=8~yekc>kL%`c~_B^Pvw^ zzrF0~-_BU{K%aMB$xU3a-SaaJX}WmXv>i6y^GVkg*_E~ayfQnX!>F(K?DNQh z8}I*h^Bc>qzw+{vrVc!5!~B&uJoV794(}X!!>H2^YQMbR8QtER(dwjIFHfYVwyoEC zn{5U?Tyxb4+pjsdYM)Q;KBmpk#{Znx z^!CMP{y28TSwmm=bkNA1s(<$Ts2&$2Ry;KA@li9rJap%K?i`<<-|waexBqajFYg)L z;Pd*4x;KE$ z6Ziam*8wZHOAkNqsUC-ZbjPdbnDG` zKK4SR8nK^dT=~#d`~9W=<8qs5F>N7Jd`ykR@N z^~#Vxf4ohf3eNqwW|P5ZHu=2m^eK1U^!PFLh7Y^p{Mh*aKAC+u@#m{M?tcF>U;k&j z7i$hWVf+OjuUWBT$i?Yi?bnX_>#E;&f9v?}KaW~C;e($aJO9wV-k3D@yjwpSU%U1G zkIbunX4M<3oHc()hePLFnrN{5xRtj}`t$dZ3vYgT{vMy6S@)6dvud?iHg)39KXk9P z^n&x7-*S7m>)u|lThDE~jQe4i>mFWkOUr*=e(R7#dGEc3zCB>!p&uVwcH7Q%womRk zb;2GEE*bdIeQ(|0D)vg#E~$ggc&<+QBL{VA^Z2(no;mmIsTWQkb3unGS6z2Z&F%xL zozkzvk{iysCh_{O1L9A7vGC2zx_2+U`{Nsayte+wo7V4mK=-=S54fnJ)^+0#dwANC zvj(-<_sH0)=@Val|MleD3A;U*+h=O;*Y6o|OqKhetUlrAuLr~)KjfR*_jSItSGxv> z^iqa=qr|Us4t{7#vx~2}`-|I;7;^rE zi$O{v!B=g%EjsS4pFiqc^UwD#sWouyPrv`P?!_NofAYm!&Y!c-jF(&8@nX%5 zCstWm_0N~yx^dFd_`-G3@zk9%G@1E4Q>j!qTzcRRM&1WVr&s_Zah+C6yyfFW^%ZR+TejfanHM*E zasSWyymm*Y*LS~ZUa5g--f-<{Cf5i>-HGb^x`S+O`ku$%froAwLSa$yBFWM?)gC-R`2!7rx&HZ zYgqH)Lsu=Ye!;S}pYQln!;Z&(+GF#)1KvJtcB0<5ht5bmc-ISk_C2M^;zLG1R%`DT zr@ql~zteU<|MWV4ESlZ%@s785=~!?30o|{DDtGqtSJho}TkG!!9W&?5uIcN`=e6Fn z*Qfm-n)vF>FaG(W=9{Lu-$Fe$1>1?VtI3dfP@VZkxaKuhiR%E4u$a z`M$*+4*F=@H^1rGyvzAt4!PiX5PtUx%>-c4jf4=PI>o0ike~msEGXA^HJH0jOv$xNG;Ldi>KK|18PcF=^@4aB% z#s^Msx!3aDYOR}h-~Q98eY9ll1(%(E<=eeq8Z$ik*Qe)xI&IATyDs{!ev|J8U*3BB z_<0x1?fgpfj-4LpIk72P8@0vIC)#vVc|Mx`)-rT;*b042O z`lr7~f4|Q^`!!zFzv1<_U*R1jYlpYs;uBy-_9*o|v&EPN>1uQTsQvq}wyW;gIPi$^ zuYCE>idq#LTc0|n)1E7DZ?VgN7A_cGs#b$q~46 z`znoYdu>$JdNW71YuRe%>|xWMdF;rMlb8SU>zo^Fulx4#r)zf}(fX`w@1JnOiWws> zKkMgS?Pk|szjFEw-FiLt>ztL_EofBpk~&8`+j~&?Yg2mleSFyUPhUM^$%t<^Z=Q42 z{NGb#p&<(!+UIOQ!BQNAIH#*8bvsA-Jd$7e!Cf(W&z`|G?5{KO3Ra zePj{FVq|P-9Hw&#JiTrw4aMiAC|c~n)^FW43)p~O?mSD=mXOi6>V2CjcL943znW4oE*1WSna?xx`+6AfTOLx)x z5j=19x!8}diuxx@bTJ8&n3By%@?x1k_P~*)fU&Qr6!noVLEpbC-Ich)ZiU6{2k(iO z6Q`vgM&3xzmU|#Q<$6`VycQPe!aWn9m_S^Cydv>2^3>Vr!&nV$kWHqp8%ey*Lml;t1qYD z%UaDtfGyq&=N~qp?^7KyzKejX51O*7{2KfSoHy%34RpBmsV+?TQly3G%MMbn0BO=$ zeti_Wd?(4kc?T-zy<6a%E=Sn3JZ=CrL=1B6y{5%cW^^)*NUiA?-NCjydF150uFE3# zWSWr`R-(<*j{Ns+S!u^96Vh8_y$;w0qAv&IiqSS~2r)fvJCK@E+Vuu6eGNBdx3xjp&OFcYM(h;EcC``LO#}PG?k#gNH_Zey zrr%5@<9K4TGtwms!*VycIg@%baN9O5pi+0&!*BgNjSUk;s1W z@>HJ$c9^C^22;JlugVbO7Ka9zN6{N$YNH-jvZcGFyFHH5jq4!w*G#8 zv5yqBT;PEgxNwKm|yW%Mi?tb?Wde^)mU9{7>H-k%N&bn11o2yIJ zRI7_%DT#_-R8H~bP)sgZc9)kPh-rc{mnO?dL=i9HODib%ZoQ&|j;j+C6uM3lX^!VK z7p@&N8msJHseopSlymXJ>9SOrV{aE3**yDh_A{liSlQO`ZDKp8(3nbI*YWOF*Y8SW?4-MzR;GbdzJ_}j=MCEgP$(bdV&=NMzEoWS4D>!7 z%sn<=D0)^3M3bD0F?)Qrk`mM{(<8FGk&q$6z)lje5?k@aXvr6%85uy@_x}cq|ZQ6CiT||?8Qb$NX7V?wZuhUc- z*of657W6pRUJ)-fO{Sf>-T~j^r&j&6UA{vh|7_w1c!hr7E&xc^wC#UEy02zLv8a90 zrx~3_aCSC+3uSNssiM#~SeZi=$MvNmXw=!DJ;5%Vt*at>b#qj)L$a)0bY9udTnb*w zfDWY+I-B>VbhR{h@fjeCS{#p@nLpYiq|1;|kRa zR#G3>CLDngrnz8hvEd96H>jMyum==zvMp!lo~Th#IKGQbd@4_6Y}G}uu?F9BSv}Jj z9YX)CNizXyir4)D`#CiMkuH{)E#k~gI4KH}F7)|>8D?jp(Zs{X7xtJY&fh+RYI~dZkM;UpXa5i2r2x$8 zd%P5&Oz^MZrQaMG{u#XV8}04(xJ zyX3#V{{HCEVV?>RDeQ@c{r!o5?-<~ZOiKk&sCwcxf4dbx03HAYehWhJ-`)IC)`^N0 z5E}Ozko;%a0b2W10F5zbhJOcN{2qjQ^kDkuAery4{_l?IX?g$T?vLI+|NOJ*=>-3U ztNyz;{j1K?1C)#Yu}t)ge^w9w%(Lm4_jB%eU6#|JSB zJSP9fum2v?dKwSEU|#&6#IS#InEr(_17v)^|3wARK}*PmAK@cAPa+1`O=~#)m3a@0 zyglYi{LgeFlROcTZ-_HzqT@5SQ7p62hzzd9sp5VMQwTr3IX?VC8js$CL&G9Hkw6e! zo}8F|nxsEuTr9`byWtY9 zn(yq5CHv@bIpJ#-L_|!{ZJ<);4rAVUV`-n&U_eQ0Ibix!-Y!oxI&QWTtAvsv;g(%bY#C%?JoS2KcE~Lh!&jA(hP%p2*i~LV{ z&t-Fceb)3B>Bx{|3gfy6_qc26i6k7v3_Zt2aE#qET86U#>`iQz$b9U0djb`d`h~;; zMNiT9krkOsQ5Qbu;|8PXY=z@vAWF}j!PJBN4=nk+4Iv$k(@wdU*Tksu2BcQOG>Ls~ zu9z@ZNBCw=23=|<)V9J3)MBd?J& z!JmUA0YyE|Tor&Qy{_6AIG>%AQHx1!Se}Spd3lzuX5SE{5-qExt7s_ESP+Pwy%Wl# zDqR&sMnS8YBr1mcf#a~n`j)wz-+EfW!_Bx2+*!2xjwFa;M{=;3V~L;EUO(m8&OtOI z2paRL0m#5xsC86hJdzW=FxctkIuH)-W$^mRMIxvQ%E>y~lAI4TGiSUtK}{XkwMAfz zC6YCBuj<;mExH=BYB_Hy+VIj^%@h`~&-UkHqHsd3tXeGN7+a`WreKX6xv5`wI4^!O zTW)vKR0NUJSj&B`>aZ}QdW`%Ittdrk=l+GgFj}u;0C!2-{j-MUj~{r8Mywotz`t&( zPhuSYmI^VXFtb*`bKKWc0<>U70(#P6fucFJ#@y|&*w+eHG)!N$X{BtTZDbI)W>0Nt za?|LdH4xar>Ox!;-^9Fq$K|3*5CdnXSmzEG`*}_ttYxBHkwuoRU`o+W0h)D{kmsao z^Jlmk!TCukklOmq@D`b$2wv2eDbJ50e~kyNmz zmA%dZW3%UZjPA>1)4=pCEO?53e9n;KEb4jYIWH-8baR8_5M$TwMDFk5R5;VIFkKd}r)-7YJQ;S7z9P(;uvKc4##S*CN2ZIm z%O^F*R96d;=IfQ?d6`mFU0t0{*APdimq_QB&F%pg_g0-Xj5+sIo7;*)WSKQY1C~au z1WQL`o7Ct!5}$QAERlbn(_q<&P<{@sKgA4{F*?N{fvmF6e1Fuft5>$!V8Bd?rNESR zlN?szd0lWyK8e*G6i3+bZ*e3ZZM5*8QcAVuU5~{e2$s_4;aS3<`Ine0(04i;HriX- z7zS3*4b4U`B?K!yso!qO2$Y6PmEF2LY}SHm=gL2L&t-iLjTP=};nrhNd0}7CArN2( zfi`F#Qd}GgS~xyo)95`Tc9cJd^6K>$g@onUt*Xz+=2>klHWf<}vbFj&pzLE+A$&5H zMdV(o8%Dy%V?M%sY0oaxH+6J|=hCTf(Tyivhn)G9-9=F=NlOrJ5!N{bo+Blgy$-Wz zOV*Pgjfa$crbTh6P$dps6X9!$+;c1uOT07b;E%=^aD!nNW5zsK=+Sc9%)L}*ohdh` zh=NxFrRK|HD2tjg)4(snka2I`uf49v^clCF=$`I&Eisg6yg?!xk%~<<%$-_JxY3C1 zCFaEojGRLWk4CSD8-~HPrM0v*SWQVDoS%-0U&M0(;UK;r7487924G?6&llvUo$ zBJVvn7=rtJ1X^f0(d0AAUYgY*qS)Z!DA~3O&TlIU=X`{;Cn2)dfFH!1$I`oc@t3e0*_U;u(5!U>X2i;$QVKvx8!ODv z%ZdESKpoHcet^>U~we=M5{k$$?vUhx@A2>Gp&(i z$=FsYAJM@>;igwX+q0&xc!avYD&i_-h0slgT}O%5nabZ88Vh3|prnMO48xZS?3N|t z*`qKx1(sM6uk2SXts*s&LN8K0J|>UZdib@u-f7|4yqnJfy06J|6)T0s3{@zq1pbmU zvTGo6hNXPSA!?2dV7 zzzN%@)T~l7;h-|66jM1d;>@GWC@XBYiAu+V{g(UqsOH1lRW#3oH%s{8g?(+lumTh3 zp-6TMxB4M^1{bxRP&$)>7jN|H^89HDtEC~PiSu&cI=UR|AvtfkOKkkti?DsP&~19V zQ8ipcL3G$11a7^!s9+yJYACwL$@o~%w?_oo0ynD`xsZlp@=j&6$2e~=4s8qu&g=#_ zi}Hr$5zwZCu48%0anzLBuATXN5f&t6jGlGLGv!?h@ZA_3be#deb-mw3)RZe-kE|Xn z=(`|ckU#%4otw(0;Hq`gRR#QJi`LgC11~znVLHy+|23V$sP(vF)*LW(jw-ETsLZ;) z=@)|6tXAT0Ioz8#Bg4L#%IX@d)_*$ke$hV>;A;NE$cqw>oTq{2zhLvF8YVdgi`=v( zi|JUupNo#(#wMok8GLI9|4O6+{Qx@2tYFBWh1G<~;B6ExsdRqur;VYN(Jh*pDyy0r z;g7ExjZZA3(}o^e%WKnv+cYp$GLLbnR%j@%+Sylf(Z^!Sj0>;eCO%MK2#H`y!tkC= zHu-(L*w*e=t)X&ES;)8&=+mN`Kh0a){RoJ7bO zzrj_IYVQUiC%o6@Qr@Yx{4j&=kV)4!ne{h!Hz}HJ3M)Y#)tORME?&h7$XCABI3A@()L-Am%}IAkRzMw@-Mg}$gq2a7o^>Q* z4@4YhJh*+Ej$SI$*m<$r#CU~%h_lmm$@TUb1?fkqpSIaAqQ?Lkq3_$wB2wHEm=@4x zT)tE^UioP`C)p(BA_q;B92Q3Auf(~P83bqXYFiodQC$N7lA^6w9@x=s3G0=Xo{>q zRNA9ueLiD?2@cL1j&YO$yR!joZn6(ON8Hm9V{8YoO);AWn1v)LI=uyPxt4N zEz{VJjw*+q6Hyo33;>dWCtO}WFwqkF!y>c~#mI{oA`Ho7SVxry4Y#4xqxcOs`>f>L z5#~TXJy)Pq1E8yYqIX62HROsybNRxE@6yCPIr;`a{r0v;=@##uRuD2OQ0@GY%5NT= z#g~zl%rRg3BHPCr6Zu|Y$f@^y)tyv!A=*jNQWn1hQjT`?{>NJU&YJrlFg()zXm|v0 zT>llr<2R+Rf8Ox;XI8fV{5gQ2EfWKuog7pOatt0Gvh` zr~qmuPYRE}a={?KgkOH1jqeKnSYd1kPQ9&sLlfX zsLp~XlKFO#m`0Z6rlzG07_&wgTZEqv$h56D^|t)Iwl^$BQ^=?qovGq&&T;g%{+A$V zO*+p-1e8$`6Wp*de(2PPS!XKUq%8@iL+1i0Z1$(-65|+&1LbHJAZoY7PV<24od4{Od)tz=u_RS=N z5E0>T56z?$gjR2yzFIfquUXCLyxCh3JJoF)5kItN2DY50dj62^ILz|cj%z0qfScLOGOsJ#m2^P zOjA^lbf{UIOpXu>TA~0g;mn13Kg|4k_iG#DiobXab_sr0LUPmS5>)%Um z3P|1$O(RBOOcydl<(c0wI;*dE^&SN+meyg6S28`%cz*(>sCA9KKq+r^!jCRoN5STm z8C~{+t+`#X0!Wtq7SM_OI8g6P%LNe=S@eulfbfA&!eYO7wm%TddQwgNl?r6~fduOw zCLYL73;q1jrUQrj>FmUvFW%SoVSkw!+WM9L3`l_`nv0kdkuutH(kFI|%;`(Z=W%(} z@I|)-d42sQDJWkUTE^#$F0=&U$uo38CEEwRHSP~joEcz7YPU;D z)n~gS2$B$f|L`f(PrFj1_4FZx_om}8zZa%zMy#@}{8MYoCaQeBwkhd!-Yy@@GL+p?@It|}lqqDUFVYG?$*hu4$RGn* z&4}Lgt~xX7Ou0hNiXT#R=!_W`EYVP3*0=Qf#adzMqmKl42!I@#e#S;(sI>~omUo>78{Ai>PbjHDow~O^ z*})rvy-4j^;#ZSdRNY0A+R}WxL~FGjqT9=_wd1ymSxQgJ<@C{F2~3tJYfK3lU*0r% zLnKo^b5-M0| zZc)A7F?p1mV}rwQ()E12pab4u05?B zt_H^>lee|_j;<6xazLp@X!Ox=2Oi9Jo@!E+j7Bb_zX)mM#MB0pbfnbMDjeBBRR_k3 zLbb9+8d|mKD_s{CjUqy6=Eig?G2E< zRChgeF5Iv^H2T}Tavz?NACzdEZCs^$ofHf5v~i$Ru#~&RGxgHTQRJ?4P`X&0HT%DX z^z1#Viox8^sgAFO6Pq^^e?I@&*&f`ov&Oi^Yj$#XhcuHB2ojN@)+~lpq^(l`iv`I5 zfyC_Py>=;ik9FUTU>nc`+ZZHrf4PA(#`XAorq}w)vi+5OWa2{*Slz6v3Tizp{V33m zv>M87e}e*4wtF=5$IY_hoUPR&M%7u)LKA$-s#wGHFt@p$j2-{quoQf|Vp4rjPI6)o zRdrs_h2BHtu2Zh=Uc*q%_ul^|j>zyD9n>B>Qw^Q)K%6~-2p*Mr3yhag91Kcva_P{p2|6NhvXuvtHzhF8xK%5 z1Z=0Q6D`T}g}a}})ZK*JtaHbl-jHZd@?q75MWj*c^?E%w3E4%XKlBVZ@(FsmvzVK2 zOC1vHZDr}<73?n+Nuy*=C48RQB-f4QRG-y(2el~2`BdDm&bpt@<`f`$bz zHJ;HQib7-8_}5L+jdrajG2TSkiUk+UsrJG|>8s#fYraI8z&~BR4DHGsIvM#A?jF?( z^u@%)jy06pYxcrDR`4|Rni}O5M#Ee8vUE}BT%9+TNwM!;6^LKy3V3rv=u<4$?+@w_ z?}C0hK7Y|<&CK-u@HF_|_j;xt zYt>y^0RG%crcNZ5 z_{Qk805sq-o`D{|QjQTZYw1PhxIVp*(3W*A|_)HfN$FMcqsorC5$D@_0+#c5Rh(n=rqa>TQ)pTH zdHDjDg8qefMTi&Nj5rph9fTQc>O-3~31`mR_=U%CyF*Qd6tBIfZd8q##)70fuBy z!3l>kW$0tmxaTfj++p3KhfUED``b>akoV%OKP~ikl-57nl>y=iecxRy!gyb_J~fRm zw{%}pRmvqdxHb4gQ)U5pL94a!Y2Z!lpQensGZd-*|r@JRHTwa9as&p=FK0~aSA-P^O<$>pjB z1y~kF(Bs1@vC+lC9*(7*5+SrLrI#m{)H73@vkeWu;hAxM`e_M&ao|E|V&Y$`x&F6C|}TwpY}7GH3z3sWA4c)&bd!Fw&r->0p& zveN|Zy%>&`aAg)rW6N&0V!Xke5IK~_KCRR)kEo3B=VryeF~*h|)wQ){B;lA+#Z-uW zG&UA-Tx706X+ejZR~>NGp+m{f6s**cUxr$$#n3~=WL8x^$BWCX;KMcb7&-UrQ7u8o zfNi`y>tyAGznFFvAAMgg-6$!N;Yrq^wqAoN1`^y*Vl|pi1g^2$MQjT3)!}w+nj{^@W&~G|Dcl;vzVFu>v^k z@kDN($br3ht8v*>2LXtorJ5s&c~k$mm(AK02L_&VTM>w0Sxs zhu6{CjL{45&}J)|5;^Y?j_rxBZsj#4_`>5m4=TAitHF9rjeDWD?o~{Tqqgi((d4r& z4AAFw14(Gj>ok?#@L#8=4xui_f!!s;g=CwItMDpd@0OGs8OMgs>op}k-&Pq*GT{vp zm|Wlk$G{7QNZ_qIz^>BwrLy4dBl>`!MywT=>y2mo!WhIlfI8$it6VE0c$TOc=ACDY zkk>-CS%+4Yz_9~$42Z&9^pUF)TC*YLU@$I=E*eBYDQ%V;rpkHLw!jt6rAfXZWCtIM zux?l*_+C`)+J6GAoHu`CTbAARl}^COY8;tNFOjBI@zUzZUT|*gswHGbX*T)`#n30y zjCz|&2Gtn_2B$&gQZpoJ{wu1QPccf)?u|@zi$X=RZs132{keRccjReZs^$gL$TIA$ z&Q+trDiW656E%?C*z=d7o);a-XVz^G58d1z5)llba~|M(BK|5EQdEdwYiH-Z3)tRO zBq;Pfh}6vDWbZ@eYuJMI%=jjxS@E|QXQVldwe=yrL!^5Iq{y zN2&4mlIR8;ZyQzc;5eAxYGmEMNHMNc5s@CZ2qKjkQOUB1b&1Dv%3HF*l}l#1!g1?% z@@Pr%fjm*B@ZthSld;|i?m@o!gg$^tev&=#QFp{VgEnw0yF{urn>{;GR}_Q5zE*-N z+U1bum?ui8h+Qllu!XhP-~Z%0$1>sXmGwc|n-g9o&HfFTyTklV@1AJwjGE?G0W+0% zNu9o2J^g461*>{|s2=SPb*cz<=l*;S6zAO=!}?NhUgs~RJEUK)52NnE-rjpHz_Fpt z@4T9+B=JCzrpI-_o|lDiuT3=V&_C3J?H(+)5yA-x?By4h;c`7hIZum8$Qa%#zAFKf zG7LYah!!2FfN9&dzM?*|clI#6g-V@Ih7UDoAF0@mm6S?p^ns}^KCbIWa?8f09}O%q zSRYMCH7C4V4G>|TTNu5VnH|BInmq*(*i^Aq0YZfhXBKtAyL)G?kuRxyA zHgm;QVVY`c=&^m&J?=6^F6NXAgn>ahZ88k@(Tc=G!;?+J_s%;#qGaSsmp3Eru>6f(U zcvej>#Zk}su0S`TH-jmtsdE^g&3wR-7ks9sSM|Z#$w_cp+K58mY+T6Kh;gZ)6sxSh zUViLl9<>GgJGl3IL2UG(+$*cu{(iB|T=hg&=Keuynv|Xju$yo5h%v&wqx14XVw)xo z8V(?4DAZyS&1rO07ryS4uDROy?0y=I#9%Z=*C_6us>X*)7Dp1q^(?x-h&?7SQME7S z1aFKWVbQXMz!R?@Ab2ks;Y7~62O9v3(7qCXNy3{v7+?#rTL0QDz)j38=2c0)5$YzY z=;yiq&eRu~9krcG4rfQH=JAf4n<1hhIa7|cErJRhO-@$cSwE}cr)Um;Ge7*7ZS=on z0Kb_szlkgI{i(PjEz6^p;{Q%@#qT=9f4%DeK5<2cAH)>_6#sw4j{7aj)K4(`Z(%eb zssB-2@h8Tz-;HM9{|DgDtW=Bu@b}+CkH5d=kH?RW3sit$mA?v$|9JHur)U`f1OO&_ zroZ!P`uPQn^fUl3rf=ZY&vX2B-#*5$r2<3&{sU$LAd)0A72~%!Y>y8GC_(}h5Sf^s z0`>iMZ}GD`0i;10sh9x)S|4{*fAo1$WMp6f^wNLFRR8Y+pMY?}|L7F-E12v5sXX+5 zHGKV77vz^D8Gq%WfJmkPcQwr)6^i$t;b8DF{avZ~{wfExKYG3Y#P@>#Oci|pLPD&6 zz%BR||MAgF?GfAhoml`F&a@2QLRmeYdZZbA3t$CEJ!v_93tI(90eTnU+!Lz+kODLj zAoaT+9H0#Vso&k;01W_0J)viSoPd%5Qh$Rxjf9@=^0+&d{gIpS6wde;a1z@8S;*Q` z^sHYf_Kyo-`@T;w%>ZjsOR|DGFp-lBNjVPxn^zZU=)KV_>J+)YX3VPIo|v`MF6k~_ zwWRvS+0NTE^|J1HYLoADu&QFrM8lfdMh>U%BS>+W+t7ad>B8}st)f3joZJ5`I82k= z77*DR?7^|$gTrWfTmY9>h%tO1lTB6(2iK~Mcd^Lb>CkC(y6d1e*B~1leyu9#`FO@B355Oi zItS4Vf!SE+i~)O!Vr`_=wRCg~hBJABx>>zX5>%^ZN<;uq#F=HV3;4zbgjIxld6-Y^ zLdmrFy!aLw--6l26#s1 z=1TA`wZsRvL}K&D;(HCC$VotbNY?0;-YI~O&+5)yEElp*2!V}#r`1SKl%d{_8y={I zSvJi6mAX~AfBD)Z8K&^1y#hnIg>=qsPYW`k9f{t=Z$Z<_W|`&!T{{5GrKqAMA(u_k zQ|Rl8 z5h7YS4%^nZBJbZp!9?&rC&F$`#F%O?Bjzvctd_IPsUY{p6V{O^+S2JPZ()jHjv_sk zTno-C!(Kx|vVUEH$CGNajBen%rE4OrPRhNU)VFt8t9{@TB{3_ZVjK$mdC|5a!7D=e zDvOjz`r3f|D_r6_@kbnG@Ju(P(mRJSg**tCaYvj^6kH^-`!G{o}Hq=sw28FwE>Tm>{>9312h!4c_3SlKg zr|`;)TuGRt*wjk{XakbU1_XTAtoYjGvvXmY(t6Dp#+3{|5ZY0ub%~#V-JktND>y&n z!HrY#&=601vw3#0%Wci0bNSN&^ou5Z00HCsy{&zuxYTo60PqViqlQOfJq(S3e|&k+ zBnaVcETlVOO_*Y%sX~B4K^PeCla%|05yCZUI0+hFsKA7c*8Rof_}Q^8G!(&&ZF=9+ ztxZ2_+%0C6Nb1>ggPJwCmcFot!yr?xqYnexew-Swcfa5{M@BSXYr1}VZmr$>7L%J6+Ya1 z#~NqDgPG|f?3k_zs?hlyn+Q;~0RuR^d68`o?4WT>sB-@69Dd^L_Y{3g`xDq zh_%rX3V_w=LaPr(Y^%S7vPBLSTbkld=UgtOrYVwHa3T=l&%tD%{1~F_hpb0%2opWr zA7k{;jzTZA$DvTf=UtB8 z0Wk5y!)~|xovkzNj&&ut@Q0;1@l0VM4<2%C4}Fnp-OnGq(9+<=eP~&nTdfGT&|}Nm z(Fw_+89)r?YO>Kka6#;xy6{MbO9{xMS2+?@!FaPnpNU`n(H++ zmZi5^O!U)4jWElGv(GW5Ma>|w&(xN#SY~j&0hKxeGVHsHXeN6Rj0$kfTxd8=@*?YNL?h9iNA(8qqEcQam*8b{M8lZuP$AyRvmRecEdQ3M*qh!FiVrj$ z0Stm(MSR2%2~`OB@@RqRu3SFCUWhlN0RcDou?)ieA$oO5XNqS~uKABPwJ*wFK`gl) zO`^55+RiyuAp^IOlT#uj?;8DXuQDA{BPX=0-5Q%yI26Quk=SZdqp<}uU;1{xPXC|{ zXL`uJ`}~0#Bw_Kk{vPBNw9wU0hs7@nZ8BTEf*k;gCB$mN|}9^k2K+G`hG*< z`Ji_KhVO(@T-T$`Bfp80_p z$9DWcERv-?6EZ%wOE8r@blXheru~O35hotj!a-*>L&N$6L8xin+odr&m($f5^HHh=pN=5lGIo5(=%@{3}`KYQ9zW53~l$| z1tPNfT5^$J`&tT;Sz&mT>*j|hup`aLV|JdjAXZO&RaC)`u>FwLYu)|ATR4*I$g!DZ zwdB|(_cV>0!~1#{T&L)6YSok=iSeF`16@Op`~vthiC=d$E~zG3dAWrah85jcmm|*CLuHbXB5I%)Kw8qyU zlG*}S5N{89o!wdv=}%o+QGy#vFBlNNuF#;QXCjfrv1^DI(%Dkc zJyqQSC8tcSQvF+|52M}yDQXKj!_9-XHBsr=sCoy)5R&EMe=w5>2D@V^=6v|Vu<40WZaT3qy;a-bpzoLC%7@lm z!96uCFyRapOAJ`Ia&cwf^F|{^3;vN9J~p>~hurR@kMTaAL}uJ zLAz*wc_XJOpCeq!kemBTldh3iE8q6l>);~~<^zTYmPVYW-&C&Rf68`X`c+7khUo`A z69A+dy2tk7DO@H{vj0i#$d=&QT@6lj%Avts3RbvD1g(ffqPA?DAh|wZM>MewkVo*R zMs2I7VQ{~DfHbT$m;(zmC4uM=%X5K^#U??~QUf<>RoHD5gC-lTu0|FUQBgABV=I^} z0TKu8F?GmJoSZH41t6vNTKk}b`PHA$`PKny__Gz-LCEjb8)*%|434kvF=db25-*_r?}7JV_GnVfstcgTBP0U}JyQUNy5j^^L&gK~?to z<@NbKfe7SSGvSxzl{RR!mz3e2@r_gNCMZSwNO^qH+0-!4)DntQ2##dG6*H>}Fh$E%*q61w;hh&SL8 z&6~wRxaG0CqZy;CefE-35TE0vVj!mg@a z@-TTztJ~cfblOe%{v9rmA{)Co5Li<28(~hDBI$1HR`-yxR_9Y`bZN0KF${PKA2bN8 zJoSZ#^R$hEZB}2>ur52)$KE@pT7ai~X^#1Wa0<26%o=rTuL_tn(L?o`L*lz~?-^EuVD#Xu^2 zi#~cw4-mwYEy0AHZ51DZ)lu_Z9d{TS?FmDZm3^G8qs|2#Flw_URTmZ?2q$J22b#r?Yf|n6zr0EDi)uQI zeveO!ZQGcS(o*_P<<`k29#Ti1;I-Gsf!j3j6LiTJ-s;e{uM;ZC^kt6`APB|+Xms>B zvqk8xeb%e1qZB{N?_{xv3!e6ivuj(GyR2CI)%#WtPz+Ujl*A9=prV0LjN1#Y3%{Fv zz9Y^4VVGP|(#6&hiQCy-KS!!;wJ0VE)*lAh74a)I5v3ETwbl|z+v}qTx2%vk{74X2075j)c0!_S@N0i{o0A634vI) zf%7`1J0bz5%{dz>!84bQ2j9gw-&P5~Y3liDZA~_!{@2`zFfJ@`c<~&=FCQLsW1OzUGJu~1KAV! z=^C@Ub7AOu)8_Q%+)nG^^F2V2&=_UH>!-gB-@##jhK-A5X533*U%kjIEI8i3l1CB>S7elv=T~Ox(*RZ!7heQuR zZs@oABfB|{lyCGo8Y5`~dqyg6n`?TJe6mLd1KH=D;dm-e?H zK`ZINKWi00M4MmI$N_i{e7~!AmlLPI z@kc~=(+N}v$>&iqR|(~9>rz?OXTqQ};tM%_xUC&U*hW6a=ygygiW`=xDoT)*h-bUt z9??mba#oLlA*x#6;Bpoer34Ftx4F^&QkzuC+TSL8FdJiVZFyTXWeZjjqoPe*SByn7eR>vID_0=HPj$}vD~{4o&pS!R}jOzNu{xx zAsps4HEnZVqjFmr7BufkG(HkK=uRZ7YIG})jOJ)xoDXzrS1XS;!qtU*qC^el#*E&q zZml0KUh7&i+@}bJ+SrRN;OR&fqwJr41GXN3xv;11X_po$>xxDTJoE+ss`3cxvQ`&_ z&jV%*D)iMU_$NuQLiZdW6o#xxORcoAueJ3M163q7lz8*z?PJzL%jfd?uy=?klX-|8 zYu7wY1OhPT0S^sFRN04XO7n_5W0gMY!<=dOH3|G-+`&rq6vB32wtX8YAOQ%NWN##4*ymXogXKKfM&i{R1CF}6D|NR|&PUOSmR#IUHV9|tCa?aE#C=zG`db@tO2 zKRX7{8T82AKiIZ_QC&WJ;X>x|(=Pmrd~|x&AG)xCoap1k@+fHY3^CK8!6^9EBWp9= z#athAsbD6Pq+EVnR9`qcFTNK8(1T-EKYbnS(;eO{98shHx@lvpUv>_1X0kV4?ZlAj zu7(HA_6gV0_hUxiS|H^cUDA?GeWpkqkve4zWd%Z3pK7)aieY|nXY~$2l{kpcD@kjz zCVBfXxL6u0v9eiZN$a61#Ys}dM!rizP|%cdVP?@J8fgzlr)#H|u6k^f?69+1mW#o@ z&R*v0%;`u`L#Yq7)qW|L8T##<2aW)tE9>|?Bc(LK^O4YY>oaR-Ft>3D#gCJ0gsFbg zr3i^FV&0o5n8=8@rycYNbInCb5EW$=Gx)J*>)_-v16dZcM(~>9T^(60NhgpMh{%>y zMa`I}x5SB#?G*l;oE%g_S*|;itDK9Z$6leIQ%rqL6YGX|QWII<+^7do59>9n?X2m- zW#w|N=BGKQ2&Hnwd5mr!L#(_k;^gBPN-Um)5CopL3pC1LHg7LlM%#sPy&0Z?OG#{)31N>3U%FXO#;y;GA7Rlo@726L)eFhu=xh2{YL zT0?(=F!$K`Jejq1Ro})cP9P%*I86nh;T;c;8M06IJD<;*RdB(Lio$`M6p5%nj@;5N z@!lPlx5xbUmPL@O+;{Aj7PUEu>{#kI?vL#^z6Pt_zrEG`1lO!Z6_A$IGclm+7;qZl zUFRCc)IPs<&^Ot+y2fB>7i5~R#m?%7@RMr(Zu0*RFjQz+A48A=LW%M{h5rPEU;9@W zDo+}+0I%VH@HG5GhRQbr!Xt}=kp>`z@P~wiZ~1=w3xMZX0AV!$E{Z0ActJ-62(bCI zhx+k?-&24rG*ryAth9eE9fg*ThVD_%_Hpy}?ZZsRO2rBYJomWu{_j4tH1y0=fIm+l z=$~h1reOid*)sp3$iy#H!Jj|i_p`J#Oe_Fi5W}C;TK<WdLCX%_+)+|&fYAZdT7z!sJPO}TrG-+QJxFT-K86kGVt^*2M=aZ8(5;NBhbFbg1j zM_^h+!GqY4>LSJ4M;8V%FNLf|REF`hJR!*0)S5M9*b1~sT~LDB+?_EZpMw-#sd`D^ zMh~}R#-em`fWmuCw!)BOZjKrAU!(%7NpC`k;0CY5t3Z>|iQPef@5;_W}oArVfPuM#0KQr4E{wkOv$ z@5nPG5cDDryf-M)=07y`PImK+7G~@S{(f`&PhJ>nl%NKwT*k3PsMiXh9iiyXP1!OINRAYw-fA zSw@5(Z4sH!iWt~NbN?#~Wx~)|O=tkn!<1JH&AT+dfGYP;$c}Son@{_dzoVw8D=KDD zIc&?ThyaNE^Pq2{UoM>isR=ZpC5@^1R7SzAj!WE|orqb8Lb?&=g-I{207kZ2dagXI zl}0ZZafK`4KxydG*$*$pWN8J6*(`*5kzT{*&=qtMXcXmH&L8oyN6C=&Hws8W?}RLh zFG@{$eAbqf5tze}J$dyx8fOqW63aR49idqDBS85ZtS9|86HAPs;JDl;coXF$S3@7;w!8tM* zL|9A<8$>coWxG^|2ZRBg+9z*=PE26~wF>ZYYBdXp2kmwi#6AUmuJqU%pKg8$hFx2Q zWyD2CLC-qaujZQHLI>;CSrC;b7YlMHAdkj9t};WraT43MBXIGF0-~xW2iJwDdvmm$ zen#m{igR|q@#`G#=M|Ee?N?}Usn)%&TJt^$@{oNg;cN_^1F1dCWEeK55)g{n^tI=K z30U+dG_yJb0uc?p+KPPG@)vAhAKst7bkfqwOhw|hQmOoyFpvT6ji*OV-0{M6u7Wt# zy+#@9j&-$h8eC4fs|)u6jYZwYZ>wBrE;^{wN~?S1Ks@)*5qZ!5+2)vbQ_`6S(~2b=G;lz|XM5z?bDgq;0?!_FffZEhq1H(|xX!Dq&v4`G1EN)^Jbcp6_U1iKcSD$5 zT;04BeNu|>)iENaN#kjA+si0gFZQPB5Gq$GrgcMjJ0TKn4rXLS1W{mie5@U15E-!H zOLDT-B)98%$DyO42JGYMsqM~(Uk@vkUB}*onTs$F;22A58`-v*bo9WmXVNAr4=OX| zl*v8+wCPlguRln`K4yu7M(gk#Y)@BMag{53Uha@ikbDeXF)%z(R$GZKHk4Ik)i8%F ze6Wz?rsIy;shFkgIBoxJPIrZYRcbcjmE`*8eB zoexlT)(pWo`_*;`4GdVji=2*?nW-T+s$CB?&JW&LOG?8tE8e4&U4tJzh(KtpSLI_t zbBRvLK^>~H{y+BKIBodCf}@L+*+aCZU(3GN=;6Wj?9+}+(>g1aZU1&81s zoZ#U*aPOTP?(p1Uo{@Lvd*9#r<8+V(QxTU zpTH4{nre*o+(1Uqdz)S54bRNE7j|JGxfKLql8RTd3S6BB2qp`JKfoKJGBs_F)f)XR?C0t8uC+!V1hJ^iB1?HokAtb`7&(5sEPD+>#XZZZb94YjM`*wuQ z+RBAf*VjwpL)SfLLt0)$S9RncD7WDz9_l3w;_E9?Zo*s%{JeIB8$U01DR%w%o+bO< z=i`C+AT#q{gYe8qm{ID-L6Ip??=|K|ycRrGuN8=u7z?AKF$+s7 zChIX|rcsq#_g0om=n6?abB>O;-Xq&#Y~jL7lUsk)<~0Z{DFz7X2o)EW-0G2~!RdTA zwrp$2f1AlNs$y)4)?0Jb?j&veBAr5~vCnAKImlPbvTS0AvfH>EYDzRyJ~v&5#jM{Q zKdv}mjId)dd2bwAY->x~2&~lm=i#@|7XPfN_1&Qv1>mkS=U|qXNpoR?L_3Vg z;;_LL?C9@*iXmGCFxRPo03KpLtm-Qmp0tpCJwZt70SGdGp*etHXy6MmLJQpPVk(~& zN^3nGLThSUX3rse7CDaXM1*tUi@-*jx6p!f<=?7}f_j|Eyg8X)A21`E9r;ddq58pk zuS_K(p(TmccrO8NDHn+~V4$`VrzNQdg7x$2&%yjKBn+VR=S@F4d zBdF_na(tOfgLr-ZdmIlV6=pU*jY6jRBDq+KnU=ny8n zz@a~8qONhll{Z3;9cSzr*(Jm1CmL{Sr*e> zjLE$ln}%M^vtuf7j}G5K^3UT>n%~UA!STRKh&Ewt8XF+c+k?f>K0%)NrKCN}pQC^zzijctP-O zXSBY1nPT(}fNTGeG)8#~oRm?P!nxFqwFU}7FwUYFe~>1=`+}0D#CUy5+kgp9?Wvbv zg0gYM$tV*=UWVOwZJ$QODTuGSZIO_?Z{FdsoTfxs=W1DA@@E002NKn zy6R#WDBB<8k%8p->OgH_X@r~*`uOO1sVitZ4Vn*rhZD>uN(LM2p;HUeT0NiUr$*#r zK->~rji2C6^gYsug?woOAsSi*h~tT);+ASc3b#*ZLj3p^M~wh^4JI2fG{kF65;=JX z+|8(ap-YV}%}I!ax@sES3ne_Ymc{mBoMmGY(hNY(c9WRGL%%Ul^`}JDCz}v&wl&6I=Dxjsadn@bnEUgnjvQC+j5k_!; zg_~Jy?c;sqr*sm8INv9fYdl+6C~@^T(KYvRMG+VBtxNKP+G0?7eWbIS!XY!Tx+6-$ zLo&xNr>Wh@a)5wp%uM<|p~{YLUg;YRa9w2gf>KC8GyoXDi)KNE_vZC3z#0EXV9kO5 z?D(4q^`k9lw*DVQm5j&~u!#l+42B#9VG=*ghdd|3?dkdS27MUMF%YM*$A~RgTY>Ag z!{&!V2N%O8c3;1+C&-kNeCoAbxq9^TAhf=iyXaeS)1w!ClVGOP4C_*VR!8R;1)T4zHf<^94P@7k0SxQH7_;Rj^7i z0EYY3eOOWKp2N%_>;2whmS6!&Jp>cs{s2ISA7* zrFov)CmQ0YNMFl~Q7lC@Jng(C>K%dgW=B|S89^mGYb%InvJGm=09i-f|qS9nW02C|u%es9Z<Er6yMG6~;Dln{ariTQ!j(o0 z#p6kGbeAAHUjNtEuJzr!X0AcfLRC5En7u)-#K81LQ{)_Z4yic=IWy(Dr99hrU0-(!t6qQ~tt-nFn#g7aX9@ z1|0-|llVBCAB^dM-|0IWb=@w9E0dL0GZZC_5azH&&xkfQe97jCD#(h~-(P*9XIn4^ zoSihmGDPYP#296>$|F>XZLy9Z68Q*B*zhAvgS6b8SVVZUEg4L^9QFB&9Df_8)i&MB z(=+!hUyx^kG-f&>d&(*;u~~J!Ci*pb)SGwXEoKI-(=T+%nebpu#l66uhz(DYf2mf` zOXv8hAf7S2p@DD7-sR;xPnx+fx05l^DjEk}hh$slf0o7@5XxGFrXHopfW4FTIPrZC zPNXo!5}W=fXQ%EiTGozmOKMl?m#%bA%H}$;=<7zy(nuUwWZF($pgX?s=FpG9(UX+1 zF3&mjKcSblmpT35I=8pI#b{-&2w8~XPm1=Kqv^5WCpAKPz#6sYzTiw6yBt82>O&i_ zx*UxNhpHF6`tq51^7h4L9TFz5ZR!b*|EtwyC<&pm%E#gD>#=kDUI5edb=fHTgaW^~ zw7!%%auMC;h#a$o$3`Evjso6@1wO&VxYE_GF1t>+mmMy+`Ir{R$SME?H zKS!Yc4DhA2BU=$a3$UJY%*s5xpH?|GdsKLdLNc5kS`LxQD_#WIULH!TTgRh9yFa8} zJ@8ut?fCxqLPu~SnLt!T6Vmf6^LXx@r&U*t<`mwvJZV2!*V7C7)V z7k`DX(wu9OGb;LmuRp0^w1n}+NYrbs6Sig>D<$^>9m@hS5&pdQ&K_p$8c`H;C37FH z4!t}eC!HE%19hlmh?1F&;Z%rSvjAK&oSdgY5n`>t^j53slQzMDUL^Vffh&<&{RA zv=4K{Q(4O^o0ddHzRj^e}SOKK)b@sg1W6v7Oq}0V{}=+ z@Wl3{g2p&s7rcpEFRNs~CP?@4u%T>G`mMX#qyh(4#!2BU1vYtVhJW1V*U1+Q!0bzH*nZl{>4_Tu5<8m_^>K05{1oqxUCRK20-X4A+cIm# zk-6l7FAeU+QkN;yl2S>^!|bmliZ+kZ$yFzKt;3)^2`X^+ z(zr*zfSDL>!x<@kK4`6?Efa%N6L#`A(p%+>iWW5dB=lngN-4BU9(Tn6kL(33?&hZt zR>7}Do8)_5UQ9ji=}C(ddgE+31;!$zqcOTMREN!s$;j{t^2Y)?t0~*e%%Kr{L0rLA zYEnQKgeQ;S%aY5&%3bR>pD`wjWOeF)9PT73xN@77lg`ju<5Y!uqz#RQshYAqP9k}H zc1-COaDHOr=a&`vtpYsh>0|paJQ=XdgjX(bm#D00&9vU1p}{yb&ah5d4@4fh_7NpV z#~PmiI7yC5NMEddJ|*q!cnwHJP;r}}u3ThAtnP$A7&j5rkgIF3^S#J|+|Jo`b zkPdVy0LFg^3jg(he^h1${RuMw_&bUX`cIHXD}e4+hVmaB@^`;8u+W2`eTM&gIDh{m zFyepo*c&SM|6IuUKiZ=I)5kwtQGky1p%Cu>G))0I{=d=^{8#t-KUNjE#d>eBS?0F(R&#*m z7I(gz*U$36z%&pM`L7U<_&_NlI1uLJ!kkQr8!3TiymQ*RU(Zid9ZQtj=V#6zv30@R zv90Jx3DCfSADJ2XAb=mtiNmcAe(0DX=|AIewyl~8=`}?( zIIL1hXYnH}q}-+&?E$6BFRp}(7{bPXNSy-5zwHt?P-NwPPtSLrLXKq+*}KOsU|@M5 zaL#NbtpNlSJI-*?Rhd~;_mt}y%e4J+GmG-Jg?aEgPFeT^B%Tu(Re#W z6r#R}{WSgc#>!e0ZGOe^iMTZTx5*Vub|_<>L*%bnyO@qnJ2``)pWwD=NbuY9(BGCKlq_^LSbgNqp|%#ciKj&G~a zqeLj}Y*|wD>`!BK~*VeHlF$uLeuMKl$0cC*pUIHaF_u!Bfh$W%; zVvd|)pn%@XB7>-0YdCFd{-~tgRmzqh=;6(S)mA_B`q$E8;yI^I3ata3CIiP8J#5a0 zpIbksP`S51ALx&#W4H_b-Vr(bViuY&H^2`>kQX$YYyh9r>-9OM?n13jsGkOB##O_Y(U z@~);&l^<)x+LvYy%?+YQWaZ585U@m(Zz?}#Jv6tOL02nol7na&K!se(PKRjOLQE#{ zInZs>hh5B_*t7gmN2RcKd@iKJ*(FS~g1Hi7%(Jz=-!b2or@VzJW^E01Z~y(`RQ+>> zazC*f|2@QRaI_*;S|)~XdCl}qbO}I#ruKTeIo^>+XZz_0S(7EoDh=s;XS$wS z&9ftChNbV>3K2#Urm+z1WItY#j0>Rhle;16f9r*%6(@W4v)|H3+Z9Ez!|rq>7E9kY zNC-*V%(@nAcnn{Kp6~*`fmxEDSJ6-$7=$LD<&2P_gt02C&_R*$(!e&Av}#Ejtb8WL zG;Ex#Vg48=qx#TG_9U`m4OOa`yPzo;9QBwawj|r7KJ{}Kt|$WX%4hat(zOhJI|apU zdXXA>jox?%OHoBxtI==e#}j5k-h#D#J+OM_Z6pZFwJj%7srllx!lSrG+oK3XYLtsu z^K-QwSo#Hc_&CqZ(BS%iAcDIf9kC;DWsQw}l#mDo2EnzQgiffxQ#^k*@~rk%!k~|q zp$%;;SkIu!qE`_VcQD4WsaX?wBh$Nsbf3@D!Ng!ftz}r7vf0VH%7bKcyPb4l#@eRm zLN-M9_=RHGbxGlN+pZ?jrlSEkr4!Db>xmO->&r~ccI^gN1A?MptF9SfNcdHn{+;%4 z?7~`2fomO?T-V&!oUV^3r6BLMKUg2=dIUX(zgqZm(xPP(1PIfXa2jp_*D;3~BO8my zKc|BbNj4&(n`L8+EF+s2ij_3;=6#?V5Bo~c+OO--(Gns?zrc+ zoxRsWO`#H@@}@d#c<27%S3IXnl=l*sillgO=17SaNT1y>YU7Q!b1x9jP|!N5sWmbD zU4_q>hi%;hTfwdDzBgVzO$a0WdlsrhDc8o^m)zXby{QRnW*jQvR7Z7J;9oQL z@AIrOus(1_2wIBX885QTVW6PD-ZMBSH<`Uv&U9%C#Vc;P534)q;+8NYk8nt&p&?q` zL=<5?^_pRt3|QbKTfQwQ1=l$q16BKZ$H&tNCN;}i+3BvHJRywfyx>Z059*6|?k&MpdxpD0Z2Mewp}c+s{!s+&=jo zXpq$BC^zucivAh6gmA0uet)!~$pvx!isYjgFoXnw+^z_P<2c(gsR3%68 z`ef?a+e#mYhA~?Z#7~d5kD;TOhCW6X8-*zkMF8l{^z+i6c5R9pjs&yee@UaoCejcg zJDGU*1m+q8dbLP0g?YKBc+nthh#g_0i9J&u(W@xoaawiR${639^e|+l&f-aom03RX z>Da}F#|cy+_RKsIl&zkV*BAzqM`g|53cuCp0f?|{&9vZ7%t02olbj%su9DQEMD;^u!@Lp@vIpkT9y1M9ar2<`Y&?XgjV8v%u*y z&xNLxi3`>%$1KJM67r}HmJ0~apD9=d$?FSE$@kx$%1f@g;yia9v5~+ zvYN?S!RLXi+BTbHE&z$a{apC~|C?OT=QxMKLy?aoANG44p|IQi7F7jMR~mN=Lq>6S z8`O8KOeQuAa%@H%B11x!45}t}RF}Rcsr8Gg3&d82RD6^?dcLAy5U6fbq;4k5lr$>q z`7^+^F=b2e-ZAq)F9^sXe|KgP2_q$hnRSGt(S!;|So`7^q%Ql-bs8+|EZ+t>a$`T_ z^Ai*pd@?O4l(j9%-P)j}mvEmmf2i*)p& zF_ae}ghQHa6+(F&rTVLadaDQ<7cW~#TDa7pV%1x|eBy+SJ*U)?e#K6X;%EEn!$RCyiVoaN4}-G7MWq-w2OF0I^qibZt6T)!u8<6dyV58^n9w`ZZ_h zS|ImmtJ*_rmt+>#VJS+<&OZ~~Ukmh-N2tfh86_Ub;wQ?BsK)r5M>I~>&tunuK2z|H zOiam}2FWA0;Ek~<4Rsuo2^Y>3o36!<%O@|pIEHa->=Ex|~ zWi#HT2#)Y8sb*BK*zOWk=4x+46NA`dhiYY8xfov+m1n!ctyD54_0aD%Bk*R*m$$rq zHfUcwQJ+oT|D;qu^Om3F^x4Ma5teyJ$xhlFsRJU0pMm2CnDL1wo|NM5%|}lgjH=^E zC#f^>jr87sA=sFW3V5T?5ap>F_%$p^t|eOp+P`u{i$Vpl5!nnf7b;0p9|I&{fG+}gsf>~G-4 zIIo^VN}?(0K1)gpZsEyD{M0S&z#ZZJm~>D3fzd6n1|+(rbS5IlM!TQsdV1! zzRnEZfpe}X9L{)t^UuVq>`R^XM{SQc^744eWM;4sxfkhuaOOkNA^C`sg;$Fs zFN?|bWX-v2c2@06$4P9_Y9)I>`c@b3*YmXAH?LRvu#)Jp{l@Dg>Qz6~4B%tGBbo{= zTIJBUqIte|HuRXiWl>V125C(+!_N@lE;3d3+>igtOv ziy~%2U#j{Zard*r_uFgQH4De$0|~9>;E2_N!KkjAS*fbM3(!Q-tSm~ME$3yuDXZz| zoM`B`RTQIy0TH{iR+8a?T+yd9G3nQiy4pq>-BErKS~@Z*HFl^K888N_UML&+!kMEM z+`;wE1(i4gu}vg8)q0yuScXigKp4{^0jOj7 z&5N3dMP1BtaleqtYCbf8N$$n~ZfOk>TFE+a_&x1gsX~ZexYV!u&X2~6li>p;@}-vT zbB!m9){!dq z2%Oo!(M93Lh7O&Bk_~3n zJ|#1&s@F*g{7>qgJqJ>&l?}EnjArel_*n&Q4U`4p^SQ|)nXP*4O1skEhE1%m?{7x? zb`vXnJ*qO)5Q;iZ+OWZ9G?uOvmnbB+BUk+%N|)I-gQO;Yc%9fy-=xx~N2bX8w0Ndw zJfLt=X+mgb+Ha;?4l22^U5`=naH8iWhofHR;yM1$_u`xR&XpQ6CuSP=_U126&cE|& z&;jn`Kgdb(BDE19)U7=|<9Xr>qU7CRI4-%mX5-y>U8DJy)W%(Rt@rUBSyl_o+lA;5 zJIqGUFxEr;nfT?LOYAAXI+qaT1@TX8t|G=HkE+!PqUw|TRWjfRung*9WyAI*EUv~= z6j5!ViJ_1YUXsyHI(GOD(U@*Xa(EGEi5d=5Md6X@juje;Ck}|PO^L{Pd7Tj<5-V}A z`Bdq+Vp1@Xjh@30*>xs5f!L!QdxiWRaia$+${G6_#u+WY{k)=Q$3Mz?9>S$@pPUCH z;Gu3Sx;w8P@c>>V(5nZ0*Zw27nmURp?BbV} z?PZ)*ct2+|TZ|uHe%2hGSI@|7dInNis7P2kUz< zC-2CUV_&btJRKL3Ir-Uo$-KBrV+ov4iIV@Gy9y!|c$n{vj^)l>RSWGgY6GAMo*X_c z7sKGSQ5WZdL9GF!Jx`I~Y7XrzN{RYdKz(^47$uSlkEkC)Q)}z>rHs4~_A{4rF(upt zRz4@oz*!$S!82tJsw^A61d5TSR}t}JdL_X zjrN%q6HMp0sg6T5%rU*u7}-e$W?89n0CLYmtRAB|*nUxb*>bV)k;@e69PIr2Rp({? zMNF{z2@)=t`QqtzA+SrjYwM(dK9J}OOQ-&CqAz-!D>tGqYiz2!X_QGCft4Qh_jK?t z>+AmpZ#*b2?>8^{Z!8rcPWXSq9sk>y_$S=)|D3!1zv?L9jl=o>D){`-CZs0B&8{HMVt z|5Z@O{~yl#e|Inw9m{>vBL6R(>8~T3P5}4|sQ1^}hn7JBP5%jJ`M3U!?$tly_PB)z zZ-bj|!=`Q#w%a0T6aX1+QIFq>H=-%GPVL*`Z4}k5_wu&Ldn2&I`UgHqcN;}@tBiG9 zdmBZ?`Y$0@pne1G{5vwOf71b=;_rC0KB%Pxz~3yuyJQ}WfCnNl|4U-57(rYr{{qg6 z>6+-24(^vfesK3c*}HR3P*qY-ZQ!VzS)I|z~r{> z*KGjkHv>35xO?m;P-yI*|NnQ(4v^Jy*N-TQIt%hWuc50Fn1{4D^@mGj`~Ubkjl|S% ztRMw|QR?*SA|S(Bhtfw8<4Jj5tyyufh6>a^Z)mJi!dv$Vj#UcFapn_YGHeBBzVp7kmpLN<8 zg{u-n>hGTUKbII-(JovG>Rq+PH6PUHM^?X(Qo7i8$^|#T!n3L~KHS#8K2nA3X;-z` z-8H3vt|ie8B5sT`eGSM^Zr_B%P+EQ(FT^&{iHm5A>Q-aYo5!!Rx&op69K{s9vvj)# z@Yvh5@Qa;el>e-Z-aD;inoYZSZgu^XiJeFq+VNEPm9*0$nd3-R>w0>CY#MkTZ!%jNi|T9jqo{^!v%hSK*4M5LO2a-ILXeEckE@IbD0N*L<=?J& zlpuliPBWI$rF~nDB#v;JnCGpx(*Ra;dHl2J<{!wxz0A~9!PD}qwh_bSRY_*wdbA?8 z9$NRQ39L5j{d~W^~uO5fN|&{NKq1m zJP~U}AV3FmN5;{?MR9>D2Wz!09$|TAmC?~F*1RaHRl5oDJZpAM!H}?cgsb?>Zj~YG zwadK30H7iEOY+5hu``uD92V089AG9ae5SQ3r+d?#i88SZ^G$RiAjF`iqQAQ%(tIQ; z>+7eIgC}rJTFRZzyO;5hZU9KInc z>*ygYDk_)FeoQl-`smbQyqTm%0T@YEEvUPL zo%cZBDg*G&qo*eQC+tH3c)oO)VQhpkd-6>Jtl!_!hNzSWb&vo8q7^pLf)$0ZjpsB? zFNX)-WvbmiHnxy_jc(nE;#6RLF}ig&3g+mk25cxzcUR&kJ0l))D~cmR2wP&S+Jx8_ zR?pr8=|uyc4eDBqeKOWXex=2GIyWJkY%5fidmucE)^O@wz-T}(TFD(a{DhEr=A|iW zzfsqo9tx|tj|JSUcqlVQm@H9KHMQMF_8~x&)F$ZJI`V#`(5kn`f{4t;_u*^*H0kaD zs`_1bp(3Gd;wv0^c(!FcQI5#2qN-wNaPN~-?9@SbX93%bX-YczQ$w6OIC9JHXNeI! zc04cit8pFe8P+|t<-gEBem2x}D4a>vRE~zgyq*@^N4@0$x4KXAY5z;ZdgY}dJ0q53 zLUeaFnuXekN4Di(AYUw5iqpQ8aCJNvS_FO#d?vT^BTr2r z*q?FvC|Va^poPQ7(_A|K8TL+P(dg8BdzYIRqUp<<5umkd(O1tSop z3WL~l?9`)07oOqB?mud8ENPjb-BNU`SzCMNC{)qKQOgA8Nr9rHBw6n2nczT=VBsrA z;pJNiXXM3+?c2vgP6MGv+@))FgGJm@5;J?cy&_ufrRB`wjPBUeGYdWn?je{AAUoQczP9;-`Y;87XZTvbj4HV)+45@cG$`(8PX*H%ern$1(&7 z+ynC^AE$^QUPJUzSX57!OJ62O!~VNIPM6NzePomNBbj^0%>#X_Am+-yjGG&HZ{`Nx z`{?xXaI{^3wsyBE@lnAha~=BA@LqHgJdF7%z`Kv&G{~C#ryj(TZl)~*%`57Abqnnk z_>Eibt`q6=Y0&3E{;}9vP~3yoYH;+Gs&kN|)bq;kDQ4bYY%=zI)axvPtV_eCuHVd}fc|lM9yrgekW1&vWfl~_^1Jz>hPH7EL+Y`By`-+JX?ONXUkRYLKqlF; zd2G4GHn8|UChMq1R>{7Rz)=)N=JR|xbohAAP;kg6)aML?@?Qjz`iA3b^e*CF&D#nG z#62S><#T|70R*PAX@g-*_{;Dc?dv`#L;KFTa8BNHA#H&WGlr+Oam=E2@VywGB!oA{ z0OI6}|B$cfi%nz2RY;`;eR384NvTRo3~WY}tUQ+S{OuL?R16`oD7y@z^x8N>H2u0Kb9K+Hg1y4<;BjCj^#@*GqMGKD;^x+-gI$ampD#QS;c60qC%e$a z(dj~5QCL8MQkj^4ruSo$3L$=-)9x{P$w}T%!!F$M4X@qkp5?`h1t-$OEHo-_cvji; z0_W$sy86|GC+5MjeJM0+p9}RE^&H%#)IaYpdSGdJN|#}$RV<%X2E<9{Dq zyl;C6&d#&Oa_?|?sPmZNZd^3zJ=_UE@Yqdqhi3_)-eP>?g3kHrLIa-FCRBzC2$n1P z4B|0vI=ybQklX%3Clk-9DG^lbfP+mr%en^*eYt0Ebv4RtU(ouJ^btYZEXjAcC$a0m zW7H>FVyS|pwOX|)LQp$d1=E>p1UY@zQdmsuAL?S4nH=YG6!hQ1$~ERDoiPogWv2SLWbIa%mHb!`+TndmSStVBfyy zUx8t+7=FL62XBK~9}pzT#CYd{6O+PEl&UDAEg zH#^1HoOPT&H>l9-x5K^uP^YQ*v@uv-vl`tcI8Lj2j8aK5Df`qyUzoy6DEn!!jFX+X zPbXr)Mh`ym=vdr&l_Oh0wc{OYdsf!IQyx|FwfJ1|I$J$2y#$MhN2 z5Ph%e!5*UP8|xJ-ZeBr`;G(X{&fZCHl{q%yua0{R*>iqRT?@y@G(DLdtupitm{B3!afQI!xmah`AAs~?p@UXL@@>n_|LWAEcfrJvQJ-ZXi;i>p&s z`K6xO6idUbV`Y{Jyw*(rI9HL>OWAlrZFeCb%l%X>tVlXYvNL1`|COqd7fZ3UpKupS zjcF0-INUeMJ@&!14TeQHi#=3V#U@V6CJ{n&;)ou0-P|_AugjiwwEmq@@aAVe1(hCJ z8|FwqoK0~)Np3!U!XBZXCEO1NAes7Js_q@FkypqKrZB5UeTY-8@y+@q_uGV5legK2 zq>!DryxNW=kR1+{zWSn;MIx;&QB|HhH64T;Km+8LBH6%iW*?`{c@wVNPtJDFPR_u8 z@H2+oJFp*$K+xT>K-5Cn&A>t0e2z)lG$rn*(f#GGLbNTfnNmL4Y+D7VFDMv#AtkdY zIulR>_ch;JB3y=eGswwxx~=I1Hhn`j} zLWdAKls?F`YI>TmJYs{AUyE=$UniBj=Y#ly^&~I~l52W`qH-$Ogz=N_Jj##GuSoJD zsLpR1_@7d}U69RB&2PqiKk&hrolBAPUFf>&T+(T~ng#ZpT)C@Vjx)^9(=-@EHQDa%sRz0i=OV|Ec-8-vRfMD{3OGmnUhsAO6^2iNifW&z`G!M?NE*`{k^-wYi3&Mqgk*@*ACN{M zVv{bNt<;RC4r1dxU5u!>q}PC=oi04^8AflC4;X%!$jc?cqgKik+mG=`acY*)b=pkW zwf%6bO z_Z$=7f2P4Kk;P2Aw`mV_ihw-vzgk~{L8XZ800eMH@fJt~pGqBy3kY7g>!07-V7IM= z)_MGr@co{VkFxNrfh}fyk|cLo)RRQ;Wr#5GBFwD~F>>lJ*rsJUr0BtpJHwp7={_Q( z$Iw6e4pB477p-jupa0eL$b7@u_Vdf=OR(8;^2B=^{=oG(h%5U}!~1yQKo2{3bDc&i zGQ{$P@8WgDF#q|r@no}&xd*jQHmWCHU#@#NSXYlYTKjk{UVG)x$EeYcfcQM?B8eX! z*g;J1wN)bf*IO$)ex7{hi)Ryk!d#bBne={@2UkjgZNNLY;XAY_B2nMHjeg)dnC`C5 z2xsUY34I-^^Fm%Nn*HH zO5~*)p7DW;IX1x9EnNfLwmdYty3S)%JnG%P)N!L>3BM49*Or_q?Dv|_z_2>9Re!#P z*VRjA!+lY+zTcSC)QeJ+a|L5hg(}ON{D+-`jl;Tw=1`d5+}z*pZq6FyMoU zGN+G2EeJ_wvh&z7PBik5=yeWoO$ffGra;0~kkYaFB=Q+cs)hkAIh59e2v@Cj>mh|i z29ig|fSzLt*?n61HDTsjT$77S9FE5Q~p50CD+=BZ+WzDLDkaD;T697z=u$i?{8<(KU8cK1?pq*qKa#seCzAA|0l#IwM+3HB6u_L~NuwX1{$#lL zoJRXa$*P-k_3>${*c{yai>P}4s4tFSm-VLvZW;&6Z;#%uQJlwJ61ny0UU9e@**jmV zo3xahZ7y(50Zt5ylI)K@1Z&@B2SLK;SKO@#hb}ZUO23gIRCCp6q5DgiQbT)9(N>^Y2M< zf8FnH83?#_```WXuO*NK!Y`NgYwh1&;;%dY<82W7{A(qU@iqbN*PlSw2DnYb2W@~} zkpG}5Hb{?QsjRNs7!Y=AOG&m`W;jT{*qwEc*}$G$D9oUlkYJd z7(qAqKYoq}uBburSideu)Pm}6)=~Vwt)s$-dM@ygC=#xwJ;E;tXQ@twhecCA^Su>t zlK|gOS$11QnTGSDQ1W`Uw79d>`J|Dq`+2a;bVsfMZx`X{Gt4)sWrLMsV*9H0P@9lvHE>IcnipPn|ij?8A!hrIOtKHN?+_3r& z@$nmO5{*B2l_^9L@Wi^o8A*r=G0-cjTfl{$Bfsvg;a!(oN zpMRR>(F7p&3}hrjCzLHlzB+ipJ_9?*^(=(N5JG@jp;H3gZd$vv4C6(1YAZDMwBPi^ zhGXft_E&5oDpmurSa^3gj z032YVOA;dg`bESc1s%~@Vb}YHFJhW+adPW7yUa`mh4mk^(6kj0@Z>#>(ArO~rlfiS zh7T=ouhs3x?q!`{`N5v{vB?}I%7O>jyjXWX&(g}{NDi#aRdfKYULb+MAReBFF z_F4GXrPDAm6oSa_Qj;s3ab1z41iw*f;GNmRPlu0uQ)xejq4-hAZ?%!Lp+5{R%sE5F z4!`IsogxbK&5C%EWWoA(<+G!WS6spus9e_8Y7jZRhmml zJ)L=%W9XTL&t4RB82C&$pwG4*LM2EaBwkX(EgLR*Kq#wp8?E!2=qB~GZ?{f2?tcPk9o^Ha4V}#cN4`zKM8*%4<`k6L;nHclP zWXdz8L%Fh2l=>9dJd)ev)8}r=MGYx+X-N}B|Gw*}8>*1xaTR5P@mu1L;jK|3GArS7 zsSzdab@rFF*rITZxCq&VmDUWk@rc~0w%B}~Hc*?CVwHc5FB-Y5yw;i8yPIcRDC&nMX=&6GX^LxAgb_EGaLUh@_^RQtIC?2V? zKO=uJw{RM;=LMqc`DvK_S+E`pb{80Ngq7J_Wm_acCgGg1;muJ{Nx+6tGZjwHc3oI^ zW$HTRTI>EDaPRnepcjW8a3}IzP+IhT$8DCmnp=P_?%V!DwnUoY3v+g-upLk00_0SE zzGep5T6P0o6b))I@A)c$=O{Cza( zTgT{rk0$&2PZf zw*2$%0d$JKyU4vA|3FU^>z!bIIgs}ZGkjZ;vhSuUztym%5ecNXTqsHbY;z|G>168LzuT9KQT z#^Cvr8nvP1P3>?_$2&zZ)`SgSTU4%ieM~iwz_GDH{GCOh-Y-vh1X?U#Q`_FEN%4_UZXb+1>lJd zm08xoJcjH|$f6{3l=!eFjwWL*?Gi^XB9EuZ=E&2M>e8@$CjB%O*6<2;et$zIq&U_$ z;oxwRhBoOJ-KrW~V9KG%6Wt|@@HRVi`W1Gc5SGX4qO#u2KiadWRIO3^6xk;a<%eL< z--O7nr7LzV@5Y%cdk`Q?GHPBf2pKy(xk9MN6A5eKgio;swCjwD+rBEk9M(%(6IqRh z^Jn?=w6=KTGPZ)F=x3j%3ta3Dn*&KvEtjaQy>fUzQN!znukhcTTecW2bw7{<27oUP z#;WM-BEGn=eAJ&yUQGYYT+!EI$QgF}r~bJQ9<0yzZ+spR4JyI%d)pV_McmK>FpVc^ z;dsu0lD^IhfOo@rv~d@&liu2EG!-R}Kc|rczt?$8_dwJAFN7Qcyl~9~DB!yneoj1q zS-GlfiVlyf>k5;Wv}`e9tSDk)k0N0PddZ3p)#O(Eoy5w-UD3HwUW7WixLp!oAzQPq zt*QDgH!%`0zp;9%nc0IyClfH=_ek94NZhr=?}T^WCJz8Xj6W|yOjHa6^dO6Zb>vah|5ej39hmNhK6=AwGC0d;V-VOt9&aoaJqpR`{BWij=1&N33&H%1&CmwX{t zP|&RI?T!a82=3q$azVf6bk(;$_wfW5ndg@KdIL{H7Ss+UabPethr&UEm`8Rr$H5i_ zwOG(KO65~yRN!-;%FG@J#T@g%i?RHLjb*)ZQSgn6p=cFs9&JxTZV9ywzrux85jAI>imD~y#-Vr zO_wejT!Tw+g1c*QcXxLU?gU8CKyY^nZVB!#!QI^n?k)lD3;FZ?UuN>pFmukDbI)CO zu@+ssy1L)p)w{Z?wmiGcDDgYU?d-eI8%mbB(f%a0PxNckOSataui>pPBdgtkUV0M4 z{E_2lE=8G`e-i*L1&L5%ddNAz9)?$(o+LbZGeo$2tLec>F!ILXQ1X*!sg`M@II5|r zmk_#YW=RhoHhsbH`t2)BQZeD!yvacll$JdU`PuLxAZBAAKhIa6Dlf{RUL~TUn)FGJ zx$6X9V@@iHpRz41)b7gm5BiboU|m8c9HJ+A2iB>G0!677Vx+TC6^N2DIMNCGRCT|UA`N9RorU$P^qRRLo|POF;#c-Io2UDB_->^ zm3YGxvg`mcX^KkWGt+0P;*`~N+3IBhGX$>pPw?Ze@#lK5!GTLeE z%v6Fuj$kJ$DUaN;KU+M+{vL<)1M@A1_NgeRyl9;uOS;PQ zTJZ*~CpK;8_+~t05^bGBtD|5Rf?7%5uFgQ3BAuT|3XmgFHuZfzD+>x6c&&u)&l13T zlO@1uKC=(+FIy-ZkA9Yr3ceH+1g}gBpHyu$)?b5b>vlmV*P8jZ+L^$7i6Mb{&onF} zLbXYX1+NLL{;=4-!u~){H|_LGC8cjOC5Fr?Z`Y!E2>+;O_Pgb~dqw9Pi6e2zC89Tj z9E1CVH5>_06oSJi;MSkvsJEhuib zJGtT~u}?1?d{}l^Lw{bTZlC1^b;EeSbN^Eq&yDL4KTu?g1sSqW2T2}%oTv&<0>@rU89X;wC0sCAdKe$ z8PmJt5zi{NQpktTi|tbk#sQn{p|Tw!Hd^cW1}Mbyew#(FR~GHU)mYh_{)Uz2X}S>f zsewG|)oMV*CW%me$*1h*{LuY4ZfYx@Tbi+ha{QDVWgJSuWv8!)$m?-w-0Y=@4x$Ip z?gb{4+ln$DT#237UHyLOQ?|Air7g4$W}D_v?tPU$*)ZPJXD;Z~W3)rrc(6CjaKY{? zO!`EC)Hq78F)6!}LuX*jcNZ8X_>uxE1|{XoEMb>MK09o|L=RLsM)!;AHj#_ zM_f9XYjf+3Km=Wx1ezOT+fE^?5?_t2{4d zC0CO^2q~$|JcsqPdWC*_3GwPcuDMSZ*lj+v4%TQh^Wc?lDwht)b4xeC`x+rAYNQVI zB%3(ivSS*uQzeNgDOi>{axWZW>`!>YNyLN_Cj}T7G+WH^n?M$7Z`*BfIehG38AWQ^ z*Noywx77^|w3i$vB?&D^$cB|TPh)*9sJp&qaW*NCbz91UChRSF4 z5>m8R34V>rt1(%XmGuLezX=!Qs+KH2*nDzeHC-)iY;x&!J0}ni{IOM>Ln#&hg81e= zge(rWL-gDF-7jvc8Rr%0WRSf=MjCgktLg?y}OFm{t$yy_u&f z?z?=bd~6``>nE`r6ESCP;!#_?t-ILJxYJTEngyK}$E+1&$)z zqwxcgYoqa{IZoJX@O6j+7)Vu+zWJ@5%5M6ZcMDjeE+pjcw&T&lQbQWNyHH+85m=j2 zE4qVC83#{WtBQK5wsH&Bkr`|8rx)>0h57%4wf%nwG%PdYKa4WZx3)hT4}Lcw{4yl` z^Y|CU>p!dhYbE-hVQoJz0)%!yPOyLf0|1>qGXDD?J;RgTN?p``@?xU#X#|e@d+W?{7iR`V_PIc;b)j{XFq3r-FZf^FP-B0{$O& zlTUYMd=i|0+YZoz`G3Wv&j>JOGW|EqnZL}N0K4FS%^Ljc!v7sd#y^GdGP3?B95Ft} zkB|JmmPXdC|dgDn5qGd%Vl08rtdSNy9oAf>{8-soRl{QstUzW<8Ro&Vpa$Ke03 zI8g{Z2iW@mMBfPg+ddF_jwnBJD$M>boDZJt@K2`tUmvwcg6Wa?8$kW?PXGuwfcnQw_$bK$>QSxu z_zM7$rDuN9;yqG;_YRue(?f$Z2;;QFMz%RP``KqbQFO4#f$LM zFZ{tPf$^ED&Hr1x5||#Ri)Vz`Ffsh5{L@n4vwPeo1I(iM7=50Wi-1sb|AU8O91CpH z1!N*VQT`zP1O_iZIMH2DQ)1;C{sMw;{AuG%X_b@ai%#URmJUZ5TN-4XJ}z%^mTIRr zN@PK|#d*vyRpYtEk{0h#NrZ5O#Wc>cs*b-E(DLD#Awj*HU-^>jkE=J%)oTGwOT;qRz8%_@_1T6HLxCUi$C3M3nmJ zp*?wF1xL7Z<6)=_=ZW4P5bBpMHpc`&D?gyNXHlZ;1qw3?Wcf^!N&BouckeW4M1_(| zKlDp8F?8-?3-zIf^f6Ya?H+_{(UcXS$N!PDXX>Jv7=KfTDJe(|;s8{mLjcvN@T)eN z!PA0*ps8DHN>O8OM+i{tIU)o{eQ)}g{i49Mq{FnDHUPB^Oha&d6UQr?^uugi88#ry zVOA7X)+>dVT1>EfOOzefN=m~vaJ|fCF1;yQ8VaW0lB-8H)q~84ZeKdWk$KRRWHL_84GE&qe{2S+N7%ZLGNs%FRhF7$Ls&_L0Tyr~e`_a%>?M6BCB9ox z1z&5G$wbX#B=M=D-Aq?K1)^$+kLG>GkkK0%PRqi*`7$oqQNc{ROp0P*%d{|mK7EZ3 zUqxclC<4Q-HhiYHl-l17>uJb{#t7k_PjZ_f3ij!rtCy&DHSVFwaalK<#b+k^v7RHY zgrrpoWmQkv21x%1K>DyHV|`P*jdlAr^h98(Unfc_9{W@QIJ4P(7K#ti>rbSNrWTol)%m^7WbXAWPxyw{t@2;6z&Us1gisB z8>A`<){qP6 zr=^JMlNMgz%8=zdSf(q^6)+E(aw4xv!dwz+Jup@rK_AqQ&QyxtsB+z`U!qC8$x9d@ z1BUew1B0bmBSw8mON{4%T!XcJOOxK__q9nCjwT94v#mPTA-?=Bl<|hy?6|Kpb%%{2 zLf*;tXu>`MQ)*w?YR$r?o$s*g2Ox;v$QMC2qn35~F2GKNp=hS1J)10WU9oglHXpu? ztV=CMuZdwVF=VfBnMSxK>89w@umq3XHT)#I0$Z13P{1Me>P27Of(4p&XQJ@-7ys%T z?yIEeZNSSABD8%pzDo`q7y(&)E>NEss)!?!aoaYu$#DRTuU{S~M056UFB?Qy#5RcOq-d2GI!m7-*2f)a-2&8>N7NmXwBeh3b=E_wm+wN?&03dVG=J z;zyk@7|YBM1MImms|(Mhbs=4Re`gBVA}prK?hkiZ)NMMKD)BPy-VQ;_2XA#Z>Qx+H zPg(6TnBA6lxp8|tG+8A?HH(F#_xwd5(??gX_GTHp_5QjSBf&jG;S&k_E?Ad$&X8bK zx#gc4Zu>Ya=+>5o%-`!BZXRwHZ|bBs%gz5$_@8MIVx;@cB~MB2FW-_E;19>HquUMu z6M$tGk*mjor-g+Y8c_uu-}+Wo0e&iM8+v62GIDY3c0AkV0z0w^Vd@!PVY37`em?Xd zn!fd3zJQ?buvl!16nL$haz7|3rqTc!TcT^IqlyA_u*z%gVWl5q7$TGljo>@$QX5-6 z?69ll)3K*?*ixpJZ-l}s^p*owR0NI+d_n6t_U*)%)WH_y{k`_Y$2r#=Y57qqD-}gr z`{K$DL1IaHq^eY6T>wBeCdey6RjPPy-_A$O%erPQ4ZyF%9zsRI&j1svW&#{{-jpYZxN^CYpe zzf~>NY8{P5L{8*iD>4X+bCFagROl;UWU9i+v8Bk1Kk2 z#J_MEFZ5=(N|)R7tPljh#zt_0h1%w2ffd_HVYr9M1~C>`Dh4s(K|l0r&hn{^3v>-h zbLToO3VZGyDj3pwP=8xQ@&OE-~?J#u3io^rz?Pblj?@PGsZ6KrqgNDE6@ZqrXJ3o?9A4$gq{y*aYm5#pw> zp+0uoaG`$o=BRne?%0|JhAxzG!m|Z|xfv==m5A22AwKFa5Rsofn!!}xZT_YsISvvQ zy;l85v+C_MkdP;G8;;O&D-5Sfw}hFsV56iERSZJbS^frRDn>ELT2s?>)&9Pi$(W&# z)SBvHtEJdnLqU|G25+N)`Y`l+v}ou&Y|Fq^Oj9=zk2!DV4>RNF zRMY2zF6RJDilQ?Gfro=ce*lz8v`L&{0hVu~KvoFb`GdG2k?od+8H(LyRCwsTp0g48 zwTL`Xd^l4EK8;njIgT8XzkqbJ!*ya(n>ytrv5eZatfOD=B8K3)gahz|$Jk7z#}GTg z7mRmk&FDcOsebF4b*5XjpIkR6j{AlA(^B_QF1{@OklI*ek15_lab?t~v769ZoIfr+ zZQ}XSm*sSu3qbSQxSy~F&AXja_E^H_st}d0_S`y0VB(st8!56|%^3>=;RIDnpMRQ!FDqSapt2t@{L zQtoqVzzD8`*NATM1@$hh&B75J4q0`2vuufz2)xUhvmjoKTa|zdk6Fv%zzc0kw&BSJEV_cOodZmCbctyWrMZ`>i#M1C4!SLpF4y9r zcNqDx$KBF%VIvm=liJ+Z)Qom{4yA1lx#x5CgO}C$IYUD{8OT>! z7R1}vX!+oNTr+%jiQ~?ZjCdPYWWKJ-K6~sEVREs{WDulDRU|?J4$hzSLFB2B7veBK zG$Q9RN9leZgsTp}gz zhKhxExOzk|M0*l3n<~8KcRE8L$G=!`&g{qm+VvD>A#P);f+=o9TIK|%qW3z} zTmWMiQMO4T@`06uFzSojtShj&aZTYl|B92oKMm{1gYBxz)+2Y)o-*RSv#CBEPlZ}j z%;(XO2VwAyKCC)UN60xBdCL$!;}BEecpJar!zDU-Rqlh?#f?MTxMS-&-GWM||B9@; zF+#=nqr^zJ7`n}^)5QaJlc+k>BLaL>J4Jhc0azzt=n z5nLsFVE;|T?ysw@8mcSFx2c<}$-PElNP}(J$!!6pgF}?C8DC)o=*9a<*^w9(Ek!>n zu?@9F1m@fp6oqpXHGecm$1p?ou3ZB$TahDuxL&+<5wh}?EYq2>hgF(q%qnn)FPVM!QR8l7I1E7^wYm6%wZYfR zKMu5KD%)6DepgNb2HGAAEFf1ygC}OP|EU9l;j!I=C9n9&ZFetmAY%{%6a_v41l6c0 ze&7rGs~}u-484}-uup&#JX@lQyHNxg9xS&t^)RB{UF!V6Oa7GH~C7){pf*CXzA5m9~3R-|S+DywRB zOurmF;;b49sSnmiwQ`%cti)_bN1&<>9tz=(cUetN4LMoVJ{+p&8{&!6BvUrT=K+kC zb;tk}>&L%B#^H1%pGbmArSkEFO}LK`{tJ^T-&g7Gn&Y9?dg||IJg;bpxN761_06v7 z$pYDRrJ5NuYTD{O@*VqL8jA|5YC|uP!Y=)oZ1VrG~Nv$gm2$R#40>UOoQ_k_|0(98-TJJd}0k)!~xDh*#QM=<1iT5_5|b*JjTG2(qpz0EBc|&829StqG|xO5-m82i)??az-QDF(aNq~E zs4zNf@_p^PKjhW+mjw)}h?S$a#?q>;J9zR4JB1(e$M)KAy)B$xZuI%O9r(g=ud$J? zdk`MhNW8ZMi#1`)D=6~L=Kn4MPhIC*?VJ7T>-&p%U8qwpHCmXNL_u=6Aloqf6Xw^u zS>EqW+JF|%%!a8Zc&sIlXed5;p~)NuCuZjyVr?eDc*NBwzQACi%`v~f>i1;sYV^du zaZDt~ZzPjiBe8EY&$;8wI_7Uz{`|2?%BNnP6E0udKiah$5LR<~*iIhT>Z)3Z&tOJ= zAdZCM>~}jb-jleqn7G*V$@|p3Nv7K)L+~|mQEyeC_l}9#V*CpDk{se;O)D>3N((Y{ zfay-9rC?5p;`R@hfVMe8Jd~Zx%HwcH8{^%ZyN53Y(%u1^KzV(Wf#py^WR9Y5ozSch zHE?cMP8KIaRW6#wiCViv(3+#=A}PN&#!w7=wDF*xIIp=ZI1ReHyL+GZA+0SMPKNn4RQn-hSuwxZ2r3neC2pPnL6d>xkjII?73i*MSK%e)DQ#XRqokr+G z`o6a7>!@=eju{(&Bb1}s(IY2kTGdb>q4z-n2vjmn<$AR(&=YgZn*`t9;Cy z#Fl_(F}|#<`LJP%TnQD*nf+mJLPrX7LMoW?(ABw|j9}3Popx>D zUi75xb@KHzln)4z(C1ZOtmC9`g%@VdN)bh_6eo15r^ryL6%6!yXhyax-o8-Idzn zM<;4{39Ta!p+ZK@#vrXU1zbVlmZ*LoE1Hdd!#2ZbWN^FedDyA$PlCub2-FwJip4LW zT2!ZYQ>E?Iq(Gsln$9^0`U#dYc)5v%=}LPWl9IE^4bk!xRShea{mZ%-G$H``3IZwc zC5mc-hm*GwL%!Zkx{esHDp-)Lp<8lLWa*;+Miu;eEeHZhXbV+CHnE~>5d+VV+m`+7 zf_h=2cWhCH7DN4eEa{ll>#Vl&nfn+NW8y$o5DRg&mR~UHi}w9E2#u1vp)QF#W!(Db zs*qQDm%ff)81#u{NqjpKJWxrvhLjz%y)cg(05w1wGWJ^R{nUZSRy}YDNCmik;hrJ7 z-tBIlx4`yonp4r{jGI|;iq+sEc9HHQb6Ds_=oCRKE<~Yw3~I(#!^~UgAMJ^dZThT- zYj;PV0<~7HBBI%l#TsTnv$}4fC6edz=?O1`b(^dsZbP*cAI4VM4bCJWklo>px9^5i zf|CSuS|~iqWGGer>Y_xeqNG1s`gfa6GhxIHJGW*Hvs|vGvH_!iXz|#Nw}~1t!9jJW zRpBZjw1oQjs`0umwTlruHYD{@iJ&XJud4bZBbC$}nDj7)^4gU=dRg0QezO$pnmq$q zPWG~ELWxGB{U(;~i(FXI9py7b0%LPf?;lfiu-vM8b8}?g)~hfeiZU65B#e>70TUGaA9;-`;E!PY!o(6?zTatd(X9Yt*`w~x9=@hF zULvsN7^OmhOYD5Z1GnNVn9N(6Uy;(;!`iYpUD9@+v@pdpwKVl%q*96EkDtN+p59k0 z;-BDVFWNr1r-o)wy#s)oNnSb#s~y93(!_nT*Y^$>5mVwrf$^m^e~Uz-O-)E=dr)pq zGAMkOHjx$$Po&g3t>Fvuan9 z5ajD+%frxe^j5-CQNG8Vk~RM{6~f1sbi`bzqSROzsCACIkfA7sR2O6+)q8TkTBtqY z9;A3CTbnYTJQc4-Qg%R(>@iaxG{ZlXa7c&2rDe;sdGcYj?rrV&@-&PF2`EmZL%!+) z-G?~^O>bbm-RmA~4nhQWO1Q3($@Qe6puUXLp|605#XDeWATQTH_Wg79zKp-?=M-6s zaOh$89HF&&VK!`1@8~o+mztULj$muB#9;;Ch*$Y}@!{jM3V5@?^p6DEvB-a5q~8Yw z$R?5hcooj8#|a(an-#Ml2YzW_!e!bwh0=+K4| zr(iL+Q$xUFe1&activ;?B%)hqp{hmCN;=OhXO9XUAJKr%7lZqdAb%NNNyum>l(StM z-(fdT2y2}0y$N(^lRcr7g7vNVI@@S4rBlUtZElyUPRQYOP+V4naL~rZzvy#9&gTG1 zX}ygELodPBU~_`eOw%h2@p1ljOzd~})_KtG;H*79`6xLG5J4+Es?}LA3yw$T;zdA_ zHJ=rxXw`*ZkyTM7d>+@=4azr3Lov2V(M*J8+{6U#@XVsaHIZF$~wse{l z5$D6>7o6B6#NG_rQKfKU2U)H=8?TEtOP%n#v?j~HzZf~-%EF1!6_-C$IGpjDfSabf zfIEYiy+ox$lGH8^Q>weW(>d!W(NjRYgSM!5vz48-tVBz6R&=0H^-^0<$*{SvbpC^Z zL?)s3cgF8sbdE=H!R2N0>e+z!WIJc|<;cFI-~(>kC3)0@3IRUN$L;CGzNR?NvzxC* zG8M2=AJCMO}{V!9;C8LRWfF#Vz&$6`?| znQT&)-RE?3i#m|~c6amZSM!QWF~(z_kl83sRj4iqXFpkL?{e@F^BY$;dU5Z;&PT1*x|hj)_wXhXqdF>QZIdsdHUc=AkljhX#*& z;XVfFwlBBX5ieXmRl&=GEfE1eR|un)vxyV)02LoMG2)n)38^~pt&I<6 zDpQ*(LKCAeRh&O=Ob~+iE50!-g_P7>2tU--p+hv=+{T~YC2JHN0REB@oju7cszzjn zV$4Jr=OZ5IU{g8%Jwb(+%KRgFz9QK!C3dZ2X&7*L1w+_gdC?_Dn8p+2n*g;SmyQSoX*@MvIQ3Sx7f~OVi^IS8VfXor z#?4GdylnSg$F3>(AfF2YG%LwY9Pyi-K2bwg;_(I$P^P)3;b%( z_3G5Qi3y*}3!Z)ck$8+(h-{m@;Te1&M1ENHZ}80_kgj~mXFIAaZ&oLhZz7G@cZJr(U|t>;+FNQAEM6#Gs`uU*N9p71 zd0|CM@S>8rI8ynfVfK@>>6&=y&BYk9S-Ka6a`js5$gf&8hvhKzRE?c`e#PJc~@XWnXk+yy3B#F%cZjtF?{6K)m14T^7Y7%L0!9j>-JOP-tDf7HGDG<2z6MWQ^` z2|j)#m{>=RM0U0A|Gh)oB(>pvF$3az8WxIAFLCHP^N|?dqX-((x=wUAFz4BIM;pu& ze-L9&V?Rr^3T?ZjC^xEacmJ5%)lGbZS-NZwmj=ICA>Uw}IAFeB-(3oub!nn84tK5n zP?Qg6eAW03EqaX?vU=y;=#nLcQZDzKm5n#@ynAe`<^KGtUVbYiDJQx+L9kYe19U7k zwOvf_`Y@=YqFVF<$H%S(jbf_ujM7`hH-pcsbdhu@cE**Bh1C3O8KRNDSX8}J$>!gA zA!wPw5`1VBFvb+psN$S#Feu!(hY8b3YF~kKG5*Rz20h(vBaORVM^&;qWLJCoPLlDs zpS0iy#QrOdhO2-LrIXh9LhD6{;?VaeRy#vQVp^|?K4I6*1kRq=6}i{4xaX9$01 z(CbygI@ya)7@-sqD7#ZEn0$8FDcFq!)#os5FZhJjTl9*c-=5tVE3AlA__+^aHz^+% zwT7_BspU^udt4xnvkc4_(KXA)zb80rjOAKq-VfP1miE>bBY7Q``YWNh@-VvPOCxWr!W|Jo!CQ+9TW55HV(zFGd)pq- zIdxzW4$tpzNd@shD7=$Ye;6ETX3;B88n0*40qI`x|3mTHDhVNvx0Gx{DxPHAg5$lG z=voU`v#@H=LY^sO!$A;0K5q;)l>H@B-3E*O)sC1@UyC@p3r#g=AT{I(yd_6Pim6Mk z6BY-jO5_K-1+$$wmaoEuC}kDt2L5uKb}AodnQ3ac22)Uhon;G=^l5&SA5%!1-GQw6 zWpUggaq(q;@A_=RFa0H7Q#iGvtv;R{S(Q!zMLIb9NHd)Y!ujZ|x~6kk>MQt=5sfuP zr>?3&skLnGF$+3t)J-f-%D4P&9BGlfg@g1_d#JT-#W$95-Xk*`;4^#{c}L~=D+eDv z=^9apqiqTBC&x*n9ET407^CD!qF-dYP^;-|j|LiS$R-P_~!)Dw|nQZwKd=vH}O|( zD4xXA6tXiXuo@f_P(7-o66Hz<$!#+%C}EH$+fKufSr!auqAMxGH{ast#Y zsRi3=GT9VNaEYrOp#8P#-rQN4DFag1V|@Gj_M1 z7(o?Wl*%jAO~s%1^mQTseJ{V`{ahcqoXzMxrwSyCD2?j+1sU0nM_dvJ14?pQEAJII z9_!i#oG)`o#W_Xz$;Q%G@%kzzF^v=9bnZHsArkE5nY!7jC8fL98S!?y)cQyp1@K1Y zzOp76U*L90P1Bn`M{kI&;W*|rDC84~h$|S#Z#((V^f5XvXg6-9^t@MWmf5$z`*7!c z2ejyKKk=s_#PUq{UPij#mZDMs)EWVRKjke-o#)akFM4j7f1uVZ$1!odN8-PL*7qdY zV(9Xw^{ZQ!n9UOKSgyX-7aH2wk)^*{W^Ub%tGVsew38COVm>w<6Ep;&jR4m3^QzX3bXUa*r5t^xjlK+jK;t;r$%)agqQ#j$DE5DiPf zSxwM2?@j8^YL961nhE2FKBP6zkQhnHk)2AuYzH!CRMXl16pPF^k{eQ!2&5wdOuNDk zOS_<5mCyq$Y-(LJ4oZu-HZgW(!mNiP-Pt0Ud}_){bwr;J0vdXRdA)Oi?8&8p;#SUY zarbjQs(DU%y=ec~`_I(CGX9SIEF~{y2LLaxKZW*q0qxq}kgJf7P4dv3<9U!UZ|Gwo zMkhbq$}P9;(GoI@-=z8t1QVxO$WKaX0>AxpyZS*OIW>WP%d3G1uflkfwVjNzGy@W< z&3cK2eL9!40XZQQ725*a5YZjSuFnLnbHv(5^Z~LYs=XC zH?_@R>_5vpJy5*Cj-i;r#`BLM!Rfn&HpE!PY&%4fULsl5hw0qiMwff-im$N{C6=+0f}bz zhv_$K?}xc`+>)>H!0h^rkBXW2JU8*(#W7UWOmigecRFW)vKzjx6gr+i6y zeGXE5spB4#cA|Cv0*UF5Nobi_{-$I82i_jr-@=bso?;THf8}s{BpF$rU_Mv?u?s&l zwOK+lF|+)mYynLNXz&Q@K@SK`_*wdA%YU8A?I~33cd(Jar-xyG3Zr{WluFG4Xvzi% zYNLKkx%Ze&4vPXEZrV}rjHAKU&1jQma6^s7JqHt1QN zpdcR+b^n2S0!RZ$&Bn_3$O!`=o&r#20&v0zh%|gE0^m;oc>{kzo-hEgA^$4>YW*MZ z@;BwnFJAsOhyUaS5dViy%>V$qWCB21GP1Be^$8&L9wVUtEuk3z5C2%QfMx=u%LBA~ z?2*UxuKy^~|D)x9z{E4R>45kBch5g5S#~&(*RXr89qupIk&`biP_la-=DJHD6b+c- z7RY&*)ALqg6(ATFHKSoAuTYuAKl`W;`BP9UD*2@sV`s95>bFrhznu7LD-RNDFfBie zsYbSq{H`l!Z7Ygh+5ipP2!4`2KafhP14_-_J5w|)X$y2Dp1QLLId&t?zH>n8!VuS_ z7|eJIDvg?Dp?v#$Lujf0($qWX6N*8zd+M|k2xdaDKYINGI_p`X9tp#K3=hqo z@k#1KK-2?HP!5$}sg2H`u5Qz+46lTfrS$L25*7=dJSbxkwP#9nzNn0Ul}d>vaj6Uh z<7h8b5>JyFH0Odv3EX#t!Zk#1o9|XWb4@&xaMO$0R$j-cl2vQJy@*X$b}g|BnguCc z^`lE}sd3wTpFwNEZJK%>ThM4k-Il`-$;}Ru>shRcdhU58FmU!hTCO)2^B9;$zW?L* z{ka>$-_p}?_47gdKE_daNXwx^uKQl=z(nGrr zq^I#oxn}O_8Pl+y$j$W)Ug4JCFxtRVvI#e9?)OP^?7TiX5 zit=zPhzCbIVTQ`WLxi7wP|_TkGkC=+Yc;1`nECHJfoy!kxcw7zfPk)N3FGhHT~d9mfIU6{1F1fD7#OJU zW7cABH1_OWaYqe#Emtc#H45~s7uo@SeR=|=G&J?-H$p>`>-)WxZAlho`nSR956q24 zD^)ikN|LqfU~Ht=Mt|h&nUnV4zv3>*O1)2LZh|A)3iH6gDdC1?GLSTTcXJ3FLZe() zY42ab8uE*gcE=9mOGB#-Gqt0XbzHb;eeXM8^2^2RuXur zBjn4E_ytHYXv2y(qjB=t^BbB6B8pqN(VQ4{wuaf`L$!11UHq7nL&-l7D>0XIcjV^Y!09%vzCsRsie-q04({+9)BzS0@FAYO9DuXdZb? zc)YrwMLY17-=QKdtM33`R;;#|FWV#j&evSJyGHT{tTcH0zC-Z-5lf zj?&~_YdLka2qqI>GpX+}XkAK*4|b5U?3)gJW7V5jvg!L)pFdntx03WW**c;7u>Hsf z$Gnd#2c@{gnBYD2$Lb6LnvF6o<@BnrDNa*tAB^3lKbQnSjfyx$mX!t#B`1BuMl#TS?k7s0 zP=gJ*nNB@6^DtnZKp76DI_{an_W>ek-3!bOH2$V0QsAK}Bm3F+nLk8+=+ZLnA8(GY3~_T19ImD>DOYLnA<_Ctzjs6ioVj zkcEF6SpT2X^bAjU0PIihH}njE=u&zH08Sh|h&^BsS#ZvTAlzgGKmN%-rUN9t$I z@AZ%8|K2r!_0iu7zwYt8Bj5@CSHKhgCt|>v0qf+S5&Vys>Ay;kf#A&ak9hvf^uO@< zndu*+!5@J${?Q5$v;9avA~Zb4X#cAH6&wE;fBmcOF+84`;pwgnzp?}{GYCD^{)#bw zjKT)AdIDW|jJp1L?XO?^zwO8j*pC68<~P`dzdr*r%YOwj;MbMRtiRsYubThUM`rea z3mWi?BWAv*_sRDQM1z^{myG;s@o$gJd`}X`_ed{1gNKlY9*Oe~OO&Nj@S3Fg>ogev*$l5ddhPzsSd&2v2EUex7{<5McTR zC-6AP0OaG$_;eO9(g5V+4(uoSh?wvMR`Zj5ggyYwU%$>iVi-J48b8lI!X!L-^Zg_r zF%6ji;tDV(0pwp?0R|_4e4JB$Hh#S8^ap~&=< z!`Tv~mTCU$$-`~wc$B0)nY75D+3B0bF8D7J#u0y5s4=ttd&LXG-|+4M@=L=)2k2fv zcmDeO7pW+o(p5aC1Aq6;cMRjO0;LC}kx1c3f7M!Xe+lJ{vUpn!Q?J_pA}O-ig-GvU z6erWwhDnEx@uM>R6-2ZEC(M}ZQPB8D2gQR5vJtyBuq-jxx0ds-=^t{9dxIJjja|0< z=L^y9A_g}k6u=B9wLvB0X5<_N~Yk6rgDkk5Ev*58pbjAA5;cG+MBH?{p( zmVqDA&a+0gyxbnfAbNX3Xcx&wOZkI32nJ@op`%nQ*z8j*jDxa`j&J$rMQ2ecIZC)dd}^|s}~0>_Uiy_aS*e74f-0UznZS~Pr*h8;-|+sGXBWicWr zrV@Jdwnn^&cwUb}k%*PPL5c1_Ze6-*4keZHJN)iQM^Bh6(n}?Lgfoq!$&i5J0W1?6 zu-=myeGq9Gvl-9InN8}45IxxfN0xnJxGOs9`T>jY!mc9SyGuH~k5>zs-*>Vn3pPaV z8bsWR>o8;=c>kpvfsYfasBl010;F|qaWq1TT{6}7a@d!s7p_)8JL4aX2NZ+Hr<=x- zcO%1IV23Nt)nL6b3$BqS+d=#&1#K)?N?{E%YlW+&1{$N~-T1*HX$yP`IRGlT3vwzV zdAjOGYA!;oquIr^rCrVG{(?po*(>KhQ^})oCWnr635g=h0M6g%@C{>Bn?v$ZR#wP1 z&%)rl6Zg~I9u5pkq{dk%F|Ns(wmFj0f~63h>x->jGMJK^02Lb9!L1k!I#;Y=tLzMm zp>R?+id&GhosTe1nc5M)Bt7scl-Vcu%~GTeX9XKWWYAD&Y;OfeJk?E$ z7~@-%jSHh%5Jz^;>>w59b|xKfBq{a77IyZ?l)gK@L4OBdv9RlAXzUeCh%1U&--BoP zpskZp1Q}*&g;ZmKE- zYJRXWWN{6kbu>@)e+V_tpS-{RU;ceaBG|q8291E+rarngWD; zNtf7m2##=F_R_nEa3g7b``$~ydnZSzhD>1~w(D{zw+7*&duk;aUL?07s`7Ijm}s4) z%Q2Bn7H!mFzRcL?LA|Xv6+ZmmN~F8aUJhh;7#0mXg7bDRyZDexmP*;<@aVcO7qe~he=*2ANMTsNdf|sMRSqP;k5fxYjjMgHoh~+rjiCa+`Tg=0>NfCtG zve|{DD7vQ6k=yHUeVyDx{BteJEVgD}Z|%g7moa5e12Y|bPEFxYm02WFg~t}VP9gmI z{^|VK##2aZVr_bG?vPwzGunGjW?}qpoqCS-FHN@My7Omi$CUiQ= zNZ~DpPo(ci9e~~9WX0sq7oCvTBL++?fqUh%V+ zQ7?15Fgh7=!M)Fns_Q!7(Q8^M#w+oc+n+nLGVNWj)=oP{5o@}0$0^qG-FG#ZbV6H# zlV%Vrn#SfrpIAH0K2>9OVE=UC-qaQy{NYFC-F-nRFn zRk-QhwRurRh9+JX6OIt&optQGDw1i%(c~iNXax3`>A`676}?iIHcxEAg^(57bZz$) zoSQ=<3f3IAutdx>htrZJ`kp+cJR#A&=1CH;kTJyqLQJ{gOxm$Elggj{-8mL%std!W z-En0TM}-BfdeWOjfy3>~%MF6>iVYQNou7a*-Gh>p;=j8i0Ezk0e)i7LDrJfO&XwHP zqm#tjXbK+MMnmW`uu;+@DqBh68x3Z+k+sVaHg#v)w=0y22gM!6zdFJ-C6qUE&jHs$ntH75 zr8EgOd9d7P-oZU9(&GGqaVW9gg(@c)9ZR5bsA3QC1kF_lsaoQT*6*uB@VGWec|#~f zuK63YG~z2t>^JKLm1>9%f;?~~#A1XFmIGp3oe`ncZtn&?X2!q8pH*imq*-x>Ld&8K zEoSh!-Vf+Aq>V1}HyEA2#CsTUdv|nu1p_ADng6Gi#uGr~Ggcaa%#nZBe|ijYzyb5Y zf(&!#c7w45o+cO`_$Z_F-DxoKuM+A?G`E%MZI6Z|e+i~oL_maX!EgskSGNeYQf@+g zAqpp<%)K~jOg6F|<1Xuxx>G{_QUmfU+r&jQox=yFAIkCBk~m?ZQ&r8lD-x;j%|?w4 zqtedzI_!UhTxENv2L0b8JoX5shim7B1a;GHg$P!KgS(P3%(l5-QlDb`q@O*PpkG1f zm~dpJEKFi;nl5TnwF08c^j| zWDX0Im!-?^Zr)BVknTGG*Dca~{bQ#;Q?bs*^xKBOQAsS4kQKIJit@^ zL4rF3cY@1e;qJj5g1ft0kl-$X;I0Yo?(Ux85L|)D}q>ci(;EjvL0v zqGruil+Ri9{p$aXqpj{97AB2Zc3YPL<>ZSbFm-YC?E?3Czj|}L(0*A-H3Q21H-;5) z?V&{*^GZkKHYyJL@;ai#xv63CjN_>!V)1bC#5Ii&3UjR@I-N~+I^_)cFWqWzF%ep| zAp#*XBt3prDcExmgPUn9c*gJM#gW7x1i10?ovtt2Cc#oPs#{8;`3~ORBRZ8DJ8QqR z2aU5c-nzEYTzRMmZ!GbS3M*KFGFKWS)+*%ghHxm$=!yhkT`c@v<=x?M>9x<#^-?D% zAimgXN-B?4Dj&_QfBuG1H@_#7!y2QI<=7Roi=nsuDo?(xJunu$IZB`TgoU*}#;(q_yqQiEb{JOymx8CC<*qMR&Ype_;LvZuF zxxkpdZGl@KkB5wJLqaTady6sd$&u*S^mJn)gs^}@;@wey zHj#&URUmM?ZJnnp7RfAGiLt-JjFb|SvbY_?%Ncq*j+LA_BU6Ps2_&-@I8`a!gt)xq zL6{(K^zy!H({63!KXJeBU>Mtj| zOU-6|o%Qziw87!Ig0RsVsm|(ns#qtP5%mbCAyZuCZNlD--Qhbs5qdh4L;LZn81^Ol zeQT}t>9gsxtusWyao>|)4$8+3gx{J8e==D+MzTN7gy8nA9Rw=oZtf2+h=j}`@zs&nzc#FTY)Up1Qb;Hnl zc#!!O-2P2DyiV#U{T-o@&1pLEYeM9a5$Pa1|B;S&270JKUsC}aC^3vt?t(L^yb=6K zK$+IIP&v=nhlzG!a_#~f^q5~}=`XAQzsnMU?I*I@GD;!>G%*WZr1-#M$_-Cn1dCLf zeD%U{)Kd?M#{2N;1q3eLN@CBzr&aiakuqF3&v&?#g77`boL!aFml>bq7O7kY;mS29 zUF7|P%_EkJokTGjTv6c2maOhNO2xJ@pKI4h9Ai#oPv;dxsU(P%7+(?HbC^x=W~%k1 zEf%>)&F_qD)F<8ey**bSXO-e6mFeIw``oChy9P7wlC~a zD30{Y!ar_m{6=5;*(JMUSUGgpV|yr-!>gFcL_2=##eCuPuw&nU@|`Wk8>>R%BM=Ny zSr_E_ateMmqbx6CY0GZ~SuNhJhQ7(m7Kf(#Tzml~E$OC@br4GX>f+9N>ONY5=PMQ+$AP=HYfaDT| zYMy-VOl|<~jc>Bu%~28Jw=_&tgk?%vr8V(@|Ig5G)*)@+6IjIW?`w*$f&I z0N*JG%4THN7K_8DGvkQ416{-Fj(&~_tB0BMg6W|~j5g%r9wFdbmr21%EIc^(WM+hQ zZ}C!|hxJrq^QQFNfJ2YoI=S)x-citr;GsW;B!Woo1D30e`FhHMAIV3q)Esk4i>^LAeZ8`W;AN}^5#lfxn$ZU0@3N3TjQ7I`^^`57N(zG<17`#qURalns(7|-^rTnxkQ5K zzvu^Tg&Z!7*#2Rw_k?b~&M_S%FAxcPpsDf8Dl*wUm;0=!f)E|e5RQ(vO!OySKq5rd z<{^?p;#6#L<$k}qJI&D0*Lp#kf)dLkozbVDX23TrI-Au?iQ7dP{%rr1uWgvZIH|Va zP&nw_J|#~;d7t|NW0hvx9UwXni^v4AdmgcUdB;Z;Gw>?@EW{SQ2O9E|d{s#H_;CW_MRR7fL_(Fc|q*AzkSV>%JAcaCky9H=Fy(jz6;V8nqYOr20FxDfoY zAE+zMqZq4EZ9!(6z@Zw@J5Z<@uMq>s{Uw{y-bK#ebz$dW>HYN4?o3!dsTSugJBoN) zQ%ifMa6^_O468SZy$i<`%oJq_cx=+FBa~rnqyh)DmSJZ{AF+|wmt>&~7RjsK7Sou4 zq21jv1o86^wj9?|QkAAC)3%VOng=+IYA1gfnX+V{p>b8_r*=)ntyvrmChDF5?S%b4 zo?1~8WAIb#eknb^h(^dhPP6+1<1@NtCy>%&7LLiw$PbX1Vdg&pMQlW(YcRXpy>nAr zv9P@R>G1^)a@vy73jngPvD7d#O3IzFAeqcIuVAl|7aYNbtlJ{Lb{ z#il2~-=_T;iU4}5jkAv%@-}Lq*s%&ks#gCj`l+KLo4KH~8y?;=|E7gQ(M&eH!!>Cw zOBf*%e*YOy5hml*sV(2!Y=^Fc2>QGz_A`W%AV<#OIwPNVHCv0S(H0nM5&~alCw)c= zHtDLh=D|DTXJ$={HoeA!b>E!s>um)GYV)#@hMeHHN;Rd{d|V0SrAX18Qvo6PW71AT z4Xwop_8V0ytLpM)$|ams0;BAl0^wA9; z^DfPnfOeqz_tc!RGyE1#x5Imhb>$n!+hxpbRYCSt3?$`yTg?_se`a zmPcb)C2z}j6V7iOM5ue0mN^K?_MUT~_GC^FwuR*C^^d?=y$E~fbWqz?p-a$RWc=j= ziD2|d0APU$3cKG5-QgT9kYo$m_(LW2`MVcqtj%d?6aDppYIbg?;>d|KRGQ$D<$EbL z32$k#X3TY9>FFKLv57TM*d02a@0s!=NzrNJq?TF5eY5=LXQ#A}y4l@5Z18f24Xy5cS^XLf2k$pE+o$Fv z()9dO`LhSytb_I%DNFV3Fn!QjGDdi`_^H#KUrUQ#H!u21mwxBvD^B8m2lx6DX)*ah zPc5Q(NxX5rsk(s#qee|iiSD2pBXzi8;ojX~5iDZmK*}3D-sRoa7P?k1Jg;Z*uli1Z z+3LT!vIPJbe%hF|RF;SUZ-fW=n{#*ud+jwciO7!u0zbiK4-OIu8=uROg`x?+EX0wQ z10XS=($o;^0KlX!1JnBi-eA0Nw1Ba_9E~Yf**KZNDN-IPl3fc7tI z+|`9?XV?hX2<`v_O6a*^bn2N|Eb34-s58-wbmU*Tsnp4(a_a;`94x6w%Hqa}6Q`Db zje^c>MttybZ%^0O!TFZgO&n~dU|dfwpU=qPtOZb(&F%zSfvGn3x zM7qQ$y?5SLpR!LRb2*N}DBD2^KQ|ScG8A1|p~+PhhNY6M2%}eOYzQEpqf1#7StO(~`LL)#G&!REGjE0)nq`Q0BYO7AKv7_RDC`}8d5*aKhVeP1_GB|u@=YJ(-~9rkN~xdomj@#)WvZ;3k+ zGEdIK?(6JO*DF{|h~RiNL?V{g@xkVLd52hDSpm0~ckhrJ4p5xewR*Zggf*}hW`9k% z(4unsz|+MO<&l{J9AQ)aGJ)QF*DAD+_A*{l|L zy4VH(l#VJyF^1JhfE1jy&<^P&bBJ;#PN0uV=Gjq=849JhALfS-YHo(#*s5h zWtYBY1I&|>e*xF@dERsFTJ#>@1a~|G#dH1 z5Z1`wvy;WRk~MWhGq7V+VGlELvc#BVR|8xL^*MX(JDr1V6XYV=Q#-3uoHo1=ac)gj zh;L~Y@k=k`!mT({J-z2Di)-7g6XD|SNdT6$^uR4#p49v9jZkAxk-i1aX;*CX z-m6FoofF!2i#4P{7>VVn-N|lSjWV3~^<$r0%r z7hlnZt&OT8iSKCh+C6Lq9-iIaTuq;7cd%S-{Bmyk%>_OX@Dqa%a+75aTJQX^-00~a zxtlrTdiJbmEDwIY?8V?U*o06&T&O~Y^%@>)+gHs{ z>EyKLg<~_YCO4HEUoh-ZaEflVy?0xs)gFZ}4BW-$<7lx<@0yx7zG!z%TfFZcWY027 zD(~)}f^V2Rg_4KrHjty>o4jufMfhNMm~=SjjTWpYAEZJNh0Gp~)<^oPxBaahibj+I z1S5A85W+4#+PU5QR?B+<_L%5Wl!q$nBlA73`>QROb=TJ|;OTvDAQ(sc{GYq#UebJa z&vmPiHReAw?ms>{3(SPjl^k7SLEIXntr6(p~2->Ta;5mZ)boivO4rCxWhDibm?v%%1-{D@#+dgM4QbdBvn%pMQVWA}J` zw*(IO;jL+JJKKcoCH3Be*H0>tJUJVnFE_7#Kj_rx@7)PrgM!XITFA ziYDj_rgruYf+o6lj~SHI{m1W&|KhTX{l7(%vj2m0`B$2h`Kf9_WXc;;0|yg(LUl$^ zK0)PsbXE25QHvkQ#a}-GOw7!5?CdNIkE_Z5{tp1i&Pd0`!t~^A<_EU1 zmh;z?K?`msI`)5fU-@gqBSpy!q+??PJW)YENBv$10IC2w7SNymvpA246dfy&@d>i} zIfX|=mkz+r`s5Mj=O`8cC=)EeC+{#n$Naw$0x*G!56agQz4UJhf~+m9bZkISj(^z< zAb-(}bO2Cm{Ua7cP66pa$kS5?__tJk{06E)b~;dEPngq>i~rM4kkc6kI*^l1&|$1U zlLECm;6JECP+J0-ndlhU7}y?(X<;i67j0@~OvuIcG{6Y|c?E`E$kfQl(9Y0G-w@P+ z|H|?`{{BCu`9Qvd{`X;`Po(O-{e#gP|1a2`mL6p?^Y}Apd)yxF0|#Xf%OBkB@`LM4nuNJsH3sLr;w9 zlR5b*^!Po{`GY_2d~ylK_Jc5eatQ`HTk&Vy6G6)MBQH-5!q|S~<;g)9+mF0FIS705 zTlx4Go*aa+{m9FcgRrMPugAD22Vv|#$kHbVVeC(N`57z)9Yy))>&xHTSpLrfOWA+Z zy2ASN&eGsN)Y_Lor{+{zx|}+AD6*h#YAMiye2%?#gsH!&zV-Dsox$9*!9aT9FSbvs zQ`cpR{no?G)9k%sgJHLO_k-r~2O?Ja=NJdSTwna-l&dfj;3Uldu4E~VkE4%+)p_*P>|C-VCm3?C8fT|u!LxVUG@ zg;Uj1=7XVcmPf;L(kdelOdnMVym?zx*s;PcWrTu^++0!tZ>3whbJ0DmwD2izX7`F> zcI?9{gC5k!E-I9vNl!JB#aZo))8Vd@BOH8hilvK1FPc&ce|5z>?~m9MMRgQ%LFe4v zejV&hvQ%Z=d8rn!ufAWqM^%h7B`%$5BIPqrr}8XXbN3?|^dd9isVVY0S7jAxPc*ZA zwDR`q;~x$`rJt=+9ovkzS~!qxHss`+T|7}Ds~esBPT(O9r(Lx#I+$I1bP&7w+=u|Z zcR+BO9WQ`zekxXVY(e3at>(0j+Ii9RQYahZ;?S#&M6RGs@GkNTv{cF{eI1i7W4a{P z*2VX)ZZq56eH}ceCa`k~e(QMR#?eutUIq+hRB5SN%dQ8Yj6*Dtuj6w8hh&h}`0>GS{2b z0WZnmZtzj#!ZocvZqsge#$)N`~AO>yA8GY^@gq&CL77rR;(}9=Tj8sz2 zwrnqw(1af(o4SS=6j9Y5q|g5FZm}V1)8rRurF*%8$vJs3Uo{cZU3o*mwQM^~6j%m9 zY#IxX!_?aXMf>~qKXK?J5{lb z;Ddgy-xo|keAjo;(vz$}?RbJ6S2>G3O85s`V^;D&*l0DYlQz~p(|u2NGPixBpQNpt z1ZbHnl4P1{Gmk)Q%Nj!BTDV{uA7{6|Zo}^oFKy=Px{%kQfI(s(kfI zzSXYty?4E<^8_oBi9h~jTRlFme#0p9FP_sZK~vni2;8H@3m-IScXy4jPj3^nr*GI= z!x>|UY8XsR$s9^%row^b(5AQfhmkRof9oZbT$uO^U7AUUOOG5XMyw04IMQfE3K|Qm z;PZE{Uc;LC8hRU*6xrZwhJ2wyD8%AaZT9Ym6YdD~C9jYR0#oRgfd}-om@`P|4$-Sn zd1K+j3{9zU#Y&-YzC}EFwusvtc&O;o?%LV9WaCGI^}6$5a}KSH@p)oQpdGstENhWn z2a0^!fPtG7Y~h!2;o%GktMkxcD8XFJB)HVT8@&p?8b;p}3h11oT}Pk@CPWU*oRhvg zBhw1irOGMfXy@$s>rPe+;=XZtUdP0FKB@7Ki$+Jl&#t1FasG3|stQ$neNoP>iPA1Z zD>@E~72#-a%8~1BT8C_CDonP8T8)D!OABrx34kMOu;-Dl=`Stqb?wSL$cZsc@u!_V z{m`nFPN^+X-Y{;YN;30bWZuW>p^B_5yO1xKpE#=#WcdEP(?25!fI5&v6vbog@~)t3vu#^+s{XjQ_K9c z<0m3mR;8hf1)Zmg@oCVqPB?S_3g05-eKTO|NaRGst9cAbFd`^m@ssnzr?+bXF{kHL zTiAQnBl?%*`@{WoxYZY@(LiCwgCFNSW>^yQtdsPWwZ=IM&5dY_XT%| z0D`^ucU()KyoOxH0Km`Ty4Q8z7#Ne7azAf65Uh*!RSRta_Q(%;Oc`^oPTuK>D1Wte z;6GA*KsI1a^3yV2wPy)p&T+)xnzlgH9%&u@A!X%SOn~l6b%Tkc;w7l&kSuu2YV``UU+*wSMxi>DIq;X|6wx<^i3Fy5Fxtf z$-%N&Lhwa+5+UeLjCuWBF0}C-HhJ$XLps_wmyt0ImCF3z*H@zZV5@Ur*JRgMuxU`c z$FaV6g{I8vz1>rEl>pnXm++B!6SYn`arw3l-vm}))uf~5ZSS+fG9$+s=}!U!Fw=T= zy_?Db+zSnounCj^gM}GfzeN6lHj4lucEK*Vd2PWusA{vzLZ*snCOL}D+LzNW@QE<-v-_JUCVGRAJ`*3z${bBO#CMNhEJZ$-a6~gDbAX1?vFnUj z4p`jZX2)$jwnT~nxVhqJ6#AE`88a!6^$0#}mOG9{YUp(o zfxc&%c`llh)O!LOBR!+=5FnF`O6V?Lw`!Z#MBK%Eue<=2Qh-^<$!!#ettm!RDA(zr zmFnAr%C8*5f!r_F8Rm)n0z1HN>Pe=r-`(9baV-Osl1P^ChFnTlOClX#y;7^i`D!kc zF%*Q2e@beQgW)O;0DL)lVOJbzK|ay7{vGL(^X6f@ull|Sq_d~oZLIstLG+tuVOHj! z+^je%ij{1zJw8EN-a!m^x=xsUUj1@c3(r2{MVaCD5~*DBJyS3>AJu2_k&ybJAoBN{ zXth^};YHvu1CZH-ofheyr(9@>S$$;!u>bOy?J<=*H}p41P3 zGliJtu^HG+Xv9KLbg`g9h$>XmXM@k9mLO|o2@rGCdkHO#gA}8i9GQg+Iayrv!@CY1R-|z5IS9;7ny;1-2#MP z{V8lBjMV200nrc+Q3RJn)n%>g~-BBW3U; z2vJ=ul&C8+qE<+bY^~{2FCT8t7Cn1PSN4!7KD*NU++7^%dcN+}{sic-M4p?P`1oq1 zJByFgW?GhVCaw}_BEPP<7e#rcF+urJ*ADIMU|XGU8V&nGxs*Mx5#S*u z-?N^F&oeKX-1>bF4Tkr-4sh+-jWDu%LUs1IbhX%ta5cs8%tZ=AmFvk)ne zEj=}faxSL-e1TFu5dnXEc&s7GF%oSxzo%x|-~v{wvy$v{>Ip&JZa%YH-oYF6_Oir_ zjn_jtAJJH)NEB1^A?2q&lAv}N=56h(1f@prAQ9!55?Enit#H9!?dX0isnFVnNaEn4 zyaiKs5xDf3A6AcP*&|hjepVd9Qas;5wit=lxaH=3<3Y<00rMrH*$mCqac}+9!Q2j8 z7_G^Ie(HF3WK7S2?*RJ{JzdYUk$F(H~qX{4xit&uY)#cf8yAp#jHR| z;zAc35cFdZBb}~uP!%=@t?)Vb!L7b~U9Ypchzoo(V_3RK+Z}>~N@dlm5f^A0&-+$tLPGSA~6!dj& zlXKjLIc(fXDc$F~!Q5EkX-*&C3RCVim6q_U%28!^jjS_}o@c2-pYM4FUJOv8CC_lu znSMyoY{Wrr)Mi=kHFhSBm};hiOe<9lWcw)hB_lV&+bGAMlli33<4kK)Rp+Q!BRoS;pF1OVhdzF^Yr0>i}Lo@qZAXHxLjB~;UGb!hq&!tn;qjA*S zGGmWe(O#m zOfiuRE$v_lqw>o8bEizL?t9_R3Wn2Tmby}D{-l9C24O03?3W(_nV=)SIBtRce`fu~4LD^{c_zSJVQ|Cu$Qo*L|U5tRty;pJMBC3|3Q7GNNnRJ&i;xNGnSGd5u@6o{uB<^rJerF>* z>mOm=%w?)RrO@@lO*`%k?HU?q2g571t$;~>LI@!_-&mY~33@S}G#hGHdL(b79lnEm z0}D~yX|9co{=%%bHfaV|A=~+;KY~93K6GyKVa2C^4|Z5DC-vULW6j}vy0yk?S)1A? zeOz|PvC>nYv0K|r%-DU?x>B+EMz^8-8_a5(jGB-z{cZp~78XylQ*rI;2NW{u=W)O_ zd%p-NMtI>V2aN&6(OrFSa6 z*~=#S^tgSGi)YEBl0)EmRc$t&aTpiY2WkPvTQF10U+yLkh^1u)qC-CE=`?8^e)2B1))m zc|C*aR2Q1?M-}W?O!Ve{WLgS)a~KyV2oL;z=o*Iy-F&c^0iwX8Q&K~yEVVFjAl2^N zejj6%BWWr_xNKS`u3&!nq^XXS6Eqd_Hop5Szuxm3*jUOcld-!#u}hc1Ea=krSr)z( z!L*n*v{nNsDno0{BqWaWA^f82E#}(@Z^WHxrg4h#V69rW=8@55{K;X=KMl`GvyZLF zqoK^qr<;Xs@e%l|)Q#mMt1N{zVfD|aL}b^F!ZHygl!#jQLLi=W&fH;-epPfiU0Lyr zb@8X&P#3C}HN~aH6Ni<-($UXjiU@(h?-9ZcD^$TqeT2w*phCl zX^^oO4JxCW_(wG52ep3v>5rbA_g=f!y}d`C?$0`<(+GaqB)_>C|1W;e9Am_+mKfmt zAA!}37obNoE}CY}#aE1q)ODHn2RSmtS8Txngvpx0VkxH3kugxP`QypBLZOKjKAeGypE#y7M7-S+^HOnP`F9TK8_y_+MPyn@7>)kB7S~ zgXOFB=!;^3tGeV5y(?fsv(63DOI(6(k5_x~R+<2bMm}~OhO(7;jYfh78=2DmiRYU-jirdt+T6Z^wvkA!*r#Dp3?3scK!BTw#*tSGZt}hV)IItl<5~Gy$-%xC+Fv;hv#6WvLe6ISo~A8>o@i+|6NJ{ zJlA#N>d(tJcyUDF2Nn15(d31XupgcJhH|J&mZM$}rLR@T8tH<#fU_z)LoJM+8*Qau zk~->SIWeStiIuYNfGDRa`Uk1Km#n~RYK}M?V22Q|etvtUjFKNQ3G=xUx?itbue`f! zrJ!NDwylG%o)?{Mnehce*JWMl=Z><62MWf_7%!vNb$kB{)ppzcO_k9z6>D)w{$EKz z|B3DVMoED`%Sk>W^SJz=)7%~~nr(hUccVc5sP6Uq`3!Sh7hHokE>Zi)tJq19e$7LXpRye0JCvX^I+-7qS0ECK21QylQa0M;R%vP{=EeR(@*n?V-!CO7yu6J z5Y%bQIx14T?qw*sa~@jbq$n*A-+m_aBb|T+5DO}rXd;;T%VG(*mW@NYg{5dJE`^H= zVgZE>H8~g_1sDarxXD z8&{KnUGIoWpIufsj0DqYfi`hI6p#c^^D_cTWhIEzY)`9@oe~4lF7+M57O>Z2x2_Fs&3)fOc5n= z+c@(?Ha*}ghLnF4-`B?PD-1L%eGPvxg5YD*gCPIMXvn(2AEVCwZ=Sg)lf^&3yl1-U z%cAdBbr|5@e14fJxdgLJ9@i8a*Z=m}ZPO*;JMH6j{ZqRw%IlZtaME5tp5xs6eP9I_@5LX03s1VeSnFL>3_l+{uMI=g7$O%*MWmTz~5;* z0vR855&xQ--}xQ*q?Y+RcmD6V2V~0sOPPQm6~I4B2xR`dn)t8e6v*;JH}t>qt$)22 z$of}p$$yRgRTu~Yy8i2}^{bTryVrpH|4|Nr{6Dl)|1NEyz>n5=ybCDsAL(`eZ5o1X z|A89j6S4M4xIGRj5SRP|lzSWlpx_Tu?y=K@f{%02)6JmX{0K4s2!gr~;7@bxQ!J?e zfPz10xyMcf3jRR%9(w{P_=DYhY*JA02fX*#UZCI)dhfCFK*4|J3RGjD;6HN(sv1!6 zpSc3n4Ji1}TnRqLKE1ff|AgtW0Dg1R{{JlfM-Vs;%vX@7LV3EdM z^eb;68|@_pR0M*7hgOaR`Nl$HjanblSJ2NzH!Wo4jgDZC!$3gBNROWGPd1L^x4W*g^n?WC9r$BOdiS6yQVhxPgJN7W`x9r^1{Ckx92py99SI4`HCbU>jXlg5UkDrulq8PqT4YXJUNUv6`$w(tQ6Q zAfV{mHPwJYr*TD*JpU9^V`6m6OpssF(xFqfP=T^y2MJ>Lko^qPTCuU#op%e}NASC& z8p=%KtBfuv+K^mbimh2F1xSzauI>&vDFM#_u6PP^rLa@%d6UNMk z5}^dchZCMtChI{Xo2JD4%<{lBlF|ac#nlQ)H0ZNADH7BOEjmbeoPne@$^-i$)p^$Q zh7Rm5gL7zdWHw@HIT1OkQbj>t%RItQ)e*SYF80{W{($6S#Qv9nD#}yTTjf*4x0pwn zEuMAyh2-+D%Mv?7B6mN)ZcGX`_$=h9=Ua#8qJ)L(S(baE5mdq*U z01M@*$(AFQ%y+qgxy{-kH&sSb@~K*3-;psZhe8K+DkD^&BG5b1spgDi?ShDBRx++_er~Io^5PIo`n*5Cq`=VtD{MA@h3!74-i3*Ma(IlV1~oTYNNDA^&Nt zy7YLkY>T!S+!+~hQMPpfQ>BcGrF!?ySEt((II@;3^d5 zLN=Pt3fZl92VHRy0ULgq@*t#3Qg;S!#a>Kz z*x(Z<6v;IXwe^?Rz=VoHadv`@bjrW)6E-sBcMgTDd_;G?XqgzQ=|rpWq`t9VX(DLF zM0MM>xbXH$W8i#IG2YY5b=FGZ(VX+}S!^kw#GAL%y*+LwlSiE@JGX{f1-rsLY=)%K zS0O_)Ok}OjQbpo;M?Y-RdIk>`aW^{+oPAGaCN^$=0;)%n3i4G|$cU3D)k6D?(D&L8 zX}!F!KM;1a@Bx=r;EyhP=pBs2K$@%TGm7ZT-?rZ#k(qsp=||3iS2AadLKigGKQha7Lfu#W($qq73XGr4?Fu~annpA)T7(p@v@BY}wIdM4!dPNJ2%mdXX`?C)Zpo8yG(RrJOjh;J9Hs^%JT5c$6AC z=FKtO+Jlf%fwFtpLW9Eadi(JdYl#cipO~`xsXTb(hk!beNpF%Ci zzo{fA>H{2U$Io7B6Zt7ls&!CIo}L}X7RiclXam%vUM)});>ETM;N(b^*I*uFXuk;+ z{4zh~^qSfK@*7Q%@zLBOgWiOeWC}&acJ(YCRW~D10$1h;Pi7*~0dZ(Pn&O7J1mp+5 z2=o`_fhEP#WglVk5K=y?HzR#k+x1Xl7{O8J_EI_|P+B3MyP*PpDmb2-I6{-dWwQ=} z<@jW2_{st1D{%rD8D4m2#((xeg>v zEyXOv`LP7wV=R6Pv&MBFl#aZ;j}v_Ec$s9N;8TJ}o1rftF$Q|Bf9!T4_U%fvby|C6 z876NqFlQK+j3?oRau6c2>)k%PqU5XK*dEChzWEk+INi?}w>7eqx;-?UT;e{stGB7JEAt4rb~U7n~%wrS@rR zvSHZ3dp)slH<~bKTQV>hl06AD;c}cEPVpJr)2FF_=QnY>6$!d3x#z?3|3>r?)$_vb zHJYf;s`~B5gQLeF@BHz7oYZx@dqw_hk)q;go#`M2wXaZ?0Fm01a6E#g%t;x<4-*y@ z;GGGPoB^+2oyhNh^qzk%ke=NRt$;Nkr&cmt;ZAp``)!Nu(oebOM}Ls^KwFkwjW-FldYRIpREa`?JuL-)RXtO%`79G!3M zS!gP30xciZ{YodTY_fniY=73o%0nk7AcYd&Btf^#^$%1vVPj4qGVyZIQ)O&-%{7M! zq{%>IB^gf`7$$^T;$s+=gfJT}HULA7ZLCkJA8*=@4YMk%)mQIa&ZuVAC}5ZgV&GQS zrOJ)oayD3T5L}+UgVuUcIoo_yTbeCRINx`4&9O)CVy}BpT)M`;1A8tK85RJV&TnjU zL&huGF&t`5D2T&6di78`(nv&xL{F&*F8Z*m2jN8YfO=R=Si=UA1$Sc+k_05GNSq_|d@Jj<9y$<*-A`uEM zeziq!06j#BK)PX>8dhZo+ziCUd&4Vx-pVx45az|~pH370TJ+0PM9Ty2=C!u>;i$7jjw7>TBj`vo&>C8#LA za2`p&(M1~(1V#}nzhwLVHkEkBLy#JgAKz4en5+hwra+%Iz9Ky@9kdaV#1`J#EFw50bu!Z z=xQs{LgXv9wnegT9YJhG8X~g!G33^-*s8)Mt6pcsVmq6Tt{wRmrF|NaFdTp_%qe$@ z5JA^X@)<&!Q%}8FEG=m3%Xv3`Ma7S*Yx$NZz`g7wC@X#Z2uvm>_QG$*_yF8!;;qWa zMr~Gi7*NtWO##oBQFvwfE~Ue^zGK`iq?W)F;+U%d1!xBQW-?QC?hNgO)#P}}d7wq7 zab+46U$8V{8Xq!ywMI)JjJ0q^(MepA!-x^is}TQ)T<)e6Vl$Uns-Ys@QeOST!im9_ z;>F=~>u||L>`q?6yZ3I8B3vC0fpLsmbNY!p{1KXUo=*zFc_Dk1ZuBI0bnlIAkuQUZa(g7 zvbY(N2#P5S>H8&DlSD-hZG9Wv-97G85262DFHP;@fFR3uQUSNEI|9ck;-Z-sK)6P! z0j4Be5e7clr<(>-c&?QczLr?r5!G;0n#K?jRLzY2VWR2t>TA*%zLZ|;GWb)>ZP;_= z6eo9GVc z$0}Qn>^L+&j{A9hAvLrY+KVPuP*PjI&{7{K5HA~u*Iz#%rhH(7rEH%ar=}%z2RZN7 ziRCb&==F8u)mPjT&1x6o=c%ERT9@35a*kq=k}y^%KS8GA&oU~E#;-jLYKws)_&)A= zy!?{IGGx8rtfj&8iYFz?cxfqK62Mh(2VFBU&vF==xHEn!Q}%k{vsWMq*t$Rrjg*a> z=wNvb%`0<oT72H#jU} zq`Tl;FWpz$UXh_l)7inC01wn9$0FGTJN(TIzWbPke?xg53XCrP*!)={Ji}9d@;Hxk z4)bM~^fXqHFc$|qkcp%9{{6$ryu0RuhL`rkv(*VZwO@|GzZgmW7O45zL8s#nxiJt} z8TITT{iKefLG-YdHm5E)hK2LWn=mlN7MRWbI+*f<7HL&JljwFJ4KshW3DV@@#xPVc zlb)N0dovtxfoj_^md&sCnv;qvM09b6T5baUtNu<`mAco88Q2NYq3dB$_19Seq5%A* zxh}R$Ia-I}GLg8`5|E|iqQoiyqt@b^*Vaaf2hRDk(%AP5z#DlD7S|fbagb@jB>^)Q`*vtX(dug2?KrB}hf1;L~=>Rfb<(39_cdpPnTSya|ZwN2Y?Dbq1p)NF04?CEvtomScc zxVq}q`}o(JA&9M-cWS*Ejn&3kG6@d2JL7NBSw$lIqc)e>zJ%0Zel*YLq|x}6u>a{B z?sd>9LYV%cMLOl6$E-Q`6-lP9%^hnU;w{uecCXjYeWGV^`YvJ&N!c$!D3BMb-`ZpX zF#Iey<){ogk|c@%0?KWlp*|i->e0a{J!r+F*eh~)bFr7=hnGbW@}9=hW^h@!&@y$1 zCUn-qwEH?V66x97AbMI~)9Y);9JHpbD^?YOzE7_7C?F}n0@(L>&5H1#7xI#9;PP;h zM6iy?=TI@Q{PCJDi0;);N}Qqo=DI5)TfCu;GU>|hiSN49LE_r@eK`{@x*thJudYs6 z2R{3Ftd7bRo4lENfMuo5$u?VF<$Xt}!g9ee4?me(G6x?x%h8C<-_sm|`CfzBzpf0u zDIzRDo(jzU7=X>W53-O0#Kf~NmQW$!-Yh7U;4ky6T0>i)Y(mUW5i9F3@28|8H0?p%Fi7`TmJwcA(zvX@-_cfuBcm| zP%+Ikeb6UmEv0|Poe)=|4`GF7_eNOS%nxuG58b7mWXwZBTKOoQ8l-Up0u(fZpO1G} z5f2-CLXk~0&B3Cwi*t@vd-X#W1#;hx&KoU`IpU~(YkK+^vR8{(e1@^Iq7$%UWYFPm zc4b$Nk=>zQhfB!Wx=KzgZ7yxPtOfP92d~k?jR~=cY+0Yt{U$d%pW#;iPWYmJ=JR~4 z>La`j6ZjRi-$=IOViSAg{DvFV=3L2->yGQ#*(~6Nvkz17y8= zm0K_~Y6e|sbz(>>OP18b=kY5_{nFjZ z5w?OeNIvDwBA+9Ys^TlttAoZkYO8=&;>X52lB=2Pm&LHT#24%r&?d|c%)fiy11z(C z>$w4tvib9zmj!^W_lroM4zjbxjRU4ae6s=}-@0Z+)U=Hv{7!NzlcLX1SvOLD9(kNN zQ&5mkUmUvebNn+knn=jf{*7AA1oYwD6I__Kx?Nw44naiqAOtDqChIOW#=IhE;AFay z3v6+XpW|S-lTVVQNgcv{sxKv}OR{5J`kdXa3R0*eQr40l`LLM8J6}ooBOTFH14c0S z9*<0;7}AiKi%=z)!m#-z3+q~DQwr?W5Wut6$N~N1NT|ld4|6!q@%sBd3cK60&Cnc# z!ww^l^^M}Mu*Z{SQ?xSnAy;hN{?vOHme}QHy~os_6e*#U1>KHKRpU8(xFu&{08~G> zMx?g_9f!sR6N0nYEE_T#p<_&XFh+zePnNt8)7&L~d20&Cll#^slJ7@u8dNOnKd;PI zF+O!RvEk+^Z!<_ZLz@hXubo9;tl3*v^g|8LvS^eUij<2)2IxrDjJiHcq)ZQX@L<*l zK1dz%U6OPmM)jt%-SY92U70mnh_wZMb)4n| zN24d<4PE7ql5o)hEQU>-Rp{KTnnVe06!^Ygi6IcxMY;qg*;gaBE9Czj!vKbPkHZ}^ zDHmPZwR%F@kb(&H(m2xVw6q05qx;Om2}NU7J$;8hC4~7x1WvopeojSNspvzc{q+nL zY5!ZdJy!J)8tfW7E$kY`eg~V@5>?7Uy8XgK(Xf%uS?Gp*r)!CK5$BemnAnxs##l>C zK<^Zt_V*CGn@UI5v==^5)pkjGeU#Y=ACQz((H2s9rpL$Srh;*-pdvkq=b87b6|ndG zb~JvUY~wV}Hg2A_aB%mH=jDp1)&?(a1Lo%Im)gJ0;P1jz?06sgsC_b-Qs?dZv|W@;7#-;2dr|}*kXyl_0-LrN=jJ`YbUX_V z3$WcLI)@()^If4Zw8w z=`y_EBYH~HWBrP$A8+2rif6#U8HLj}I{Eikl9xaMWc{_e%Dv|xPh2YWibJ|^Yt)Tl?jY*eLeeui^j*pS$cW)9U7YojgKP2j%Pj* z7Ck7z2L({6)~Vx`W5_vTwU|V6dL8v8{i~aGPR@?2$({bteHOSu?-OAHKb9DgWq0j}nM?jOK%n3Wdr>!(D{ zA7T8Y^w4v#|Ae9bePn-g{y$Fv2)wZagw1|~-Sp2of49X>PfyFv3=l2&nHT`u>Q$4C z?Wf=5e>|Omk@f$H751wV!0r+tdPo1$ZSvQ?-}@hs6E<2_HV)>08HedV<7@nX{TL(j ze~0Dre@fOE+5e7p#mN3UY@yd2Fan44sqx+rv!6@|S2pENaxljLAUE%)@ z6Yt-*%=rG7!|}gA@~fZ{J=)a&gB6n_z; zUhgrW_=_0zdLseFU&N@_tOAO^h*7U;1r&b~qZk2s18_cHAACPQ7mxrz@fTeS5b102 zCtd5Wv?+i|_;0p2~1F@raKB|{P7kG=Ma^4q--Qcn6`}S!;-d^qt)gN}a z!8jYDkgN#_aqaE_W^Wde1+YWNCG%J^EN#L*fjW!N37dQlX`NpygcH~7 zO(%yCe~?xO-(W=drBIP#HFI5pDEUErNEDMYq{lU886tOy&{^jfXHhd}waJwkDmF&P zO!)Fn+^eBo(7zg9`LfPIHxNStc)}pCr+%MHxpHhYqDR()HML~6KpFgIlO!gpsP#0T zaB{Z^8R5Y2JyY92%iCHA(-n$j&uX^)r{0R;17d2GKx|fo)6!9xPfr-%HTRvh%e=}H zO(5f9j8R}7#)2N{2tEEL0cx`Y=>SEZniVOJVe$c6 zYlag28xm$m=`D~E4ABmD#{z z{5SD5*1xW8)A%SE32;yTsZx~%`RtO~oS66?AX7!rFWx3|V*ZI#00^}PhSQ)ye@xe7 zOzj;;YyI=7E@FlLlT$=SJpFv+)#KfL4)d=5jjN_5G)vtx_$WS+gHxYBl~?CHG~bmY z5~2IcolRq-++onw+YqaIsx_BRCUk`jOoTg(DjCQ9m$l6i4FRFHMIsQZ!eRUoyj}n!_*q5Ek|LiRXHi1;_uE&iNcbBan?aQ_)cw<{_pEXZ+_YsxV$skm~0y)ITKEQ^G(|5>Ff-1jy z&r%HeL5xmyo%Q`y{7b#DN3VCs4eaP(;jul=N7-A}c`Fx3pR9f|Rp|L+eV#IpxhGH+ zH|M-`#t}%^FUc*=kLt{}fPs)F=!7my2~n^x7T$&=kCt6$CE5v5O0obiO(^T1iQ}G- zowSrnJggP<41}j#n{^i$`%c2*@uMQTkgX!-xj|(k;eKtEA);I_tm1n!;nHc49gDHr z+D7G*+khPz(kLtB6rVZZ`Et_ApvFcJhBCi>kWo&r^rRjaPj$Td7OR{cGTI;xTL;!5 z{j4ZBjz=z7nt-KG?pRZ-Kin)tP<0!eLi}r&F`XjLPxKT! z%_NhEeyH8ad$CA5EUGhMcGO$d+XZ-4VCy#1#mv+^H$S&LH$1-?Afod8+ur?~NEN{G z@-GrP21equ8!%1Yr+EYsqpK0eK0fo%oel4(sSK&V zJf*w;+4Qb4{%!OzcJLhP6lx>w2ndRs6j-T$LUx&?RC{E5R5^b=grZFJLf0*SD40Ao zS1{e8<>L;Fle~S+jqXTKJ3v&5cdlZC8%*o(n{fQ zi*NG+0H^Xo+kDY`-FN=r!wX8Scv8JIawOdc`>@&N+q&=&H8L>qn`@g`rT*cS$K+{R z%qv=t?q2OkPEGNlxwmk^l(Q`Uu!O!iDq<-4%@)d-m-%8e0_sij^6{#nl{FZes4c3P zG(1bXDDQISprHwAL|3myk>(wZ_2g)s+=}f@jO{^IYEvJnrKD` z>i{V}S}aTGin(+9)jO#l?bJU!(Z`RYmf6gO+sb>T2fo9n+%0gk1=+K#Kr{B9$*c zCads3YNiz~-rvruvp){=sU}Fn#OencFqAb?Mig(wo!nJC8;V-bf+yR}6Kb2}!#WF{E zlDDxg4}}Mb&TghP>DgrVD2Wx#UH1tZQGM$h4yzJJ?!(cbY?F}(d=M#a)}#Hk-!~`> zJ?SJ<9-6j-tOmV-ZABeobocS|iL$k~BxxDnEYYfl8+M}QhTT|zYDS|TTn+4bvYs%p zW%qoAeFAjy35i9=Xn5#*UP)Ol?QA4F7<7B4yl(4^MBI_cWjvOPPnRrBYqk8t9>wac zw#_Zya@LGQJ=!G@il^8cG2N=naodz7$f3H|fAEk9W$rqA$)|Xv0PU(O>~Z+k@{Z_d^O>cxMP$~xOAYar)qAZtoXosvzIZ%=@~BS5v)L5sF3rKg5XA1<_u(!#?8&pFPzH3`Py1m)9JS1?tZbm0-sz zkx2HDkS%HCGYH;wXC*+2BvRk8*N?C2EcW(3oJ~^F%j?;NK7VsYpmeGzdwK5KYn2

RkilhMa14U03uq{J@%|a?z|x(Rj+HLaCVCf}UZWaOTtC+?1G=Qv zZboKe=AO2FQ}R}5^MwN3rfzof9E4pF4@gt_V$G%$>og8h3jYhX|(T9~{zWiee?R8zZ>I zq3cR7bcdleO33SD4rXv;i zjhUMlf3-B0l1@Lbtx>_$(UcEX!C5S2^2L50S|ub`xty1W9ZW6q1KTR8sTKJWD(IE* z4!kZu5rgk6`;FIA2M=mCL!vd5D`_dtHa=8Pw>dO2k2?G6VaAR}wl>dV6|^w#2@#c; z-R`^r#9MjI6mYGk0UZI0gVsc7ah7Z~5P`!A3FtA#Xi*iJQq=-*JA)^vW#wvIG|%=m zSg*F4&>swqZ(weRR%ouqW)u+Tc4*;GeKb&PxR> zz4|l0`aSm9$WB7ppxBrJ84#b&JK?~|`F4LDE5fg&`!zzC0D{mIfAoe&JU-c-P(L>1 zaigR2_ehpF7s5%45s|Wfoly%e(p4*(9jHRreci#FbRhyiJPw}C{yv#0vZk9Y9CF9l znu$l$56bxh!o3Ohp7U5Hct)+O9y!SIGDxk~hI}^51)=s(DkP8kUSwS6gbl|<9jTdz z#t>#D`|k6NojXk2N(eEXiAQQ6Fk<6*Pm0uEzm^NYM;Pp9-*#1o<3jsXtile zWY^v#4pzH2X7I)a%$p)L*G(v~_UUc zn1*#6z`7d8K8%{0qdRwvLvYu!#FzGmU^Kl#hXE{jJfdw8Wb&;?2G@7c(piRB=yj9G zESp4@sE5?W50QGlQXUD|tW@H$rfVhNxD4ed6OZ|LL%t{>2#kzEjgGqB-{jrm@r^#* zAKYKuzu^zEC;i)j_?tNBD<1Hdk*FkId03CM09ei8jmUwp6VW*qymGU`85y}hRkgqc z9yBxn%pb`DJ119TTrtZzXWCjFH+_$WCl10Qt%ZqLdU6vEDk1@2Hm& zdP%LB#~fKuGwnbR?vq45oe%_>^`n~_dafY3I0zQutQ#8+uuLkC-e*>b>}z?3J7Fq- z0^hE}9MLKx4L*8>R!;0Ji(_{KIsp272h0Q8gVgegJp$tZ7UnQAo=L89LR^MfI&!AH zIFJ%q%ScHtPlm+$yxkN8;37_HNW3SUFR@5bgOup3IxY|CP^GwBp9EOEqo6Coe*)(D z{XmSc%PS2Ig}9fu2<~i)29m1Ef%S%|>A)Jrc`Tam%VItX!F#S56$$`<-XP+Hc>t2x zulRsoF+OOLGZ?vWxi$p3K`135L`hClHFW8WNihvrGobMa;eH3EhWyiwYBJoGklL-aHNPw|0nRU2rPAIS5dv)8{&8nYTD$4BYdOTk68b5a&~2cPV%~36 zi7TJQsb@0AcAq>*Sq>e)TSa5lF5JLLe9;i{@==xj+}5coU`#nlOl~wl&yKX%jpZ&Y zlI~}=6La0M;bA&eTfIM}mc*NWmPaQw5f89#{chRLP}4p?K68C{cIm*_#6yH}4A^zk zlwYc6O#4wt@EsGtlO5V1eyjW|$$3R&wtL@2=r>a+bIr#G`?s@2wpo|EHNHrcH!3j3 zVO(0G4PPjZXE}rQ&x_N*?7A}7>2MI>sX~>PFAqf;gLWjHIHjN8)jFN-X`Wxy_$=bE+Lb(-m*$(W1^SHNukA+ z3mFP7x9g6Rq#ga#kIliQUyfqarKg3zWq#D8ezpuu1RuUp+XW?^6D4TVc3I_HIb9A~ zyqITz;0uF;5tL)2lks%Q5$U)$ObX`~seTHcpq?QoPc-J7y!$HExNOkvI&l@-##9)z zZK2rr09Vx_GXy6955BqqEdb{uLaLrhHWg_cYPqxF}1NuaZOYyg{{U(Kg z<1evU3^Ble0sK)sww!kgUVeDydb<4PJ;mxX4G45L`O*v(?@YB}<`j$W6u37${II_z z0g?r_OtfLsm{Be6=hSyjZHn}ZYD&7NRb(l7C3eH09|rd9Tp6v+d{mYcf&qc$IXF-9?zXsxwb>X%QTJWzK{;E` zxa66}9g145ivTt3DqJI7NA7#l9;ng2H)$6`LmV4>&#gDb>{bcXGdrz#Zfb1@Mo*xf zat4-vo0#8R*~P^4*ZUVaXweC{e1`IUzlV>ZQ|frn)eZ8t)UCK9`Zrt=dx+jDd2;AFK`)= zvVUy(x6T4}E0W#YLa+owwFR}aD4twG)p;z*h>{9I-P(baEXkyA*?{Qn<1^4OSF>{M zX;%2NW5u5K zJ3jw*vNAm8%S&sYt-`K=u48o;j$uNfOiUHhoEy4>G!oZ=RJutsxb&>N6;3pE=#))K ztQtb-o7_SL9@z;00S6*TpFZCFIt5rJ%WsC}CNPII=+M(w^$mrtFvYDdFVdh5U%|x! z{W-PwbI!_!`TO3@l`?K-hF%;O?zep#okKa#p{>H=!Ax||qF^p1Lwrvlr%sF9m*8a; zP;AWgGzEs36GngCv7%B$ zlWK00s;K^XH7sz}NViSG&dxSZL(=n7JZ1#JmnFpPKW6#Q zG|m4Vgduv?KO~3#&@Q53_-_%00G?C-%LzjaOsw>@8~`1l*EtvldIm;XdRC^Nc8?5< z0O|-pKZpqc!UE)c{-K7%z{JK35ZGb*X^h1HFhQhcVW)q!$^wWN(Xw%{{zDu>{l$iP9UOq-FE-5U2w`CTIbHg*Wx!AY6o0W{UhgfS_>&Fu`niAv0*b#lIzcOilin{${a#qT~(#YPJ0iOd9;j2%vxxIlc{;M^z zy@9X+z?T&u?El9p_yEDBzs%JRySTY4%p@Gm8=aKok)&kB(dZ9G`aOP+H5g>o4hRr~ zrLaLBBI+V#Mc2hTt7h;O#Uab(2O;j#pLa#Jl*C~p2s1%piPINOr(m+NirULAuo}`g z#)b8(Wy0z1v^P#fez@Jn4*b-;*JAe)ztUo~Fzz&6*P7E(*ZRZ>0<0}UN3I%6jo{bB zYiAD8CkI4xW2v&x&s>a(uMFhAv7ExyOjh@z4e?zDWHaM>wd`%co>`iw0NaC zujS^hHOd>sdrNI>nx+Zmtg?Rgp>1xPmV_aWnIi<0MPYZ!h?V5u<6 zxr(N|o<3kq;J$CeI5(vp#_MA&-sO1T6KKqwoGMu@V81H@EtiMFhEYMSSq8#hu0Z6x&$Es*jnt8P%~<7bF=1|}pd2e~9+g@6YsWMnu4Qp%b2 zaz)~AdOrd@d-^Hh@y&BEMY7>rr0VWA!klTASdKQ)QW=Lw=K!kgX0J=x9Ijr@o{LaW?8jUU^3rO(==ANQAPeadazu41ptZZ9y`3Htn3HcYo=f zmbGn~qaS%Rx+{qH#{x_%WbHs4Dzb(=JkvScRO+z2yi`3NoD@xzE1IKAQ@Aa~b&)?C zn4_;q-c;$V%j)2mql2<_Eecb9O=}kWwyFqOz$kGnjMBLG&?O7~HLd<@+U}1o#;@s8bA+v^HP$vO~U57))-(r^$>laA`r^S%ls-amxVgl4x9> z;*-{iRsYqAVPN!(jJ|L5%&gITvH3T;_mn<_iJ?ivUI$Y%vKRlDH=(NV{c=$vv*|=ocn+3!V%h7>+I)hqnmcSEq^F)JG=M5 zHnIYOv;-rhz=v0ifOyv5CfAz2ky?S%!5o)QWXF(4yerNg)&~|GNK4L&AJME>2 zV>9igLEfo(&?n_HrD|RlQaZZKj{dh3z^El~!W~k?= z$cscS9km4G{QHR}t7I0*DSXfOyJRIuPo2Jz$@D`QoT!gy8Nc(+9Y+L@4BFi z)mD;5TRT>!o>ixr73{j(p^Bw7D`aMI8B5*xU1}#_k2`QAMQ_{AfOChGC`~Vy4Z}p* zfwXKdZ>lP^nKMf1rgBb%ldHpUcxb)Ka4bQ9DlOrC5oMLLB2Gzh`NaUWs!rb8IW?|j z&Xxcb-DsvkM)B9ExT*0E?`YsuT?zsqB#CjW$Ft0JQzj#aH=7;2hl zblcdnW*RXuL-2M=8Fh(UZCWaQ6osLwPXD$oJGy=cuw-z3hcG#|SAM>yGHI3PGUu3z zmdk5Jaxx z!FG>&kwh*|KCek7HpOsSj;wfbP8O#s-{V~k5<;Cu)--)g7kyl*9Fh{Pe?j-+cN(5a zSSmKQ4^bl>(zuB_)u*rsEUNjyN~IHq)+v7bku;O0u$=5h^6gy(0nnrp+FM;hIyuBLstDKw-7i{Nw_dk%96*dQOwp-SYAy!-TTw~q zsfI=DI|@JS8(pziDKJVY&-Ec;F{RI?qBtQ7;z);;Y(fp86J?ayF{LF$vM5a>3Fu90 zyp?Q>$v~@3YJ<#bUaNMDnJO@Wl%>W}IN3XHCba%r$W#`HiC-8%8G^x1Qimh@5r6MN9T+G73a zAKwcxf{g>(9ySIG3F>6W(3YxFTr^JpoICOM+gN-gLt#*lJ|s3NincsY^&#CIn_O4LT8Qb~05u&Seg<@S9UY>fSWPB`Xw4ZFRuoCs zKbT-xR6oJ-v)w!>c`FBIyK~`@7eop*yiY~7iLmnd>%hE z$5*q_mxa*Jo1;uk;d!l_e0UfwRa+RJ0xK}PA(x6sa246i4M?&Z_s=AsImrgo(TFg-N;3`0%}dP4kXq|Lw>3T8v;Uo_wpy*w6hyUVxxIUw#Jt_#7Rg zrFcmuWG$&f@FAZanhX?r!u%~A_0LSn=;%n~eo&;A@=vEl2m2gE#EyXoxIf(Je;lQc zkAx}=YS)Lv$EUohBKN{XRh0_XFQ3V9N!h*S^dVqojwBCYk3<)bo+C~}Jr!>y@0@kq z$9;%dEMxJyZ=#h(svo~PgnI@H>GQ<`&;LFk_9I0x{$L>9a0<?cI*2~AJDRhyQ!)=uU*sxF1P*^z_GXr{{T&e{JgIQ;?l#BBrH=`8&~?}?=_#$g7jYY6oiY* z3RL8^G+Izmmr&wnB|P7&d<_r2nL?p!&R}=XU~ksNzIDO=aNNz#jMqirQSQA_7j6xQ z?7IzaS&yFqiCjpa!$8a|*a0Cn3kns0zt%tcH0pKCch&GxGWxVb&_0PBaI|AHD`>+X z(s|Vm!j^1JfJZyz3lqHBAyNMW9?h}CFJM*hW#<_s?Lq5l@r94~<^@!po`r7p_O1FY zk2+%FhV=_Kyc1+uJ1kE~cbQKIl%9=BgLJi$Z%HKi?FCq=eep*X{^VNjQ2kNjJMg=u zw8ymxS>C%#gtTz~4-fZKs&`F~pB_v_Fd?C!UIeeBJkCLF>)hKOf#%}I>_R_f4fco% z&pSy!-c7PBb~v@8*LLlaaAMM7vzpSa)68Q~K+IxiWM*dl`0WFsyW+5T zTGv!|w7XHC#rZ;Z&}R5T&oO>Ts{b(e?QSvSPpV)B+O%IjvEP*;PQr$r*&%9wM<8VL@wOqg&fSvgus$7rtNY1Wa+?}mnrNhd|!yF@)E$%OF;63$gBecUy8SBO{YBzQ+X8J{g0k5n1v zNN*_G;4Xm0FIbR=JpGZfk+bUEA~N(3n6JGwMTco1*KgqBqN_-47zf ziYgi4lt!ftWud3Ot**>r*8G~r;*X*Q(in1f? zQVN!pq{L9@9~cQc_K*qJAgJ*)nfhC#SRW9}=U~3WrnYe4w2qkgx7@=kt^c+BQwo zffd^QF{j64-U~Km%*$Tvd#ZyS8XCH$J2Wy+myE*5=(10aRvR=H91?2Ez~*Rtaq3mf zf@Egk0e;9S?2*ZYrKBAO?}_gWVD!#i?tlg(5Xzkb@dpR!NF%gL))H5I%t z6bw0!PZcZHMg_~-?nuFkQ|r5w$}Q0mzx#-ZmHAMyO(bV9=z8QDwnSrH;f`pY@DV#0 z;P!d*aYc<&M=hIB59i3Z$+fb_-ab?avr`)s9?WfhWDCj~FpYhr3I?O%F=#MYmRRu+ zjLRByL44CM(5cz0xdQ~z=k593y2G=BVHMpPULRhcBdP7v{C1@GW)UNbm!_xUmXwws zW9>Qfe4$Hr#{udH_fw6c)8Q_O=UrzZN(mn)8A_+@Or7QJS#FJ$Bl4b5dvoT~wIZFz zLaT+l)u_dl*Ui9>y>m4*jL>%#k+m4(xrnRCD8rwqp zZ-(`)p>_IAs0ZYF_zAIJ*til``q|c zrpWMCnhl4iOU$OtbG?YDU-Z_y<{h#l^&`yXr>WH-HqP4Hoz)AJC%QpAnA+9N8n}OdT6j5;M(hs3Xv^B#5Kf37%a)N*$9A5cW7R zE;F>~dG?-tOJaLd8rB~~PaGgSJgf3i+K{HH%0oZz5$ld;{jL))&_Z4I8_yhT^`3%` zo6&;hMllAHSa^M4%uv+mpt94^i|Vj@rA}|@vBdx#K+E9)`oIUt?-Mpf^7cUA*bdqU z59Z$MuMS~MrWtZC8K1Lad+mbGHLMMNOEB~5^2M+vVM!i7VmG>Ta9ox;nL9XO$UV>} zKnPDteXD37E@@*ba-Uq8TCBEEQ?NsWdJK59k|s-v^Eyd=aC*l#?Rg#7=H8Oi77yl| z^q|FY7blzS{@zpbIn2w>2t~o9-{a<_pe-sIQ4m)Dy3oL5Ms$%d6o(XyPzfGqFN@3G z10qFkG#O-Qzh0q=n;|y5aH_0rfNU;>4Jm+*F6}UC1?5=1_PFl+$7#`~#=PxW72eT` z>lxnLEd!v1-o}UkD`Du$;&(g~guNwWoQ#>8u6-VpB&Gx^l~ty>!!^66%yu*^ky_XV z!5B)D-62%RCLd}=1}HgW5x2(D#FZQvQZ5c;w?q7MObZ%S6RO1YW8+*JlsBea9W+~J zR$2V935>{@qTky3RSIzs$dWs?TDE$&>a^N;_PCq0I<#7}dbD;fNo_|2l~25Xl&_r0 zVb1Ev;Pi|0II81WwjtrerhTlZ#~x|39jU3Qt&P%bsJWJQF@6j`l^G3+S=!j@;98q03u1eq%7DJSfh=w5KJJ>Spov1^ zmojDHx$6A4Is|u}eonLvqR-*Cb`NZxMjxE5n#G*gim-6qv>yeg&(-Z7ng+;K*=zzG z$}Jt*j>Be|<=$k*3Vkc3ZkbS(NWplovL7$=4Z~nbYC$Gy6A@``^b6urx!a9@Xp>VI z9!Y7KXrSct@NVz9)oz5sD7T%&UEG^MzoD3w@E46|r#m=CG~Zj`>vYb~!Gw-gDf@8c z6Z*l@u4EzbTjYo`v~xs4^0t)X--MXN%}hz%%FR!3hQl_E<~DD{({Hyl>}r+A*CQjr zFV5MlaPahK=xWXT`jzgT*O93Vm&m^}MKt8Xwwn)K?OuMKUhTgEyM!>LceTZ^;nrP= zdK=S6G~1c!BP6e!A!;?`V8$?d#5_9AdE}z_vS1)r`P@GcuZpfkdx^v>8q{(cxhEJ= zDyF4R&iKv%H6dt-q&A#qlicQ=0ooR-OOS1FvtR2T_%}ma54hpC(Ig)^Mx|&o2pkF& zWjHT8#^W%jYo5Q@bbn`~)3C&vtGq6mI$)c|QMq5NSov0bN07wjGf=occco)G>h-*P z({^%$GE|tLz~d&9%Hnmpy4tUfXb)7Jj28g66+vw|tzwKvY|G414i1rL%(BoO!6Bq) z=ikx4=HW2%fiPKuU)0o>$}F67*)OjD%lUG*lg6X|p}}2TS7+Fumz#}ywPkyEo+m+h zus$v%1SxF=kXZx6P7~~=v47-A6&TrMGM?nNfHUJxjDj&EQrjo>^EYDYj{T7$$l)ua zPuu=JCy@bu7aLU9!gwD1vo~|!1Gle{5EqHr%E>;#P|vsVYneTWvis`KB#i4vnlFsn%r9Qj`(LfVGjuxP9aE)UoWvuGI!~ z+Y>Kfa)yu2{}BTR%<2D$X#Y*SHftC3cY5fOq@y`qYqt-t!{}uK42fQMvV`uQ%|K8DR&cQcfwx7`ZUQwTDU!4 zD(PKN(K!_K+3pNDOXaiH-Gs_08$12kHjA^K=(ByvJSfW1QiE0ecL-V)69lqK>`nNowLwvMSv^04|-vE7?`6n3omtpWHy5leWj+GrC zq5>ER{|SJ{0B}|M3xap#;pU9`e*UDavC;K7E;T{lmZ)Dp-dC+J6byu1Xp<2C>#FW& z-}m5~l=aZiD$ISoJm@O)1buax2buaBZPZ2V-dISVgLVadcMI$L-t1?p2(zuy630aC zCwvDwb{e@z<{PndzE@5tE%iL`XlmRqaXlzW-17!1&%#Dku*6G?d04&K@q!7@1Cna6 zI_9~cIof*x>f->STd6x;n`E-WDE5AYz~7Qd^Lkl)V`O9mGX9QVqQPq-ozI0dL@ikvqTE5xC))pJH4SEElM-^AP>@p`0UloQ^2WlD&2Y~=7+!B7! zi$@>vfCGC`Uj`4yqARg>ipteQugsnv`=Sh$Z5>ez_-QQmWJ`N`nReIVx(RI}xWcqx+4 zngt`A6!f~L8mHgZC!HkS6Ix2eb2;G(9MIK_)S@v>t?<;S$toi`V?T<5_Hc5n^4*<$ zC1Y|6#Z*hiBwWrABGe6#!HAqQo4j4;q`;RKl5lSw(i93XX11B(e3!51gQT!8f07i@ z*wfIn;uUJA`Z9zV(jwxgjji_hMlh8cD&l&J0CukuM&w7D>n)>D`K1Jok|=0r&)Ww{`I+oe3x~gP*v{ISw0JCaV1ln9<))Z zlFpRw)<$jd^{ojL5|Z^}B?8gu&0-31oLEjOLY-Jr9l)7thLE+IS@H+Q_p|F(X5YG*iYZfxs_)SnPk`4sVL^i|Z9xoChZKks0~Hd=b}ts8ym>(G25%cZp%TB0 zf$fJCcq`3hFP1r~90}!XE%q=Oc?GG%*%cErz7b9vfOx%uNKB*k6`QcA-x9lnwR#;f zcI}OB?n!v-Cx2Ijskn#FLfq1`56n8;1d%N87Q_V3};-+mV z7QcsK6*rSttLBf#i_{T5X$z8{Eo zN?8k3kEZqsWr2AA3rhv5BRn0@Zl*74Si9^u)2rIhW&zu526l-d^3D`{WRGx9k=Q}c zJ0w?#801~lp$?ttZ08Rqr&;m|GVl5osy~pX%DM`t3Yyx8oS`4*ya*?3b^@D^rJ_44 zV)piwGuRU4>cP|+_YR!O*{p-QA`O;nu5T*2pyT*TMEBR}prpPD_i+K*9&;b+;Et|v zSo2n$B#bJ_Qj}MzXBA7eN2wK?=vVzHfp!YKJw~t_ytmsiqRZi;cn0K8;w%>8iJKnq z0a0&ML!KjWuA(9uPKJ;nAB2Q~JV1(jHNC3@N5k3&S&_@hRP+t&7vv^K%Z0NeYgTrC z^G_fW#gN{}Ft!4LDp5w`wir5ZNFa{X$Ij`G)Tc`oj)Jl^2-=ZlIPxqcjj8hD*jwTy zUupuL?Vz5{1i>F7Ch%?s&_?3QVcuQ}Hn_Kvq@>Vg?0m76QQQni=#QGcn4+^Q;2PHL_>Ka5+JF->;=ROP2g>kmC15;_un) z>p7XmT2fV>`+SL>C(6fMm6hyioEw^qyLNes8G|E}>GdrK&-&i;El)M;cX*q7+`Kn& zKb$x`0w(G>c*^H`Fxi(z_jqMi*6mL?VHOTDtW-^&(yq&0WnL~tC>|zo@AGW$LV19% zMJPOo$WNetEF~WoW@ZeuA3Df5DZv|Z(T&frF3c7sKig0)F~mH#%N(d*wy}Hoy;;~j z;qXY9SZOe($y?B>tU7AAB;oR~NgB{R6saq?tfSMfT%paN(;r{4zUR&xwQ0PXbFOuu z^thgpxi$w(yF@+bC0MRqCJeJ)!{#MfR2wQ-DRu7UE>}0&(ifFxD$1VdC?@l^R7CT% z1n_FmTDenxXN?^X6>tH~Yg@N}QUI>?MDU>Gr<#HIw55H&$qC~&E;OTJ+&vFe6fZGT zDmOO|q>(i~m0Y@RPm)I!TVxKNH>h}zmrT2H303ozhar`A>;Gc!t)uE(vh?8)AV_cx z?iSqL-Q9z`yIauU?(Xgy+%32UcL)vvg3EWvy*+)?H{Fw-U(d|?X7zgiIdx8*w|4oi zr}ln!?Y->nwVwFgW-3>`AC+i+`&R9+6sp}Vc)@E{jnm3FO6ze@JfF3Kvu>r^Q_UMZ zR1Z?pC!Z-W*0iy`7O=h=7sU(j#^pKS&AlZ{dzgY6yFCgiqn$}K)V&9{U3;kl8@9Nq zyJJbiD;rnp)Wa2hSJ(o1mIu~?7!tKPeRj$;F_KpClXPPpC%0XJ*OcqEbNnY8_Ad*# z#Y2s_hw_|k+0v(MQdg?{!nZFRVX?aRjH3sI>|7VI*@`i+Sn75F*D|Bb4 zR)|v7RaC1b_40r@_;R}zcd8qbWduj?PM@TbE5}&V@#WAagEFOVW9p8+tBTai5vfeo zBjOapCd*;=zc7rfYn!Cr%F!oTK}e3|lI0jztMx>)9(9?>>2io~Fu+U2 zzmY~{3H!njE^lQHe-4vVMVmxXAK2%dNJr5HUpjlXZtk|>`y zYQ4;QsI+4(BmD9BkcqxVy@>Oj6H`gh{O~jiey6fQNsyYq<+nJ>)MUx3;o%~(c=WXC zjv_v~q%N{^nYZ7JF7V?-h+}T$Uy=|cAxVkx>F=L8FG;zX3IEDhF ziy0=Aj)cu+F=@MqzNo)QvQKB*1z0B7df(T&$KK3QtCnpj?U?HLR`cJ8+zgyzr_}%+qiGd~5ZCE#Yvkr&jj<-qW7^|wwU4_=U*_Q<3ch86aqjZM zx{mu|U;Os*iQDf@&YWs@=%@#7l_?doDZ6H1)6VPuXnf{q$i^s%Xbf5z%O1?es3l^h zv~8hk4ovI_ik5!rmOU?{m~C6>x-w>X7sqeRqgbqu9+d@zzBG~^sM``;4uz41xL*qQ z8WG$iZwsZyV9+w#YQ&atNf6X*2{8z!J9$le2zZP{V%Y2^-z~D8RPcX*!D6%D9nbpN zhwvx%fiO}ZKeQIH^iIte{y=0_#_jSzNE`E_q2@`11SRV#b}*^^$q|f3&59Z5r$udO zbZR)+L1kKJZ+#y!xbOM)V2s<*a#3bMULp2S&$=E506|i4I+<~YG8C3~!9^m!WQDQ8 z9}rS;HT)9E5qC@3gSr_r3De7g8Y2O9uT@%f#QO*|X!hFXeb9r-jbc3n3L!2Ur;Ny_ zt}78<=_70pxbclQN9n$Z@F83x!Z=8oumM@H#F?=9Ij|_%uu7S*#caEaY`g62yH-x) z+k&yU0!AVKI zeUfAfs2Q$sxsIkzzl|fMr3=hw@>KX(>q0^gP?oQYlF1Oh#JD!w&0Ha)e zV8errz6E=_yG*JPj!5S;8~&s*pOp0aRmB|g%P6GV?29;r*N|2!{NRKtuK3yRs`IP@ z-%2KxwMeTh4)R=ZbF)2Owu-BQV~BNQBJD_FWs86b0+9xI>%Jt-_tnKCReB$sp{Jt` z=3xZ(a0GKJoSDWZV1tb$N5&^p-P2lQ7l_~M{7%!WDR#AgCSj${eZG2Iy@c7aR0$=0 z2e|Dv`s!()V*aTYVsadckGM`c6Kx_dS_eK4!BnqPP=#%#&*!)@6AmTxJt$G7HZg?? z$ZMr;pJbTZOPJeonA=X6TawBSVljhV3PsIQ@;(Bzd(iTGE`+4qIOBsegP~ae5%;yA z7nOQPK{wauH-8Lmcpw`#m zC;+6`AafKBN|-M)6)!OyyzFc5wL<&;&{feSyv;#^fb7rEb?BTrB<@?A*=d=sp zBnU^rJ8QrOB)iHLhrXoGym$542?v+{CgL83Z(l&QK%8@%agtVs1%#SSk(s^!DCDbT zLbE0t71kmQTs3B78zDxH!@K4oWS9+k4}I38u7>C^_i*CYR*~bOWPw!}HNw(pQMz3H zw`O{7FsYQ#^Mn!Cd)c?MHCEO6UL&BrXP5G47KiF8YeM)^fo}ehvB-Q0rEt4n;i79l zL3G9JXJ=-r$(_CnTvuVUd*wms4hVD*}_fD&IweDA2YOp74#k$LC%r~b@my}w= z8Eev~z51Xop&UX=@0J8yV|-Srtj-^mJQKVIR@Ie>Jz6nAgkQM4VSh<~pEeui$H;G- zCX1oNPh)DDl!ka(M8O?NVjn&y>eUuZ;U0lh+t#d+{&k@Z3zd5w#z*q~q0yH}KX#wx zC?svjkPzw2m7e$6mG}j>*<}mzL^*0cQxx!a)yyNJ&5kzpOtnlW%Oy>ac9Aowi<3)d zo|lDRdtZ^x zZoqoyv9)r4;^*Z0`Qo_Px}wGC;s-@B$>Gc6DoYt@ciSfVr2IT*39{w1GHB?sk^W>w zD;=2BkplH(_2e`o>Qskx%3eOc|NQ*M6cBKiph|C!!2c5s{aeJk#eAD*KD0YyZHdp7k%Br?pb}Y#E zyi}Wi{hrVhh-yqvGE$pgmd1as5IS}tn1?dJRA~1tVpVdKc`WjWx{~Gj1y^%zyYjbh zZ)#cWkORzAxs0u=eThtnH*#D|HAA&9(|xc;R);aGWq5F&;86H405i^yWV_6{J<2Ka#c4aMgZh-|u_byX zsf^yW`nijfP+|x+1t6(qBO_%6y@`mH!_;X;X+|?$<_J?Mfh#1Cq!Q8GigIbE+kMdt zMEQ1NywXsvwihc6HD);1L#ygsU&^@QxW9%j4RC8U*=$ZCmnc;!JAu(%Lp*+)p1<$+ zy6>Ql1l8wMm6*+|9hraVdfohVdZ)b4#rW z#S-GxMrq-wOmPf-iH71JBidrkW~qi7VZXhkV`8)(!jy4!cS7`$xrOnpn&h-#L2-zJ zj*g=}D2Qu}yM+|dt**dR^Uf8SwXkGUE*d#AN2~ixK*5ch_~$3<+^-+LiI=2r-(Q%l zJRa_z35E>eP^&9YVHIlDX~sNibLsj}(cthjYQ;ksMdlLu?SCcNUhozsh; zqSAV6|MV5GxX~O1HRGZUQ;3!6{ROqpV|~e%&@ey z2xq9u_xe(Ya!jEeN)m6{^hNF{d*uA?yu-TP*HIW+M?14j6NJrPzGB{qIw$%aa+LHCix9NS@sx`URsNYCkUiFFKP_Y zOCc>;Pb*x6ra`o96FWi51_rm+HIi~rgCu9!v&y?4#YyyWJVH*k@3ct9tO&+JzEBhA zYzbaO?hv_DRF9+~23LlmbURcXBH~k};ZiQ0w5a(Gn)@nYIK15p>V!LhlBSa?#1%#nkg*MGX&W#1A6IaB4V^lCGII z-jEqNm!B613Ch<8LWTwl5{0i5lC*F?)9N7ex| zUkBuaw>(w1-^s{aZt9zQmd|vha8@aZS_EA*CoO>h!Vlgg4WPQ*Z`u0=*@rW0= z?WOat=$Syl2zYSmRUv8S;k2s}v?Z883+LZt8Y0lh)4xO@WkmHxFBZkpFwiB=;hoSF z*3(rr3^{kMsdQ8YmTq8jLWjv=I(yUQC2Q2zo{)P)Bf}@=3t`A26C^eet3sHhW)Q$O@y!I01LvDKeXv!v*(<&Ttirw*Ibkrf$JXsU)c7P8sk3cx_T3-$Y&Nm))i`)Ar*HPUB7v zrnhNJAyC%A{aeiiSk>Sl4QCfNR>Mj+?A}wEH_N+LAE8dBltl!p z4g%L%xS94kd%cPbQAL#4y@@&Fr!jnht$r}tZK)TXtgSbKfv7q+Tg23<*o)-=Xs)PG zP`4Y1aN>x?G3BOpTRqqMLj9b;3+q-sv}vKfL&1*mk_M>^d=H#au#9JM+r}X zc#r|i1F3+iXn<`w^=Q^TCjwS9tV~{Ys+U+2tm);MwIhhq5>EN+lzMP@3t0Y2vv0To zFW;LG_}X%S1UkImj9SQ4UH|qvq#nED{ZI+Y#}-o{i(2bD34u~bIBwYoji59U0pf7Z zdp>CH_7p4=dT~@LLwc_R*8P@iR`4Zw>T$oX>j=qpi+YeT1(*#P+z;9Y zO~Nrse}kVnA;#XDjc~D3-_>*6lGD0b>ovbw%WI3Q%zTLD5KS3!S%+2 z;xDh`8Fbk0H+g8Y+mDxI)7WTvm%zTCTCUmHXt@0;d4xRTact~lhFTssL@V3N+nErvc)zPu%wjv9pl{^?uOS@>H1T#{Af!&yDm_z8hy>MG3!nEzu z13riDcmsf*7U+Y}Ljg+XQcR(z+>Kn64qT=?u z7^8&^Wxp5k!& z8Nldq)aB!Jd-MeYPT+Q4h4Okg`k{i+BP!|UYam|9&2;wVxRXpeiQAMjj@Y8FV=dB0!MKl=J z%Y{8)4&3~^gH4S_N?Q$#z4nNkie}gv7(6>Vyn#1JMzT=VjNET#Gl3rNU_ajQY^6mc zOR3q=vG|b<>oW}+A~LEEBScZ4)F9Bjfu_Kv&zZmlE!6jq1JS0W0}QMpA7x6Rl3sJV z04*JWyXe8gse6@!Hop;Yz?Xo8FJV$S^{3j}V7(@y3*js=#^Zxz41!X$MiUf`1uk${ zgje*^vBY#CpQEY1Wdb#V9T*;(K&niZ0Z4C?sjrNHLmwnPC_t6IUd9K>(YA`GcN{An zGlkNx7`&~IRXbrGt)$9+y)BsUkK#opHq#=2|JZ{P@x)_rG?73Ko9cW%?glvcit`(* z9oRHJ>Pp{=l#HK@y41oGb*?1yQ-KEd2nY}ngc81Z6G9lQj6BGbBmor(R;>@kkjQ`q z*EfrNoHEiV>v1N=8JpX9Eq&w%+jBsuemWf+ZrdY1$D4mzkmI7 zLRz=3`^{N%!tKoGSs^8(hR3l|+)>QYw4R#Xg1kPuY*Oi5 zY3RI4y;Xg)zRyasG9h{>Tw&Fn7Ig0-?^UFGnfM3gQNI=OZ_J!mDZO?~t$dD0=%@W> ztF2ypINZ_57{n*7Znx0qrrF3a@`4g!Ib2_poIk$n-YgA{rYQ}n$zx?!J{Ve` zfmNjN6lnAiP{){5GMS>+y*I@!Q>%0DO=cvIuP|kwIY`<&c{m!*Dq?Kq$0Iw)k>)mI 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 YD0py?S8rPk0On@4EnT`^^ZK^`2N58_G5`Po diff --git a/src/test/TestGhoSteward.t.sol b/src/test/TestGhoSteward.t.sol new file mode 100644 index 00000000..10737afe --- /dev/null +++ b/src/test/TestGhoSteward.t.sol @@ -0,0 +1,415 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import './TestGhoBase.t.sol'; + +contract TestGhoSteward is TestGhoBase { + using PercentageMath for uint256; + + function testConstructor() public { + assertEq(GHO_STEWARD.MINIMUM_DELAY(), MINIMUM_DELAY); + assertEq(GHO_STEWARD.BORROW_RATE_CHANGE_MAX(), BORROW_RATE_CHANGE_MAX); + assertEq(GHO_STEWARD.STEWARD_LIFESPAN(), STEWARD_LIFESPAN); + + assertEq(GHO_STEWARD.POOL_ADDRESSES_PROVIDER(), address(PROVIDER)); + assertEq(GHO_STEWARD.GHO_TOKEN(), address(GHO_TOKEN)); + assertEq(GHO_STEWARD.RISK_COUNCIL(), RISK_COUNCIL); + assertEq(GHO_STEWARD.owner(), SHORT_EXECUTOR); + + IGhoSteward.Debounce memory timelocks = GHO_STEWARD.getTimelock(); + assertEq(timelocks.borrowRateLastUpdated, 0); + assertEq(timelocks.bucketCapacityLastUpdated, 0); + + assertEq(GHO_STEWARD.getStewardExpiration(), block.timestamp + GHO_STEWARD.STEWARD_LIFESPAN()); + } + + function testRevertConstructorInvalidAddressesProvider() public { + vm.expectRevert('INVALID_ADDRESSES_PROVIDER'); + new GhoSteward(address(0), address(0x002), address(0x003), address(0x004)); + } + + function testRevertConstructorInvalidGhoToken() public { + vm.expectRevert('INVALID_GHO_TOKEN'); + new GhoSteward(address(0x001), address(0), address(0x003), address(0x004)); + } + + function testRevertConstructorInvalidRiskCouncil() public { + vm.expectRevert('INVALID_RISK_COUNCIL'); + new GhoSteward(address(0x001), address(0x002), address(0), address(0x004)); + } + + function testRevertConstructorInvalidShortExecutor() public { + vm.expectRevert('INVALID_SHORT_EXECUTOR'); + new GhoSteward(address(0x001), address(0x002), address(0x003), address(0)); + } + + function testExtendStewardExpiration() public { + uint40 oldExpirationTime = GHO_STEWARD.getStewardExpiration(); + uint40 newExpirationTime = oldExpirationTime + GHO_STEWARD.STEWARD_LIFESPAN(); + vm.prank(GHO_STEWARD.owner()); + vm.expectEmit(true, true, true, true, address(GHO_STEWARD)); + emit StewardExpirationUpdated(oldExpirationTime, newExpirationTime); + GHO_STEWARD.extendStewardExpiration(); + assertEq(GHO_STEWARD.getStewardExpiration(), newExpirationTime); + } + + function testRevertExtendStewardExpiration() public { + vm.expectRevert(OwnableErrorsLib.CALLER_NOT_OWNER()); + vm.prank(ALICE); + GHO_STEWARD.extendStewardExpiration(); + } + + function testUpdateBorrowRate() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + vm.expectEmit(true, true, true, false, address(CONFIGURATOR)); + emit ReserveInterestRateStrategyChanged( + address(GHO_TOKEN), + oldInterestStrategy, + address(0) // deployed by GhoSteward + ); + uint256 newBorrowRate = oldBorrowRate + 1; + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + IGhoSteward.Debounce memory timelocksBefore = GHO_STEWARD.getTimelock(); + + assertEq(GHO_STEWARD.getAllStrategies().length, 0); + + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(newBorrowRate); + + address[] memory strategies = GHO_STEWARD.getAllStrategies(); + assertEq(strategies.length, 1); + + address newInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + assertEq(strategies[0], newInterestStrategy); + assertEq( + GhoInterestRateStrategy(newInterestStrategy).getBaseVariableBorrowRate(), + newBorrowRate + ); + IGhoSteward.Debounce memory timelocks = GHO_STEWARD.getTimelock(); + assertEq(timelocks.borrowRateLastUpdated, block.timestamp); + assertEq(timelocks.bucketCapacityLastUpdated, timelocksBefore.bucketCapacityLastUpdated); + } + + function testUpdateBorrowRateReuseStrategy() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + assertEq(GHO_STEWARD.getAllStrategies().length, 0); + + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(oldBorrowRate); + + assertEq(GHO_STEWARD.getAllStrategies().length, 1); + + address[] memory strategies = GHO_STEWARD.getAllStrategies(); + assertEq(strategies.length, 1); + + // New borrow rate + uint256 newBorrowRate = oldBorrowRate + 1; + vm.warp(block.timestamp + GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(newBorrowRate); + + strategies = GHO_STEWARD.getAllStrategies(); + assertEq(strategies.length, 2); + + address newInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + assertEq(strategies[1], newInterestStrategy); + assertEq( + GhoInterestRateStrategy(newInterestStrategy).getBaseVariableBorrowRate(), + newBorrowRate + ); + + // Come back to old rate + vm.warp(block.timestamp + GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(oldBorrowRate); + + assertEq(GHO_STEWARD.getAllStrategies().length, 2); + assertEq( + GhoInterestRateStrategy(POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN))) + .getBaseVariableBorrowRate(), + oldBorrowRate + ); + } + + function testUpdateBorrowRateIdempotent() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + vm.expectEmit(true, true, true, false, address(CONFIGURATOR)); + emit ReserveInterestRateStrategyChanged( + address(GHO_TOKEN), + oldInterestStrategy, + address(0) // deployed by GhoSteward + ); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(oldBorrowRate); + + address newInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + assertEq( + GhoInterestRateStrategy(newInterestStrategy).getBaseVariableBorrowRate(), + oldBorrowRate + ); + } + + function testUpdateBorrowRateMaximumIncrease() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + vm.expectEmit(true, true, true, false, address(CONFIGURATOR)); + emit ReserveInterestRateStrategyChanged( + address(GHO_TOKEN), + oldInterestStrategy, + address(0) // deployed by GhoSteward + ); + + uint256 newBorrowRate = oldBorrowRate + + oldBorrowRate.percentMul(GHO_STEWARD.BORROW_RATE_CHANGE_MAX()); + + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(newBorrowRate); + + address newInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + assertEq( + GhoInterestRateStrategy(newInterestStrategy).getBaseVariableBorrowRate(), + newBorrowRate + ); + } + + function testUpdateBorrowRateMaximumDecrease() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + vm.expectEmit(true, true, true, false, address(CONFIGURATOR)); + emit ReserveInterestRateStrategyChanged( + address(GHO_TOKEN), + oldInterestStrategy, + address(0) // deployed by GhoSteward + ); + + uint256 newBorrowRate = oldBorrowRate + + oldBorrowRate.percentMul(GHO_STEWARD.BORROW_RATE_CHANGE_MAX()); + vm.warp(block.timestamp + GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(newBorrowRate); + + address newInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + assertEq( + GhoInterestRateStrategy(newInterestStrategy).getBaseVariableBorrowRate(), + newBorrowRate + ); + } + + function testRevertUpdateBorrowRateUnauthorized() public { + vm.expectRevert('INVALID_CALLER'); + GHO_STEWARD.updateBorrowRate(123); + } + + function testRevertUpdateBorrowRateExpiredSteward() public { + vm.warp(block.timestamp + GHO_STEWARD.getStewardExpiration()); + vm.prank(RISK_COUNCIL); + vm.expectRevert('STEWARD_EXPIRED'); + GHO_STEWARD.updateBorrowRate(123); + } + + function testRevertUpdateBorrowRateDebounceNotRespectedAtLaunch() public { + vm.warp(GHO_STEWARD.MINIMUM_DELAY()); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD.updateBorrowRate(123); + } + + function testRevertUpdateBorrowRateDebounceNotRespected() public { + // first borrow rate update + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBorrowRate(oldBorrowRate); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD.updateBorrowRate(123); + } + + function testRevertUpdateBorrowRateInterestRateNotFound() public { + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + DataTypes.ReserveData memory mockData = POOL.getReserveData(address(GHO_TOKEN)); + mockData.interestRateStrategyAddress = address(0); + vm.mockCall( + address(POOL), + abi.encodeWithSelector(IPool.getReserveData.selector, address(GHO_TOKEN)), + abi.encode(mockData) + ); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('GHO_INTEREST_RATE_STRATEGY_NOT_FOUND'); + GHO_STEWARD.updateBorrowRate(123); + } + + function testRevertUpdateBorrowRateAboveMaximumIncrease() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + uint256 newBorrowRate = oldBorrowRate + + oldBorrowRate.percentMul(GHO_STEWARD.BORROW_RATE_CHANGE_MAX()) + + 1; + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BORROW_RATE_UPDATE'); + GHO_STEWARD.updateBorrowRate(newBorrowRate); + } + + function testRevertUpdateBorrowRateBelowMaximumDecrease() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + uint256 newBorrowRate = oldBorrowRate - + oldBorrowRate.percentMul(GHO_STEWARD.BORROW_RATE_CHANGE_MAX()) - + 1; + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BORROW_RATE_UPDATE'); + GHO_STEWARD.updateBorrowRate(newBorrowRate); + } + + function testUpdateBucketCapacity() public { + (uint256 oldCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + uint128 newCapacity = uint128(oldCapacity) + 1; + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + IGhoSteward.Debounce memory timelocksBefore = GHO_STEWARD.getTimelock(); + + vm.expectEmit(true, true, true, false, address(GHO_TOKEN)); + emit FacilitatorBucketCapacityUpdated(address(GHO_ATOKEN), oldCapacity, newCapacity); + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBucketCapacity(newCapacity); + + (uint256 capacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + assertEq(capacity, newCapacity); + IGhoSteward.Debounce memory timelocks = GHO_STEWARD.getTimelock(); + assertEq(timelocks.borrowRateLastUpdated, timelocksBefore.borrowRateLastUpdated); + assertEq(timelocks.bucketCapacityLastUpdated, block.timestamp); + } + + function testUpdateBucketCapacityIdempotent() public { + (uint256 oldCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + IGhoSteward.Debounce memory timelocksBefore = GHO_STEWARD.getTimelock(); + + vm.expectEmit(true, true, true, false, address(GHO_TOKEN)); + emit FacilitatorBucketCapacityUpdated(address(GHO_ATOKEN), oldCapacity, oldCapacity); + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBucketCapacity(uint128(oldCapacity)); + + (uint256 capacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + assertEq(capacity, oldCapacity); + IGhoSteward.Debounce memory timelocks = GHO_STEWARD.getTimelock(); + assertEq(timelocks.borrowRateLastUpdated, timelocksBefore.borrowRateLastUpdated); + assertEq(timelocks.bucketCapacityLastUpdated, block.timestamp); + } + + function testUpdateBucketCapacityMaximumIncrease() public { + (uint256 oldCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + uint128 newCapacity = uint128(oldCapacity * 2); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + IGhoSteward.Debounce memory timelocksBefore = GHO_STEWARD.getTimelock(); + + vm.expectEmit(true, true, true, false, address(GHO_TOKEN)); + emit FacilitatorBucketCapacityUpdated(address(GHO_ATOKEN), oldCapacity, newCapacity); + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBucketCapacity(newCapacity); + + (uint256 capacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + assertEq(capacity, newCapacity); + IGhoSteward.Debounce memory timelocks = GHO_STEWARD.getTimelock(); + assertEq(timelocks.borrowRateLastUpdated, timelocksBefore.borrowRateLastUpdated); + assertEq(timelocks.bucketCapacityLastUpdated, block.timestamp); + } + + function testRevertUpdateBucketCapacityUnauthorized() public { + vm.expectRevert('INVALID_CALLER'); + GHO_STEWARD.updateBucketCapacity(123); + } + + function testRevertUpdateBucketCapacityExpiredSteward() public { + vm.warp(block.timestamp + GHO_STEWARD.getStewardExpiration()); + vm.prank(RISK_COUNCIL); + vm.expectRevert('STEWARD_EXPIRED'); + GHO_STEWARD.updateBucketCapacity(123); + } + + function testRevertUpdateBucketCapacityDebounceNotRespectedAtLaunch() public { + vm.warp(GHO_STEWARD.MINIMUM_DELAY()); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD.updateBucketCapacity(123); + } + + function testRevertUpdateBucketCapacityDebounceNotRespected() public { + // first bucket capacity update + (uint256 oldCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + vm.prank(RISK_COUNCIL); + GHO_STEWARD.updateBucketCapacity(uint128(oldCapacity)); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD.updateBucketCapacity(123); + } + + function testRevertUpdateBucketCapacityGhoATokenNotFound() public { + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + DataTypes.ReserveData memory mockData = POOL.getReserveData(address(GHO_TOKEN)); + mockData.aTokenAddress = address(0); + vm.mockCall( + address(POOL), + abi.encodeWithSelector(IPool.getReserveData.selector, address(GHO_TOKEN)), + abi.encode(mockData) + ); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('GHO_ATOKEN_NOT_FOUND'); + GHO_STEWARD.updateBucketCapacity(123); + } + + function testRevertUpdateBucketCapacityAboveMaximumIncrease() public { + (uint256 oldCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + uint128 newCapacity = uint128(oldCapacity * 2 + 1); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUCKET_CAPACITY_UPDATE'); + GHO_STEWARD.updateBucketCapacity(newCapacity); + } + + function testRevertUpdateBucketCapacityBelowMaximumDecrease() public { + (uint256 oldCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + uint128 newCapacity = uint128(oldCapacity - 1); + vm.warp(GHO_STEWARD.MINIMUM_DELAY() + 1); + + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUCKET_CAPACITY_UPDATE'); + GHO_STEWARD.updateBucketCapacity(newCapacity); + } +} diff --git a/src/test/TestGhoStewardV2.t.sol b/src/test/TestGhoStewardV2.t.sol new file mode 100644 index 00000000..e39b80bf --- /dev/null +++ b/src/test/TestGhoStewardV2.t.sol @@ -0,0 +1,767 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import './TestGhoBase.t.sol'; + +contract TestGhoStewardV2 is TestGhoBase { + using ReserveConfiguration for DataTypes.ReserveConfigurationMap; + + function setUp() public { + /// @dev Since block.timestamp starts at 0 this is a necessary condition (block.timestamp > `MINIMUM_DELAY`) for the timelocked contract methods to work. + vm.warp(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + } + + function testConstructor() public { + assertEq(GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX(), GHO_BORROW_RATE_CHANGE_MAX); + assertEq(GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(), GSM_FEE_RATE_CHANGE_MAX); + assertEq(GHO_STEWARD_V2.GHO_BORROW_RATE_MAX(), GHO_BORROW_RATE_MAX); + assertEq(GHO_STEWARD_V2.MINIMUM_DELAY(), MINIMUM_DELAY_V2); + + assertEq(GHO_STEWARD.owner(), SHORT_EXECUTOR); + assertEq(GHO_STEWARD_V2.POOL_ADDRESSES_PROVIDER(), address(PROVIDER)); + assertEq(GHO_STEWARD_V2.GHO_TOKEN(), address(GHO_TOKEN)); + assertEq(GHO_STEWARD_V2.FIXED_RATE_STRATEGY_FACTORY(), address(FIXED_RATE_STRATEGY_FACTORY)); + assertEq(GHO_STEWARD_V2.RISK_COUNCIL(), RISK_COUNCIL); + + IGhoStewardV2.GhoDebounce memory ghoTimelocks = GHO_STEWARD_V2.getGhoTimelocks(); + assertEq(ghoTimelocks.ghoBorrowCapLastUpdate, 0); + assertEq(ghoTimelocks.ghoBorrowRateLastUpdate, 0); + + address[] memory controlledFacilitators = GHO_STEWARD_V2.getControlledFacilitators(); + assertEq(controlledFacilitators.length, 2); + + uint40 facilitatorTimelock = GHO_STEWARD_V2.getFacilitatorBucketCapacityTimelock( + controlledFacilitators[0] + ); + assertEq(facilitatorTimelock, 0); + + address[] memory gsmFeeStrategies = GHO_STEWARD_V2.getGsmFeeStrategies(); + assertEq(gsmFeeStrategies.length, 0); + } + + function testRevertConstructorInvalidExecutor() public { + vm.expectRevert('INVALID_OWNER'); + new GhoStewardV2(address(0), address(0x002), address(0x003), address(0x004), address(0x005)); + } + + function testRevertConstructorInvalidAddressesProvider() public { + vm.expectRevert('INVALID_ADDRESSES_PROVIDER'); + new GhoStewardV2(address(0x001), address(0), address(0x003), address(0x004), address(0x005)); + } + + function testRevertConstructorInvalidGhoToken() public { + vm.expectRevert('INVALID_GHO_TOKEN'); + new GhoStewardV2(address(0x001), address(0x002), address(0), address(0x004), address(0x005)); + } + + function testRevertConstructorInvalidFixedRateStrategyFactory() public { + vm.expectRevert('INVALID_FIXED_RATE_STRATEGY_FACTORY'); + new GhoStewardV2(address(0x001), address(0x002), address(0x003), address(0), address(0x005)); + } + + function testRevertConstructorInvalidRiskCouncil() public { + vm.expectRevert('INVALID_RISK_COUNCIL'); + new GhoStewardV2(address(0x001), address(0x002), address(0x003), address(0x005), address(0)); + } + + function testUpdateFacilitatorBucketCapacity() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.prank(RISK_COUNCIL); + uint128 newBucketCapacity = uint128(currentBucketCapacity) + 1; + GHO_STEWARD_V2.updateFacilitatorBucketCapacity(address(GHO_ATOKEN), newBucketCapacity); + (uint256 capacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + assertEq(newBucketCapacity, capacity); + } + + function testUpdateFacilitatorBucketCapacityMaxValue() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + uint128 newBucketCapacity = uint128(currentBucketCapacity * 2); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity(address(GHO_ATOKEN), newBucketCapacity); + (uint256 capacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + assertEq(capacity, newBucketCapacity); + } + + function testUpdateFacilitatorBucketCapacityTimelock() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + uint128(currentBucketCapacity) + 1 + ); + uint40 timelock = GHO_STEWARD_V2.getFacilitatorBucketCapacityTimelock(address(GHO_ATOKEN)); + assertEq(timelock, block.timestamp); + } + + function testUpdateFacilitatorBucketCapacityAfterTimelock() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.prank(RISK_COUNCIL); + uint128 newBucketCapacity = uint128(currentBucketCapacity) + 1; + GHO_STEWARD_V2.updateFacilitatorBucketCapacity(address(GHO_ATOKEN), newBucketCapacity); + skip(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + uint128 newBucketCapacityAfterTimelock = newBucketCapacity + 1; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + newBucketCapacityAfterTimelock + ); + (uint256 capacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + assertEq(capacity, newBucketCapacityAfterTimelock); + } + + function testRevertUpdateFacilitatorBucketCapacityIfUnauthorized() public { + vm.expectRevert('INVALID_CALLER'); + vm.prank(ALICE); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity(address(GHO_ATOKEN), 123); + } + + function testRevertUpdateFaciltatorBucketCapacityIfUpdatedTooSoon() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + uint128(currentBucketCapacity) + 1 + ); + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + uint128(currentBucketCapacity) + 2 + ); + } + + function testRevertUpdateFacilitatorBucketCapacityIfFacilitatorNotInControl() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_GSM_4626)); + vm.prank(RISK_COUNCIL); + vm.expectRevert('FACILITATOR_NOT_CONTROLLED'); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_GSM_4626), + uint128(currentBucketCapacity) + 1 + ); + } + + function testRevertUpdateFacilitatorBucketCapacityIfStewardLostBucketManagerRole() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + GHO_TOKEN.revokeRole(GHO_TOKEN_BUCKET_MANAGER_ROLE, address(GHO_STEWARD_V2)); + vm.expectRevert( + AccessControlErrorsLib.MISSING_ROLE(GHO_TOKEN_BUCKET_MANAGER_ROLE, address(GHO_STEWARD_V2)) + ); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + uint128(currentBucketCapacity) + 1 + ); + } + + function testRevertUpdateFacilitatorBucketCapacityIfValueLowerThanCurrent() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUCKET_CAPACITY_UPDATE'); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + uint128(currentBucketCapacity) - 1 + ); + } + + function testRevertUpdateFacilitatorBucketCapacityIfMoreThanDouble() public { + (uint256 currentBucketCapacity, ) = GHO_TOKEN.getFacilitatorBucket(address(GHO_ATOKEN)); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUCKET_CAPACITY_UPDATE'); + GHO_STEWARD_V2.updateFacilitatorBucketCapacity( + address(GHO_ATOKEN), + uint128(currentBucketCapacity * 2) + 1 + ); + } + + function testUpdateGhoBorrowCap() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + uint256 newBorrowCap = oldBorrowCap + 1; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowCap(newBorrowCap); + uint256 currentBorrowCap = _getGhoBorrowCap(); + assertEq(newBorrowCap, currentBorrowCap); + } + + function testUpdateGhoBorrowCapMaxValue() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + uint256 newBorrowCap = oldBorrowCap * 2; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowCap(newBorrowCap); + uint256 currentBorrowCap = _getGhoBorrowCap(); + assertEq(newBorrowCap, currentBorrowCap); + } + + function testUpdateGhoBorrowCapTimelock() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowCap(oldBorrowCap + 1); + IGhoStewardV2.GhoDebounce memory ghoTimelocks = GHO_STEWARD_V2.getGhoTimelocks(); + assertEq(ghoTimelocks.ghoBorrowCapLastUpdate, block.timestamp); + } + + function testUpdateGhoBorrowCapAfterTimelock() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowCap(oldBorrowCap + 1); + skip(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + uint256 newBorrowCap = oldBorrowCap + 2; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowCap(newBorrowCap); + uint256 currentBorrowCap = _getGhoBorrowCap(); + assertEq(newBorrowCap, currentBorrowCap); + } + + function testRevertUpdateGhoBorrowCapIfUnauthorized() public { + vm.prank(ALICE); + vm.expectRevert('INVALID_CALLER'); + GHO_STEWARD_V2.updateGhoBorrowCap(50e6); + } + + function testRevertUpdateGhoBorrowCapIfUpdatedTooSoon() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowCap(oldBorrowCap + 1); + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD_V2.updateGhoBorrowCap(oldBorrowCap + 2); + } + + function testRevertUpdateGhoBorrowCapIfValueLowerThanCurrent() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BORROW_CAP_UPDATE'); + GHO_STEWARD_V2.updateGhoBorrowCap(oldBorrowCap - 1); + } + + function testRevertUpdateGhoBorrowCapIfValueMoreThanDouble() public { + uint256 oldBorrowCap = 1e6; + _setGhoBorrowCapViaConfigurator(oldBorrowCap); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BORROW_CAP_UPDATE'); + GHO_STEWARD_V2.updateGhoBorrowCap(oldBorrowCap * 2 + 1); + } + + function testUpdateGhoBorrowRate() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + uint256 newBorrowRate = oldBorrowRate + 1; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + uint256 currentBorrowRate = _getGhoBorrowRate(); + assertEq(currentBorrowRate, newBorrowRate); + } + + function testUpdateGhoBorrowRateMaxValue() public { + uint256 ghoBorrowRateMax = GHO_STEWARD_V2.GHO_BORROW_RATE_MAX(); + (, uint256 oldBorrowRate) = _setGhoBorrowRateViaConfigurator(ghoBorrowRateMax - 1); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(ghoBorrowRateMax); + uint256 currentBorrowRate = _getGhoBorrowRate(); + assertEq(currentBorrowRate, ghoBorrowRateMax); + } + + function testUpdateGhoBorrowRateMaxIncrement() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + uint256 newBorrowRate = oldBorrowRate + GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + uint256 currentBorrowRate = _getGhoBorrowRate(); + assertEq(currentBorrowRate, newBorrowRate); + } + + function testUpdateGhoBorrowRateDecrement() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + uint256 newBorrowRate = oldBorrowRate - 1; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + uint256 currentBorrowRate = _getGhoBorrowRate(); + assertEq(currentBorrowRate, newBorrowRate); + } + + function testUpdateGhoBorrowRateMaxDecrement() public { + vm.startPrank(RISK_COUNCIL); + + // set a high borrow rate + GHO_STEWARD_V2.updateGhoBorrowRate(GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX() + 1); + vm.warp(block.timestamp + GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + + uint256 oldBorrowRate = _getGhoBorrowRate(); + uint256 newBorrowRate = oldBorrowRate - GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX(); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + uint256 currentBorrowRate = _getGhoBorrowRate(); + assertEq(currentBorrowRate, newBorrowRate); + + vm.stopPrank(); + } + + function testUpdateGhoBorrowRateTimelock() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(oldBorrowRate + 1); + IGhoStewardV2.GhoDebounce memory ghoTimelocks = GHO_STEWARD_V2.getGhoTimelocks(); + assertEq(ghoTimelocks.ghoBorrowRateLastUpdate, block.timestamp); + } + + function testUpdateGhoBorrowRateAfterTimelock() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(oldBorrowRate + 1); + skip(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + uint256 newBorrowRate = oldBorrowRate + 2; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + uint256 currentBorrowRate = _getGhoBorrowRate(); + assertEq(currentBorrowRate, newBorrowRate); + } + + function testRevertUpdateGhoBorrowRateIfUnauthorized() public { + vm.expectRevert('INVALID_CALLER'); + vm.prank(ALICE); + GHO_STEWARD_V2.updateGhoBorrowRate(0.07e4); + } + + function testRevertUpdateGhoBorrowRateIfUpdatedTooSoon() public { + address oldInterestStrategy = POOL.getReserveInterestRateStrategyAddress(address(GHO_TOKEN)); + uint256 oldBorrowRate = GhoInterestRateStrategy(oldInterestStrategy) + .getBaseVariableBorrowRate(); + vm.prank(RISK_COUNCIL); + uint256 newBorrowRate = oldBorrowRate + 1; + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + } + + function testRevertUpdateGhoBorrowRateIfInterestRateNotFound() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + DataTypes.ReserveData memory mockData = POOL.getReserveData(address(GHO_TOKEN)); + mockData.interestRateStrategyAddress = address(0); + vm.mockCall( + address(POOL), + abi.encodeWithSelector(IPool.getReserveData.selector, address(GHO_TOKEN)), + abi.encode(mockData) + ); + vm.expectRevert('GHO_INTEREST_RATE_STRATEGY_NOT_FOUND'); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGhoBorrowRate(oldBorrowRate + 1); + } + + function testRevertUpdateGhoBorrowRateIfValueMoreThanMax() public { + uint256 maxGhoBorrowRate = GHO_STEWARD_V2.GHO_BORROW_RATE_MAX(); + _setGhoBorrowRateViaConfigurator(maxGhoBorrowRate); + vm.prank(RISK_COUNCIL); + vm.expectRevert('BORROW_RATE_HIGHER_THAN_MAX'); + GHO_STEWARD_V2.updateGhoBorrowRate(maxGhoBorrowRate + 1); + } + + function testRevertUpdateGhoBorrowRateIfMaxExceededUpwards() public { + uint256 oldBorrowRate = _getGhoBorrowRate(); + uint256 newBorrowRate = oldBorrowRate + GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX() + 1; + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BORROW_RATE_UPDATE'); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + } + + function testRevertUpdateGhoBorrowRateIfMaxExceededDownwards() public { + vm.startPrank(RISK_COUNCIL); + + // set a high borrow rate + GHO_STEWARD_V2.updateGhoBorrowRate(GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX() + 1); + vm.warp(block.timestamp + GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + + uint256 oldBorrowRate = _getGhoBorrowRate(); + uint256 newBorrowRate = oldBorrowRate - GHO_STEWARD_V2.GHO_BORROW_RATE_CHANGE_MAX() - 1; + vm.expectRevert('INVALID_BORROW_RATE_UPDATE'); + GHO_STEWARD_V2.updateGhoBorrowRate(newBorrowRate); + + vm.stopPrank(); + } + + function testUpdateGsmExposureCap() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + vm.prank(RISK_COUNCIL); + uint128 newExposureCap = oldExposureCap + 1; + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), newExposureCap); + uint128 currentExposureCap = GHO_GSM.getExposureCap(); + assertEq(currentExposureCap, newExposureCap); + } + + function testUpdateGsmExposureCapMaxValue() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + uint128 newExposureCap = oldExposureCap * 2; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), newExposureCap); + uint128 currentExposureCap = GHO_GSM.getExposureCap(); + assertEq(currentExposureCap, newExposureCap); + } + + function testUpdateGsmExposureCapTimelock() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap + 1); + IGhoStewardV2.GsmDebounce memory timelocks = GHO_STEWARD_V2.getGsmTimelocks(address(GHO_GSM)); + assertEq(timelocks.gsmExposureCapLastUpdated, block.timestamp); + } + + function testUpdateGsmExposureCapAfterTimelock() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap + 1); + skip(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + uint128 newExposureCap = oldExposureCap + 2; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), newExposureCap); + uint128 currentExposureCap = GHO_GSM.getExposureCap(); + assertEq(currentExposureCap, newExposureCap); + } + + function testRevertUpdateGsmExposureCapIfUnauthorized() public { + vm.expectRevert('INVALID_CALLER'); + vm.prank(ALICE); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), 50_000_000e18); + } + + function testRevertUpdateGsmExposureCapIfTooSoon() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap + 1); + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap + 2); + } + + function testRevertUpdateGsmExposureCapIfValueLowerThanCurrent() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_EXPOSURE_CAP_UPDATE'); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap - 1); + } + + function testRevertUpdateGsmExposureCapIfValueMoreThanDouble() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_EXPOSURE_CAP_UPDATE'); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap * 2 + 1); + } + + function testRevertUpdateGsmExposureCapIfStewardLostConfiguratorRole() public { + uint128 oldExposureCap = GHO_GSM.getExposureCap(); + GHO_GSM.revokeRole(GSM_CONFIGURATOR_ROLE, address(GHO_STEWARD_V2)); + vm.expectRevert( + AccessControlErrorsLib.MISSING_ROLE(GSM_CONFIGURATOR_ROLE, address(GHO_STEWARD_V2)) + ); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmExposureCap(address(GHO_GSM), oldExposureCap + 1); + } + + function testUpdateGsmBuySellFeesBuyFee() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); + assertEq(newBuyFee, buyFee + 1); + } + + function testUpdateGsmBuySellFeesBuyFeeMax() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + uint256 maxFeeUpdate = GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + maxFeeUpdate, sellFee); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); + assertEq(newBuyFee, buyFee + maxFeeUpdate); + } + + function testUpdateGsmBuySellFeesSellFee() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee, sellFee + 1); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 newSellFee = IGsmFeeStrategy(newStrategy).getSellFee(1e4); + assertEq(newSellFee, sellFee + 1); + } + + function testUpdateGsmBuySellFeesSellFeeMax() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + uint256 maxFeeUpdate = GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee, sellFee + maxFeeUpdate); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 newSellFee = IGsmFeeStrategy(newStrategy).getSellFee(1e4); + assertEq(newSellFee, sellFee + maxFeeUpdate); + } + + function testUpdateGsmBuySellFeesBothFees() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); + uint256 newSellFee = IGsmFeeStrategy(newStrategy).getSellFee(1e4); + assertEq(newBuyFee, buyFee + 1); + assertEq(newSellFee, sellFee + 1); + } + + function testUpdateGsmBuySellFeesBothFeesMax() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + uint256 maxFeeUpdate = GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees( + address(GHO_GSM), + buyFee + maxFeeUpdate, + sellFee + maxFeeUpdate + ); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 newBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); + uint256 newSellFee = IGsmFeeStrategy(newStrategy).getSellFee(1e4); + assertEq(newBuyFee, buyFee + maxFeeUpdate); + assertEq(newSellFee, sellFee + maxFeeUpdate); + } + + function testUpdateGsmBuySellFeesTimelock() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + IGhoStewardV2.GsmDebounce memory timelocks = GHO_STEWARD_V2.getGsmTimelocks(address(GHO_GSM)); + assertEq(timelocks.gsmFeeStrategyLastUpdated, block.timestamp); + } + + function testUpdateGsmBuySellFeesAfterTimelock() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + skip(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + uint256 newBuyFee = buyFee + 2; + uint256 newSellFee = sellFee + 2; + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), newBuyFee, newSellFee); + address newStrategy = GHO_GSM.getFeeStrategy(); + uint256 currentBuyFee = IGsmFeeStrategy(newStrategy).getBuyFee(1e4); + uint256 currentSellFee = IGsmFeeStrategy(newStrategy).getSellFee(1e4); + assertEq(currentBuyFee, newBuyFee); + assertEq(currentSellFee, newSellFee); + } + + function testUpdateGsmBuySellFeesNewStrategy() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + address[] memory cachedStrategies = GHO_STEWARD_V2.getGsmFeeStrategies(); + assertEq(cachedStrategies.length, 1); + address newStrategy = GHO_GSM.getFeeStrategy(); + assertEq(newStrategy, cachedStrategies[0]); + } + + function testUpdateGsmBuySellFeesSameStrategy() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + address oldStrategy = GHO_GSM.getFeeStrategy(); + skip(GHO_STEWARD_V2.MINIMUM_DELAY() + 1); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + address[] memory cachedStrategies = GHO_STEWARD_V2.getGsmFeeStrategies(); + assertEq(cachedStrategies.length, 1); + address newStrategy = GHO_GSM.getFeeStrategy(); + assertEq(oldStrategy, newStrategy); + } + + function testRevertUpdateGsmBuySellFeesIfUnauthorized() public { + vm.prank(ALICE); + vm.expectRevert('INVALID_CALLER'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), 0.01e4, 0.01e4); + } + + function testRevertUpdateGsmBuySellFeesIfTooSoon() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + vm.prank(RISK_COUNCIL); + vm.expectRevert('DEBOUNCE_NOT_RESPECTED'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 2, sellFee + 2); + } + + function testRevertUpdateGsmBuySellFeesIfStrategyNotFound() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.mockCall( + address(GHO_GSM), + abi.encodeWithSelector(GHO_GSM.getFeeStrategy.selector), + abi.encode(address(0)) + ); + vm.expectRevert('GSM_FEE_STRATEGY_NOT_FOUND'); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + } + + function testRevertUpdateGsmBuySellFeesIfBuyFeeDecrement() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUY_FEE_UPDATE'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee - 1, sellFee); + } + + function testRevertUpdateGsmBuySellFeesIfSellFeeDecrement() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_SELL_FEE_UPDATE'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee, sellFee - 1); + } + + function testRevertUpdateGsmBuySellFeesIfBothDecrement() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUY_FEE_UPDATE'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee - 1, sellFee - 1); + } + + function testRevertUpdateGsmBuySellFeesIfBuyFeeMoreThanMax() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 maxFeeUpdate = GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUY_FEE_UPDATE'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + maxFeeUpdate + 1, sellFee); + } + + function testRevertUpdateGsmBuySellFeesIfSellFeeMoreThanMax() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 maxFeeUpdate = GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_SELL_FEE_UPDATE'); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee, sellFee + maxFeeUpdate + 1); + } + + function testRevertUpdateGsmBuySellFeesIfBothMoreThanMax() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 maxFeeUpdate = GHO_STEWARD_V2.GSM_FEE_RATE_CHANGE_MAX(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + vm.prank(RISK_COUNCIL); + vm.expectRevert('INVALID_BUY_FEE_UPDATE'); + GHO_STEWARD_V2.updateGsmBuySellFees( + address(GHO_GSM), + buyFee + maxFeeUpdate + 1, + sellFee + maxFeeUpdate + 1 + ); + } + + function testRevertUpdateGsmBuySellFeesIfStewardLostConfiguratorRole() public { + address feeStrategy = GHO_GSM.getFeeStrategy(); + uint256 buyFee = IGsmFeeStrategy(feeStrategy).getBuyFee(1e4); + uint256 sellFee = IGsmFeeStrategy(feeStrategy).getSellFee(1e4); + GHO_GSM.revokeRole(GSM_CONFIGURATOR_ROLE, address(GHO_STEWARD_V2)); + vm.expectRevert( + AccessControlErrorsLib.MISSING_ROLE(GSM_CONFIGURATOR_ROLE, address(GHO_STEWARD_V2)) + ); + vm.prank(RISK_COUNCIL); + GHO_STEWARD_V2.updateGsmBuySellFees(address(GHO_GSM), buyFee + 1, sellFee + 1); + } + + function testSetControlledFacilitatorAdd() public { + address[] memory oldControlledFacilitators = GHO_STEWARD_V2.getControlledFacilitators(); + address[] memory newGsmList = new address[](1); + newGsmList[0] = address(GHO_GSM_4626); + vm.prank(SHORT_EXECUTOR); + GHO_STEWARD_V2.setControlledFacilitator(newGsmList, true); + address[] memory newControlledFacilitators = GHO_STEWARD_V2.getControlledFacilitators(); + assertEq(newControlledFacilitators.length, oldControlledFacilitators.length + 1); + assertTrue(_contains(newControlledFacilitators, address(GHO_GSM_4626))); + } + + function testSetControlledFacilitatorsRemove() public { + address[] memory oldControlledFacilitators = GHO_STEWARD_V2.getControlledFacilitators(); + address[] memory disableGsmList = new address[](1); + disableGsmList[0] = address(GHO_GSM); + vm.prank(SHORT_EXECUTOR); + GHO_STEWARD_V2.setControlledFacilitator(disableGsmList, false); + address[] memory newControlledFacilitators = GHO_STEWARD_V2.getControlledFacilitators(); + assertEq(newControlledFacilitators.length, oldControlledFacilitators.length - 1); + assertFalse(_contains(newControlledFacilitators, address(GHO_GSM))); + } + + function testRevertSetControlledFacilitatorIfUnauthorized() public { + vm.expectRevert(OwnableErrorsLib.CALLER_NOT_OWNER()); + vm.prank(RISK_COUNCIL); + address[] memory newGsmList = new address[](1); + newGsmList[0] = address(GHO_GSM_4626); + GHO_STEWARD_V2.setControlledFacilitator(newGsmList, true); + } + + function _setGhoBorrowCapViaConfigurator(uint256 newBorrowCap) internal { + CONFIGURATOR.setBorrowCap(address(GHO_TOKEN), newBorrowCap); + } + + function _setGhoBorrowRateViaConfigurator( + uint256 newBorrowRate + ) internal returns (GhoInterestRateStrategy, uint256) { + GhoInterestRateStrategy newRateStrategy = new GhoInterestRateStrategy( + address(PROVIDER), + newBorrowRate + ); + CONFIGURATOR.setReserveInterestRateStrategyAddress( + address(GHO_TOKEN), + address(newRateStrategy) + ); + address currentInterestRateStrategy = POOL.getReserveInterestRateStrategyAddress( + address(GHO_TOKEN) + ); + uint256 currentBorrowRate = GhoInterestRateStrategy(currentInterestRateStrategy) + .getBaseVariableBorrowRate(); + assertEq(currentInterestRateStrategy, address(newRateStrategy)); + assertEq(currentBorrowRate, newBorrowRate); + return (newRateStrategy, newBorrowRate); + } + + function _getGhoBorrowRate() internal view returns (uint256) { + address currentInterestRateStrategy = POOL.getReserveInterestRateStrategyAddress( + address(GHO_TOKEN) + ); + return GhoInterestRateStrategy(currentInterestRateStrategy).getBaseVariableBorrowRate(); + } + + function _getGhoBorrowCap() internal view returns (uint256) { + DataTypes.ReserveConfigurationMap memory configuration = POOL.getConfiguration( + address(GHO_TOKEN) + ); + return configuration.getBorrowCap(); + } +}

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