From 48e1b1ca6ecec4027776394879d6996c287f8626 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 7 Aug 2024 12:51:08 +0800 Subject: [PATCH 01/43] Changed `deploy:ci` to deploy to Arbitrum Sepolia Removed the `db-export` from `deploy:ci` as it is a post-deploy operation and is invoked from the makefile. Removed `tsc` from `gen-types` and added it to `build` as a more natural fit. --- packages/contracts/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index defa086f2..780666451 100755 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -8,15 +8,15 @@ "chain": "yarn rm-dbdata && anvil --config-out localhost.json", "clean": "forge clean && rm -rf broadcast cache deployments types localhost.json index.js", "dev": "yarn rm-dbdata && anvil --config-out localhost.json & make deploy-local", - "build": "forge build && yarn gen-types", + "build": "forge build && yarn gen-types && tsc", "test": "forge test", "format": "forge fmt && prettier './script/**/*.js' --write", "lint": "forge fmt && eslint --fix --ignore-path .gitignore && yarn solhint './*(test|src)/**/*.sol'", "db-check": "tsc && node ./script/utils/checkDb.js", "db-export": "tsc && node ./script/utils/exporter.js", "deploy": "make deploy-local", - "deploy:ci": "yarn db-export && make deploy-baseSepolia", - "gen-types": "yarn typechain --target ethers-v5 --out-dir ./types ./out/*.sol/*.json && tsc", + "deploy:ci": "make deploy-arbitrumSepolia", + "gen-types": "yarn typechain --target ethers-v5 --out-dir ./types ./out/*.sol/*.json", "postinstall": "yarn build && yarn gen-types" }, "packageManager": "yarn@3.2.3", From 2863b1085630eae5cf675ee9e4fa4f8e2c0a61f7 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 7 Aug 2024 12:51:22 +0800 Subject: [PATCH 02/43] Only formatted. --- packages/contracts/foundry.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 78f0a5257..e47db9757 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -3,7 +3,7 @@ src = "src" out = "out" libs = ["lib"] fs_permissions = [{ access = "read-write", path = "./" }] -solc_version="0.8.23" +solc_version = "0.8.23" [fmt] bracket_spacing = true @@ -25,9 +25,9 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" [etherscan] -localhost = { key = "" , url="http://127.0.0.1:8545"} +localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -arbitrumSepolia = { key = "${ARB_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain=421614 } -bitlayer = { key = "bitlayer", url="https://rpc.bitlayer.org" } -bitlayerTestnet = { key = "bitlayerTestnet", url="https://testnet-scan.bitlayer.org" } +arbitrumSepolia = { key = "${ARB_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } +bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } +bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } From 63a105d5d42fc8afa35c05b58607ed52e0ef15d2 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 7 Aug 2024 12:51:37 +0800 Subject: [PATCH 03/43] Changed the Network Id to Arbitrum Sepolia. --- packages/contracts/resource/testnet.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/resource/testnet.toml b/packages/contracts/resource/testnet.toml index 0be6685c8..d916272b3 100644 --- a/packages/contracts/resource/testnet.toml +++ b/packages/contracts/resource/testnet.toml @@ -4,7 +4,7 @@ [evm] # blockchain id, e.g. baseSepolia=84532, arbSepolia=421614 -chain_id = 84532 +chain_id = 421614 deploy_mocks = true [evm.address] From aef04a0286a42aa89dba5ea090679c6c09993327 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 7 Aug 2024 12:52:52 +0800 Subject: [PATCH 04/43] Renamed `deploy-arbSepolia` to the full-name `deploy-arbitrumSepolia` Added `yarn` `clean` and `build` to the generic `deploy` target so all deployments are clean. --- packages/contracts/Makefile | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 12a7d3c24..f0d9fd155 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -1,39 +1,36 @@ -# NOTE (JL,2024-05-20): Hierarchical Environment loading does not simply work with `make`. A custom -# solution may be possible, but given that `forge` auto-loads any `.env` file in the invocation +# NOTE (JL,2024-05-20): Hierarchical Environment loading does not simply work with `make`. A custom +# solution may be possible, but given that `forge` auto-loads any `.env` file in the invocation # directory and our deployment scripts depend on this, it seems unnecessary to change this now. -include .env -build:; forge build - -anvil: anvil - deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= # TODO: change this to use the network config from foundry.toml -deploy-arbSepolia: +deploy-arbitrumSepolia: $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow" -resume-arbSepolia: +resume-arbitrumSepolia: $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --resume" deploy-baseSepolia: $(MAKE) deploy RPC_URL=baseSepolia EXTRA_FLAGS="--verify --slow" +# TODO: add --verifier flag. forge isn't happy --etherscan-api-key is empty. +deploy-bitlayerTestnet: + $(MAKE) deploy RPC_URL="https://testnet-rpc.bitlayer.org" \ + EXTRA_FLAGS='--etherscan-api-key "" --verifier-url "https://testnet-scan.bitlayer.org" --legacy --slow' + # NOTE (JL,2024-05-20): `forge` auto-includes any `.env` file in the invocation directory. deploy: @echo "Running deploy '$(RPC_URL)' for '$(ENVIRONMENT)' environment." - @rm -rf out && \ + @yarn clean + @yarn build forge script script/DeployVaultFactory.s.sol:DeployVaultFactory --rpc-url $(RPC_URL) \ - --private-key $(DEPLOYER_PRIVATE_KEY) --broadcast $(EXTRA_FLAGS) -vvvv && \ - yarn gen-types && \ + --chain-id $$(cast chain-id --rpc-url $(RPC_URL)) --private-key $(DEPLOYER_PRIVATE_KEY) --broadcast \ + $(EXTRA_FLAGS) -vvvv yarn db-export -# TODO: add --verifier flag. forge isn't happy --etherscan-api-key is empty. -deploy-bitlayerTestnet: - $(MAKE) deploy RPC_URL="https://testnet-rpc.bitlayer.org" \ - EXTRA_FLAGS='--etherscan-api-key "" --verifier-url "https://testnet-scan.bitlayer.org" --legacy --slow' - verify: @echo "Running verify '$(RPC_URL)' for '$(ENVIRONMENT)' environment." rm -rf out && \ From 7818d7d16eeac33dc02220ed041e4a76345c9dde Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 7 Aug 2024 17:13:44 +0800 Subject: [PATCH 05/43] Enabled `deploy:ci` to deploy to Arbitrum Sepolia Tweaked foundry variables to match those added to GitHub Environment. Added the required variable mapping to GitHub Action Tweaked the `Makefile` to `clean` and `build` before deploy and resume. Added the DEPLOY_SCRIPT variable to the Makefile Added the DEPLOYER_AUTHENTICATION variable to the Makefile, defaulting to the PK parameter and env variable. But this simplifies deploying to testnet from local. --- .github/workflows/ci-dev-contracts.yml | 3 ++- packages/contracts/Makefile | 21 ++++++++++++--------- packages/contracts/foundry.toml | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index c3d5f59dc..38a201659 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -79,7 +79,8 @@ jobs: run: yarn deploy:ci env: ENVIRONMENT: "testnet" - DEPLOYER_PRIVATE_KEY: ${{ secrets.BASE_SEPOLIA_DEPLOYER_PRIVATE_KEY }} + DEPLOYER_PRIVATE_KEY: ${{ secrets.ARBITRUM_SEPOLIA_DEPLOYER_PRIVATE_KEY }} ALCHEMY_API_KEY: ${{ secrets.TESTNET_ALCHEMY_API_KEY }} BASE_SEPOLIA_ETHERSCAN_API_KEY: ${{ secrets.BASE_SEPOLIA_ETHERSCAN_API_KEY }} + ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY: ${{ secrets.ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY }} SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.TEST_SUPABASE_SERVICE_ROLE_KEY }} diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index f0d9fd155..087511538 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -3,6 +3,11 @@ # directory and our deployment scripts depend on this, it seems unnecessary to change this now. -include .env +DEPLOY_SCRIPT ?= script/DeployVaultFactory.s.sol:DeployVaultFactory + +# How the deployer is authenticated. Can override to use `cast wallet` output or `--account x --password y` etc. +DEPLOYER_AUTHENTICATION ?= --private-key $(DEPLOYER_PRIVATE_KEY) + deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= @@ -23,18 +28,16 @@ deploy-bitlayerTestnet: # NOTE (JL,2024-05-20): `forge` auto-includes any `.env` file in the invocation directory. deploy: - @echo "Running deploy '$(RPC_URL)' for '$(ENVIRONMENT)' environment." + @echo "Running deploy script '$(DEPLOY_SCRIPT)' against '$(RPC_URL)' for '$(ENVIRONMENT)' environment." @yarn clean @yarn build - forge script script/DeployVaultFactory.s.sol:DeployVaultFactory --rpc-url $(RPC_URL) \ - --chain-id $$(cast chain-id --rpc-url $(RPC_URL)) --private-key $(DEPLOYER_PRIVATE_KEY) --broadcast \ - $(EXTRA_FLAGS) -vvvv + forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) --chain-id $$(cast chain-id --rpc-url $(RPC_URL)) \ + $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv yarn db-export verify: - @echo "Running verify '$(RPC_URL)' for '$(ENVIRONMENT)' environment." - rm -rf out && \ - forge script script/DeployVaultFactory.s.sol:DeployVaultFactory --rpc-url $(RPC_URL) \ - --private-key $(DEPLOYER_PRIVATE_KEY) --verify --resume -vvvv && \ - yarn gen-types && \ + @echo "Running verify of script '$(DEPLOY_SCRIPT)' against '$(RPC_URL)' for '$(ENVIRONMENT)' environment." + @yarn clean + @yarn build + forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --verify --resume -vvvv yarn db-export diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index e47db9757..6521a94f4 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -28,6 +28,6 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -arbitrumSepolia = { key = "${ARB_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } +arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } From f4d09eddb07d8da845e4d777ebc702a82128c8f5 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 7 Aug 2024 17:31:25 +0800 Subject: [PATCH 06/43] Upgraded solhint to 5.0.3 due to error running it. --- packages/contracts/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 780666451..c3034e60c 100755 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -28,7 +28,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "prettier": "^3.2.2", - "solhint": "^5.0.1", + "solhint": "^5.0.3", "typechain": "^8.3.2", "typescript": "^5.4.5" }, diff --git a/yarn.lock b/yarn.lock index 9192e8a91..070939767 100644 --- a/yarn.lock +++ b/yarn.lock @@ -642,7 +642,7 @@ __metadata: ethers: ^5.7.2 js-toml: ^1.0.0 prettier: ^3.2.2 - solhint: ^5.0.1 + solhint: ^5.0.3 typechain: ^8.3.2 typescript: ^5.4.5 languageName: unknown @@ -15705,9 +15705,9 @@ __metadata: languageName: node linkType: hard -"solhint@npm:^5.0.1": - version: 5.0.1 - resolution: "solhint@npm:5.0.1" +"solhint@npm:^5.0.3": + version: 5.0.3 + resolution: "solhint@npm:5.0.3" dependencies: "@solidity-parser/parser": ^0.18.0 ajv: ^6.12.6 @@ -15733,7 +15733,7 @@ __metadata: optional: true bin: solhint: solhint.js - checksum: ff961f5e3e62172b6e26cda758b4b2e266cd07fdc32f280bfbafeb9eda99177326515aaeb5dfff531eeb03c01e432488783f4406439e7524c8da1afa0235a44e + checksum: 30361c0099cded492059719e477cecadcc7390f87a1737904411e8dbf15277344a5892e0762738a025cefd78467455601db1d7d6ffb3d489a6ab6e296c6a7b92 languageName: node linkType: hard From 23acada1423cd2310d4101ea85ab75074e11297f Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Thu, 8 Aug 2024 14:36:56 +0800 Subject: [PATCH 07/43] Added prefixed '@' to make commands to avoid outputting secret information. Added comments explaining some deployment discoveries. --- packages/contracts/Makefile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 087511538..df460bbad 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -11,7 +11,6 @@ DEPLOYER_AUTHENTICATION ?= --private-key $(DEPLOYER_PRIVATE_KEY) deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= -# TODO: change this to use the network config from foundry.toml deploy-arbitrumSepolia: $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow" @@ -27,17 +26,19 @@ deploy-bitlayerTestnet: EXTRA_FLAGS='--etherscan-api-key "" --verifier-url "https://testnet-scan.bitlayer.org" --legacy --slow' # NOTE (JL,2024-05-20): `forge` auto-includes any `.env` file in the invocation directory. +# NOTE (JL,2024-08-08): For verification, ensure that ETHERSCAN_API_KEY is explicitly set. +# NOTE (JL,2024-08-08): We run a `clean` and `build` to ensure the local build state is consistent. deploy: @echo "Running deploy script '$(DEPLOY_SCRIPT)' against '$(RPC_URL)' for '$(ENVIRONMENT)' environment." @yarn clean @yarn build - forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) --chain-id $$(cast chain-id --rpc-url $(RPC_URL)) \ - $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv - yarn db-export + @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv + @yarn db-export +# NOTE (JL,2024-08-08): Verify is a 'recovery' operation, requiring the `broadcast` directory contrents. So, no `clean`. +# Also, as such, we run `db-export` afterwards in case it resumed Contract Deployment. verify: @echo "Running verify of script '$(DEPLOY_SCRIPT)' against '$(RPC_URL)' for '$(ENVIRONMENT)' environment." - @yarn clean @yarn build - forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --verify --resume -vvvv - yarn db-export + @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --verify --resume -vvvv + @yarn db-export From 1af018f917b544da95863dfe3228ae54cfce8e7a Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Thu, 8 Aug 2024 19:34:29 +0800 Subject: [PATCH 08/43] Enabled Github Action for this branch. --- .github/workflows/ci-dev-contracts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 38a201659..0117a9e15 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -10,7 +10,7 @@ on: branches: - "main*" - "development*" - - "ops*" + - "deploy-ci-arb-*" paths: - "packages/contracts/**" - ".github/workflows/ci-dev-contracts.yml" From e9d39f1efdf9f684f2c8b01401323e66e054af85 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Thu, 8 Aug 2024 19:51:07 +0800 Subject: [PATCH 09/43] Added the ETHERSCAN_API_KEY explicitly. Removed the Base Sepolia key. --- .github/workflows/ci-dev-contracts.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 0117a9e15..34ac637c6 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -80,7 +80,7 @@ jobs: env: ENVIRONMENT: "testnet" DEPLOYER_PRIVATE_KEY: ${{ secrets.ARBITRUM_SEPOLIA_DEPLOYER_PRIVATE_KEY }} - ALCHEMY_API_KEY: ${{ secrets.TESTNET_ALCHEMY_API_KEY }} - BASE_SEPOLIA_ETHERSCAN_API_KEY: ${{ secrets.BASE_SEPOLIA_ETHERSCAN_API_KEY }} ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY: ${{ secrets.ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY }} + ETHERSCAN_API_KEY: ${{ secrets.ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY }} + ALCHEMY_API_KEY: ${{ secrets.TESTNET_ALCHEMY_API_KEY }} SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.TEST_SUPABASE_SERVICE_ROLE_KEY }} From 7596b208bbe49c07a89a90a7660dab54a8a435a3 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Thu, 8 Aug 2024 20:00:24 +0800 Subject: [PATCH 10/43] `exporter.js` now fails as a process, on Error. --- packages/contracts/script/utils/exporter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/contracts/script/utils/exporter.js b/packages/contracts/script/utils/exporter.js index ef2003c7b..a38faa73d 100755 --- a/packages/contracts/script/utils/exporter.js +++ b/packages/contracts/script/utils/exporter.js @@ -102,6 +102,7 @@ async function clearExistingData(client) { await exportAddress(loadConfiguration()); } catch (e) { console.log(e); + process.exitCode = 1; } finally { console.log(`Finished exporting contracts`); } From c0830e2af86c0678641e13dfcd178132cb0b87b4 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Thu, 8 Aug 2024 20:00:46 +0800 Subject: [PATCH 11/43] Upgraded to `actions@checkoutv4`. --- .github/workflows/ci-dev-contracts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 34ac637c6..29a8a2f5a 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -46,7 +46,7 @@ jobs: environment: testnet steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: recursive From 6aeb841e9fed51b1fd7ad5c3dac42af7d8c0f78e Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Thu, 8 Aug 2024 20:14:14 +0800 Subject: [PATCH 12/43] Remove the branch from the GitHub Action triggers. --- .github/workflows/ci-dev-contracts.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 29a8a2f5a..65d3f5b80 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -10,7 +10,6 @@ on: branches: - "main*" - "development*" - - "deploy-ci-arb-*" paths: - "packages/contracts/**" - ".github/workflows/ci-dev-contracts.yml" From d267f534e902626024287bf804ae3ed6ae9116c4 Mon Sep 17 00:00:00 2001 From: Ian Lucas Date: Thu, 8 Aug 2024 08:48:21 -0400 Subject: [PATCH 13/43] Specify Foundry version in Github actions. Later versions have Etherscan error issues --- .github/workflows/ci-dev-contracts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 65d3f5b80..2e2854434 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -52,7 +52,7 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly + version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 # re-run the tests here on purpose to ensure quality. - name: Run tests From 3a1a7be1e2bdf05d07dee10b06348ce86ac331be Mon Sep 17 00:00:00 2001 From: Ian Lucas Date: Thu, 8 Aug 2024 14:40:03 -0400 Subject: [PATCH 14/43] Update Arbitrum Sepolia to use Blockscout verify --- packages/contracts/Makefile | 4 ++-- packages/contracts/foundry.toml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index df460bbad..7b1eeeec1 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -12,10 +12,10 @@ deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= deploy-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow" + $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --verifier blockscout --slow" resume-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --resume" + $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --verifier blockscout --slow --resume" deploy-baseSepolia: $(MAKE) deploy RPC_URL=baseSepolia EXTRA_FLAGS="--verify --slow" diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 6521a94f4..6ade0a532 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -28,6 +28,7 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } +# Arbiscan: https://docs.arbiscan.io/getting-started/endpoint-urls; Blockscout: https://docs.blockscout.com/for-users/api/rpc-endpoints +arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://arbitrum-sepolia.blockscout.com/api", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } From 8dfd8e54aa9c3af72d29aca4c746add85a1d7d43 Mon Sep 17 00:00:00 2001 From: Ian Lucas Date: Fri, 9 Aug 2024 09:29:17 -0400 Subject: [PATCH 15/43] Revert "Update Arbitrum Sepolia to use Blockscout verify" This reverts commit 3a1a7be1e2bdf05d07dee10b06348ce86ac331be. --- packages/contracts/Makefile | 4 ++-- packages/contracts/foundry.toml | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 7b1eeeec1..df460bbad 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -12,10 +12,10 @@ deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= deploy-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --verifier blockscout --slow" + $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow" resume-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --verifier blockscout --slow --resume" + $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --resume" deploy-baseSepolia: $(MAKE) deploy RPC_URL=baseSepolia EXTRA_FLAGS="--verify --slow" diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 6ade0a532..6521a94f4 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -28,7 +28,6 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -# Arbiscan: https://docs.arbiscan.io/getting-started/endpoint-urls; Blockscout: https://docs.blockscout.com/for-users/api/rpc-endpoints -arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://arbitrum-sepolia.blockscout.com/api", chain = 421614 } +arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } From bae7c36669293ca754c2105fd6af999175d6759d Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Mon, 12 Aug 2024 14:54:02 +0800 Subject: [PATCH 16/43] Add a trailing ? to Arbitrum Sepolia Verifier URL. Just to try! --- packages/contracts/foundry.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 6521a94f4..e09ed1d6b 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -28,6 +28,6 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } +arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } From 02ad77c5647541092397f18372d09017057a9721 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Mon, 12 Aug 2024 16:24:36 +0800 Subject: [PATCH 17/43] Use nightly foundry again. --- .github/workflows/ci-dev-contracts.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 2e2854434..3d8270e5a 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -52,7 +52,8 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 + version: nightly + # version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 # re-run the tests here on purpose to ensure quality. - name: Run tests From db16cd9b19ae30d2b37c950a8a3f2b3acb9ace83 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Mon, 12 Aug 2024 17:08:25 +0800 Subject: [PATCH 18/43] Revert "Use nightly foundry again." This reverts commit 02ad77c5647541092397f18372d09017057a9721. --- .github/workflows/ci-dev-contracts.yml | 3 +-- packages/contracts/foundry.toml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 3d8270e5a..2e2854434 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -52,8 +52,7 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly - # version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 + version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 # re-run the tests here on purpose to ensure quality. - name: Run tests diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index e09ed1d6b..6521a94f4 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -28,6 +28,6 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } +arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } From 338daca8498c4bc6413ccd5f029d4f0b5ada724c Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 15:40:25 +0800 Subject: [PATCH 19/43] Added multiple Arbitrum Sepolia entries in foundry.toml. Use `arbitrum-sepolia` as the RPC URL. Separate deployment and verification of contracts to see if we can resolve the CloudFlare problem. --- packages/contracts/Makefile | 3 ++- packages/contracts/foundry.toml | 6 +++++- packages/contracts/script/utils/verifyContracts.sh | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100755 packages/contracts/script/utils/verifyContracts.sh diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index df460bbad..7393caed6 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -12,7 +12,8 @@ deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= deploy-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow" + $(MAKE) deploy RPC_URL=arbitrum-sepolia EXTRA_FLAGS="--slow" + script/utils/verifyContracts.sh arbitrum-sepolia resume-arbitrumSepolia: $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --resume" diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 6521a94f4..3324db7ed 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -16,6 +16,8 @@ base = "https://mainnet.base.org" baseSepolia = "https://sepolia.base.org" arbitrum = "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" arbitrumSepolia = "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +arbitrum-sepolia = "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" +arbitrum_one_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" optimism = "https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" optimismSepolia = "https://opt-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" polygon = "https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" @@ -28,6 +30,8 @@ bitlayerTestnet = "https://testnet-rpc.bitlayer.org" localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } -arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api", chain = 421614 } +arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } +arbitrum-sepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } +arbitrum_one_sepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } diff --git a/packages/contracts/script/utils/verifyContracts.sh b/packages/contracts/script/utils/verifyContracts.sh new file mode 100755 index 000000000..6d7858af3 --- /dev/null +++ b/packages/contracts/script/utils/verifyContracts.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +TX_LOG=$(find broadcast -type f -name "run-latest.json") +CONTRACTS=$(jq -r '.transactions[] | select(.transactionType == "CREATE") | .contractName' ${TX_LOG}) +for CONTRACT in ${CONTRACTS} ; do + ADDRESS=$(jq -r --arg CT ${CONTRACT} '.transactions[] | select(.transactionType == "CREATE" and .contractName == $CT) | .contractAddress' ${TX_LOG}) + SOURCE_FILE=$(find src test script -type f -name "${CONTRACT}*.sol" -not -name "*Test*.sol") + forge verify-contract ${ADDRESS} ${SOURCE_FILE}:${CONTRACT} --rpc-url ${1:?RPC_URL is required} +done From f428d350fb02eca9e22a2b75fa88c2df9d6b33b2 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 15:54:20 +0800 Subject: [PATCH 20/43] Explicitly add the ETHERSCAN_API_KEY --- packages/contracts/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 7393caed6..8fdd6c185 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -33,7 +33,8 @@ deploy: @echo "Running deploy script '$(DEPLOY_SCRIPT)' against '$(RPC_URL)' for '$(ENVIRONMENT)' environment." @yarn clean @yarn build - @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv + @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv \ + -e ${ETHERSCAN_API_KEY} @yarn db-export # NOTE (JL,2024-08-08): Verify is a 'recovery' operation, requiring the `broadcast` directory contrents. So, no `clean`. From 9da0a332593d6e7e486b798ba60d423a9fe42139 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 16:01:42 +0800 Subject: [PATCH 21/43] Use full cli option name. --- packages/contracts/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 8fdd6c185..4bbd67667 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -34,7 +34,7 @@ deploy: @yarn clean @yarn build @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv \ - -e ${ETHERSCAN_API_KEY} + --etherscan-api-key ${ETHERSCAN_API_KEY} @yarn db-export # NOTE (JL,2024-08-08): Verify is a 'recovery' operation, requiring the `broadcast` directory contrents. So, no `clean`. From 2fd23ceb68859718ab0376eb060d5107c3d776b0 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 16:23:46 +0800 Subject: [PATCH 22/43] Try to force verification. Remove explicit CLI Arg with Etherscan API Key. It added nothing. --- packages/contracts/Makefile | 3 +-- packages/contracts/script/utils/verifyContracts.sh | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 4bbd67667..7393caed6 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -33,8 +33,7 @@ deploy: @echo "Running deploy script '$(DEPLOY_SCRIPT)' against '$(RPC_URL)' for '$(ENVIRONMENT)' environment." @yarn clean @yarn build - @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv \ - --etherscan-api-key ${ETHERSCAN_API_KEY} + @forge script $(DEPLOY_SCRIPT) --rpc-url $(RPC_URL) $(DEPLOYER_AUTHENTICATION) --broadcast $(EXTRA_FLAGS) -vvvv @yarn db-export # NOTE (JL,2024-08-08): Verify is a 'recovery' operation, requiring the `broadcast` directory contrents. So, no `clean`. diff --git a/packages/contracts/script/utils/verifyContracts.sh b/packages/contracts/script/utils/verifyContracts.sh index 6d7858af3..d742bddfd 100755 --- a/packages/contracts/script/utils/verifyContracts.sh +++ b/packages/contracts/script/utils/verifyContracts.sh @@ -5,5 +5,6 @@ CONTRACTS=$(jq -r '.transactions[] | select(.transactionType == "CREATE") | .con for CONTRACT in ${CONTRACTS} ; do ADDRESS=$(jq -r --arg CT ${CONTRACT} '.transactions[] | select(.transactionType == "CREATE" and .contractName == $CT) | .contractAddress' ${TX_LOG}) SOURCE_FILE=$(find src test script -type f -name "${CONTRACT}*.sol" -not -name "*Test*.sol") - forge verify-contract ${ADDRESS} ${SOURCE_FILE}:${CONTRACT} --rpc-url ${1:?RPC_URL is required} + forge verify-contract ${ADDRESS} ${SOURCE_FILE}:${CONTRACT} --rpc-url ${1:?RPC_URL is required} \ + --skip-is-verified-check --watch done From e721927558c6ab2e65d6ea6124ed565c2a0fbd58 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 19:59:49 +0800 Subject: [PATCH 23/43] CHanged the main contracts to see if verification works with original contracts, --- packages/contracts/src/CredbullFixedYieldVaultFactory.sol | 2 ++ packages/contracts/src/CredbullUpsideVaultFactory.sol | 2 ++ packages/contracts/src/CredbullWhiteListProvider.sol | 2 ++ packages/contracts/test/test/token/SimpleToken.t.sol | 2 ++ packages/contracts/test/test/token/SimpleUSDC.t.sol | 2 ++ packages/contracts/test/test/vault/SimpleVault.t.sol | 2 ++ 6 files changed, 12 insertions(+) diff --git a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol index 8301fe200..0d18b0a06 100644 --- a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol +++ b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol @@ -6,6 +6,8 @@ import { CredbullFixedYieldVault } from "./CredbullFixedYieldVault.sol"; import { VaultFactory } from "./factory/VaultFactory.sol"; contract CredbullFixedYieldVaultFactory is VaultFactory { + string private constant HASH = "change the checksum"; + /// @notice Event to emit when a new vault is created event VaultDeployed(address indexed vault, CredbullFixedYieldVault.FixedYieldVaultParams params, string options); diff --git a/packages/contracts/src/CredbullUpsideVaultFactory.sol b/packages/contracts/src/CredbullUpsideVaultFactory.sol index 591bfd502..d676cb59a 100644 --- a/packages/contracts/src/CredbullUpsideVaultFactory.sol +++ b/packages/contracts/src/CredbullUpsideVaultFactory.sol @@ -6,6 +6,8 @@ import { CredbullFixedYieldVaultWithUpside } from "./CredbullFixedYieldVaultWith import { VaultFactory } from "./factory/VaultFactory.sol"; contract CredbullUpsideVaultFactory is VaultFactory { + string private constant HASH = "change the checksum"; + /// @notice Event to emit when a new vault is created event VaultDeployed( address indexed vault, CredbullFixedYieldVaultWithUpside.UpsideVaultParams params, string options diff --git a/packages/contracts/src/CredbullWhiteListProvider.sol b/packages/contracts/src/CredbullWhiteListProvider.sol index 7231ae881..7cc1c18a2 100755 --- a/packages/contracts/src/CredbullWhiteListProvider.sol +++ b/packages/contracts/src/CredbullWhiteListProvider.sol @@ -9,5 +9,7 @@ import { WhiteListProvider } from "./provider/whiteList/WhiteListProvider.sol"; * @notice The deployable white list provider contract. */ contract CredbullWhiteListProvider is WhiteListProvider { + string private constant HASH = "change the checksum"; + constructor(address _owner) WhiteListProvider(_owner) { } } diff --git a/packages/contracts/test/test/token/SimpleToken.t.sol b/packages/contracts/test/test/token/SimpleToken.t.sol index 8b30d5030..a29f169d7 100755 --- a/packages/contracts/test/test/token/SimpleToken.t.sol +++ b/packages/contracts/test/test/token/SimpleToken.t.sol @@ -8,5 +8,7 @@ import { OwnableToken } from "./OwnableToken.t.sol"; * @dev The Symbol, Name and decimals are hard-coded, so an instance cannot represent anything other than 'SMPL'. */ contract SimpleToken is OwnableToken { + string private constant HASH = "change the checksum"; + constructor(uint256 initialSupply) OwnableToken("Simple Token", "SMPL", 18, initialSupply) { } } diff --git a/packages/contracts/test/test/token/SimpleUSDC.t.sol b/packages/contracts/test/test/token/SimpleUSDC.t.sol index 168730784..e1405007c 100755 --- a/packages/contracts/test/test/token/SimpleUSDC.t.sol +++ b/packages/contracts/test/test/token/SimpleUSDC.t.sol @@ -8,5 +8,7 @@ import { OwnableToken } from "./OwnableToken.t.sol"; * @dev The Symbol, Name and decimals are hard-coded, so an instance cannot represent anything other than 'sUSDC'. */ contract SimpleUSDC is OwnableToken { + string private constant HASH = "change the checksum"; + constructor(uint256 initialSupply) OwnableToken("Simple USDC", "sUSDC", 6, initialSupply) { } } diff --git a/packages/contracts/test/test/vault/SimpleVault.t.sol b/packages/contracts/test/test/vault/SimpleVault.t.sol index 5084cfddb..dce6ee73d 100644 --- a/packages/contracts/test/test/vault/SimpleVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleVault.t.sol @@ -8,6 +8,8 @@ import { Vault } from "@credbull/vault/Vault.sol"; * @notice A simple [Vault] realisation for testing purposes. */ contract SimpleVault is Vault { + string private constant HASH = "change the checksum"; + constructor(Vault.VaultParams memory params) Vault(params) { } function withdrawERC20(address[] calldata _tokens, address _to) external { From ec7bc67902b1d08efcd1134afde45f499ac68433 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 20:39:46 +0800 Subject: [PATCH 24/43] Make them all more valid. --- packages/contracts/src/CredbullFixedYieldVaultFactory.sol | 4 ++++ packages/contracts/src/CredbullUpsideVaultFactory.sol | 4 ++++ packages/contracts/src/CredbullWhiteListProvider.sol | 4 ++++ packages/contracts/test/test/token/SimpleToken.t.sol | 4 ++++ packages/contracts/test/test/token/SimpleUSDC.t.sol | 4 ++++ packages/contracts/test/test/vault/SimpleVault.t.sol | 4 ++++ 6 files changed, 24 insertions(+) diff --git a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol index 0d18b0a06..a4fa5fa87 100644 --- a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol +++ b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol @@ -39,4 +39,8 @@ contract CredbullFixedYieldVaultFactory is VaultFactory { return address(newVault); } + + function hashed() external pure returns (string memory) { + return HASH; + } } diff --git a/packages/contracts/src/CredbullUpsideVaultFactory.sol b/packages/contracts/src/CredbullUpsideVaultFactory.sol index d676cb59a..9e1a902a9 100644 --- a/packages/contracts/src/CredbullUpsideVaultFactory.sol +++ b/packages/contracts/src/CredbullUpsideVaultFactory.sol @@ -41,4 +41,8 @@ contract CredbullUpsideVaultFactory is VaultFactory { return address(newVault); } + + function hashed() external pure returns (string memory) { + return HASH; + } } diff --git a/packages/contracts/src/CredbullWhiteListProvider.sol b/packages/contracts/src/CredbullWhiteListProvider.sol index 7cc1c18a2..c508e7be0 100755 --- a/packages/contracts/src/CredbullWhiteListProvider.sol +++ b/packages/contracts/src/CredbullWhiteListProvider.sol @@ -12,4 +12,8 @@ contract CredbullWhiteListProvider is WhiteListProvider { string private constant HASH = "change the checksum"; constructor(address _owner) WhiteListProvider(_owner) { } + + function hashed() external pure returns (string memory) { + return HASH; + } } diff --git a/packages/contracts/test/test/token/SimpleToken.t.sol b/packages/contracts/test/test/token/SimpleToken.t.sol index a29f169d7..0d6ffc461 100755 --- a/packages/contracts/test/test/token/SimpleToken.t.sol +++ b/packages/contracts/test/test/token/SimpleToken.t.sol @@ -11,4 +11,8 @@ contract SimpleToken is OwnableToken { string private constant HASH = "change the checksum"; constructor(uint256 initialSupply) OwnableToken("Simple Token", "SMPL", 18, initialSupply) { } + + function hashed() external pure returns (string memory) { + return HASH; + } } diff --git a/packages/contracts/test/test/token/SimpleUSDC.t.sol b/packages/contracts/test/test/token/SimpleUSDC.t.sol index e1405007c..d70246a70 100755 --- a/packages/contracts/test/test/token/SimpleUSDC.t.sol +++ b/packages/contracts/test/test/token/SimpleUSDC.t.sol @@ -11,4 +11,8 @@ contract SimpleUSDC is OwnableToken { string private constant HASH = "change the checksum"; constructor(uint256 initialSupply) OwnableToken("Simple USDC", "sUSDC", 6, initialSupply) { } + + function hashed() external pure returns (string memory) { + return HASH; + } } diff --git a/packages/contracts/test/test/vault/SimpleVault.t.sol b/packages/contracts/test/test/vault/SimpleVault.t.sol index dce6ee73d..39150d539 100644 --- a/packages/contracts/test/test/vault/SimpleVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleVault.t.sol @@ -15,4 +15,8 @@ contract SimpleVault is Vault { function withdrawERC20(address[] calldata _tokens, address _to) external { _withdrawERC20(_tokens, _to); } + + function hashed() external pure returns (string memory) { + return HASH; + } } From c8405dec8b33233c504e18e4dc12b2163b46a530 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Tue, 13 Aug 2024 20:41:19 +0800 Subject: [PATCH 25/43] Change to nightly foundry. --- .github/workflows/ci-dev-contracts.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 2e2854434..3d8270e5a 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -52,7 +52,8 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 + version: nightly + # version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 # re-run the tests here on purpose to ensure quality. - name: Run tests From d220958bfde66e5a3535e43920320df918a5d0dc Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 30 Jul 2024 13:27:15 +0530 Subject: [PATCH 26/43] fix: F-2024-4399 --- packages/contracts/src/vault/Vault.sol | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/contracts/src/vault/Vault.sol b/packages/contracts/src/vault/Vault.sol index eb0b1174c..2d6321c99 100644 --- a/packages/contracts/src/vault/Vault.sol +++ b/packages/contracts/src/vault/Vault.sol @@ -24,7 +24,6 @@ abstract contract Vault is ERC4626, Pausable { error CredbullVault__TransferOutsideEcosystem(address); error CredbullVault__InvalidAssetAmount(uint256); error CredbullVault__UnsupportedDecimalValue(uint8); - error CredbullVault__NativeTransferNotAllowed(); /// @notice The set of parameters required to create a Credbull Vault instance. struct VaultParams { @@ -163,16 +162,6 @@ abstract contract Vault is ERC4626, Pausable { return VAULT_DECIMALS; } - /// @notice Revert any ETH transfer to contract - receive() external payable { - revert CredbullVault__NativeTransferNotAllowed(); - } - - /// @notice Revert any ETH transfer to contract - fallback() external payable { - revert CredbullVault__NativeTransferNotAllowed(); - } - /// @notice Withdraw any ERC20 tokens sent directly to contract. /// This should be implemented by the inherited contract and should be callable only by the admin. function _withdrawERC20(address[] calldata _tokens, address _to) internal { From 8c140105af76f03737d92c3887928b3172ca5a8c Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 30 Jul 2024 13:47:51 +0530 Subject: [PATCH 27/43] fix: F-2024-4400 - only for update functions --- packages/contracts/src/plugin/MaxCapPlugin.sol | 5 +++++ packages/contracts/src/plugin/WindowPlugin.sol | 7 +++++++ packages/contracts/src/vault/MaturityVault.sol | 5 +++++ packages/contracts/test/src/plugin/MaxCapPluginTest.t.sol | 2 ++ packages/contracts/test/src/plugin/WindowPluginTest.t.sol | 2 ++ packages/contracts/test/src/vault/MaturityVaultTest.t.sol | 2 ++ 6 files changed, 23 insertions(+) diff --git a/packages/contracts/src/plugin/MaxCapPlugin.sol b/packages/contracts/src/plugin/MaxCapPlugin.sol index f64b9eb72..c997c82af 100644 --- a/packages/contracts/src/plugin/MaxCapPlugin.sol +++ b/packages/contracts/src/plugin/MaxCapPlugin.sol @@ -6,6 +6,9 @@ pragma solidity ^0.8.20; abstract contract MaxCapPlugin { error CredbullVault__MaxCapReached(); + /// @notice Event emitted when the max cap is updated + event MaxCapUpdated(uint256 indexed maxCap); + /// @notice - Params for the MaxCap Plugin struct MaxCapPluginParams { uint256 maxCap; @@ -40,5 +43,7 @@ abstract contract MaxCapPlugin { /// @notice - Update the max cap value function _updateMaxCap(uint256 _value) internal virtual { maxCap = _value; + + emit MaxCapUpdated(maxCap); } } diff --git a/packages/contracts/src/plugin/WindowPlugin.sol b/packages/contracts/src/plugin/WindowPlugin.sol index 47c5b8b05..2913c1145 100644 --- a/packages/contracts/src/plugin/WindowPlugin.sol +++ b/packages/contracts/src/plugin/WindowPlugin.sol @@ -9,6 +9,11 @@ abstract contract WindowPlugin { uint256 windowOpensAt, uint256 windowClosesAt, uint256 timestamp ); + /// @notice Event emitted when the window is updated + event WindowUpdated( + uint256 depositOpensAt, uint256 depositClosesAt, uint256 redemptionOpensAt, uint256 redemptionClosesAt + ); + /// @notice A Window is essentially a Time Span, denoted by an Opening and Closing Time pair. struct Window { uint256 opensAt; @@ -73,6 +78,8 @@ abstract contract WindowPlugin { depositClosesAtTimestamp = _depositClose; redemptionOpensAtTimestamp = _redeemOpen; redemptionClosesAtTimestamp = _redeemClose; + + emit WindowUpdated(_depositOpen, _depositClose, _redeemOpen, _redeemClose); } /// @notice - Function to toggle check for window diff --git a/packages/contracts/src/vault/MaturityVault.sol b/packages/contracts/src/vault/MaturityVault.sol index 2352fb7e5..c10419d0b 100644 --- a/packages/contracts/src/vault/MaturityVault.sol +++ b/packages/contracts/src/vault/MaturityVault.sol @@ -23,6 +23,9 @@ abstract contract MaturityVault is Vault { /// @notice Reverts on mature if there is not enough balance. error CredbullVault__NotEnoughBalanceToMature(); + /// @notice Event emitted when the vault matures. + event VaultMatured(uint256 indexed totalAssetDeposited); + /// @notice Determine if the vault is matured or not. bool public isMatured; @@ -48,6 +51,8 @@ abstract contract MaturityVault is Vault { totalAssetDeposited = currentBalance; isMatured = true; + + emit VaultMatured(totalAssetDeposited); } /// @notice - Returns expected assets on maturity diff --git a/packages/contracts/test/src/plugin/MaxCapPluginTest.t.sol b/packages/contracts/test/src/plugin/MaxCapPluginTest.t.sol index 6289dba4a..0fb471310 100644 --- a/packages/contracts/test/src/plugin/MaxCapPluginTest.t.sol +++ b/packages/contracts/test/src/plugin/MaxCapPluginTest.t.sol @@ -66,6 +66,8 @@ contract MaxCapPluginTest is Test { assertTrue(newValue != currentValue); + vm.expectEmit(); + emit MaxCapPlugin.MaxCapUpdated(newValue); vault.updateMaxCap(newValue); assertTrue(vault.maxCap() == newValue); diff --git a/packages/contracts/test/src/plugin/WindowPluginTest.t.sol b/packages/contracts/test/src/plugin/WindowPluginTest.t.sol index b5e1011a6..65ed5426e 100644 --- a/packages/contracts/test/src/plugin/WindowPluginTest.t.sol +++ b/packages/contracts/test/src/plugin/WindowPluginTest.t.sol @@ -172,6 +172,8 @@ contract WindowPluginTest is Test { assertTrue(currentWithdrawOpen != newWithdrawOpen); assertTrue(currentWithdrawClose != newWithdrawClose); + vm.expectEmit(); + emit WindowPlugin.WindowUpdated(newDepositOpen, newDepositClose, newWithdrawOpen, newWithdrawClose); vault.updateWindow(newDepositOpen, newDepositClose, newWithdrawOpen, newWithdrawClose); assertTrue(vault.depositOpensAtTimestamp() == newDepositOpen); diff --git a/packages/contracts/test/src/vault/MaturityVaultTest.t.sol b/packages/contracts/test/src/vault/MaturityVaultTest.t.sol index 981d4ddbf..e04eac717 100644 --- a/packages/contracts/test/src/vault/MaturityVaultTest.t.sol +++ b/packages/contracts/test/src/vault/MaturityVaultTest.t.sol @@ -50,6 +50,8 @@ contract MaturityVaultTest is Test { params.vault.asset.transferFrom(params.vault.custodian, address(vault), finalBalance); vm.stopPrank(); + vm.expectEmit(); + emit MaturityVault.VaultMatured(finalBalance); vault.mature(); // ---- Assert Vault burns shares and Alice receive asset with additional 10% --- From 8fdc451b632f7fcb7ca4f6273dc3a71804178bf7 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 30 Jul 2024 13:51:09 +0530 Subject: [PATCH 28/43] fix: F-2024-4403 --- packages/contracts/src/plugin/WhiteListPlugin.sol | 4 ++-- packages/contracts/src/vault/FixedYieldVault.sol | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/contracts/src/plugin/WhiteListPlugin.sol b/packages/contracts/src/plugin/WhiteListPlugin.sol index 1420d7094..eafbc9678 100644 --- a/packages/contracts/src/plugin/WhiteListPlugin.sol +++ b/packages/contracts/src/plugin/WhiteListPlugin.sol @@ -18,13 +18,13 @@ abstract contract WhiteListPlugin { } /// @notice - Address of the White List Provider. - IWhiteListProvider public whiteListProvider; + IWhiteListProvider public immutable whiteListProvider; /// @notice - Flag to check for whiteList bool public checkWhiteList; /// @notice - Deposit threshold amount to check for whiteListing - uint256 public depositThresholdForWhiteListing; + uint256 public immutable depositThresholdForWhiteListing; constructor(WhiteListPluginParams memory params) { if (params.whiteListProvider == address(0)) { diff --git a/packages/contracts/src/vault/FixedYieldVault.sol b/packages/contracts/src/vault/FixedYieldVault.sol index 2e09eb50b..3aeeb7cb1 100644 --- a/packages/contracts/src/vault/FixedYieldVault.sol +++ b/packages/contracts/src/vault/FixedYieldVault.sol @@ -32,7 +32,7 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap } /// @dev The fixed yield value in percentage(100) that's promised to the users on deposit. - uint256 private _fixedYield; + uint256 private immutable _fixedYield; constructor(FixedYieldVaultParams memory params) MaturityVault(params.maturityVault) From 64e21b3f41526649840229e2159995b8daa31865 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 30 Jul 2024 13:55:43 +0530 Subject: [PATCH 29/43] fixed lint warning for immutable variables --- packages/contracts/src/plugin/WhiteListPlugin.sol | 10 +++++----- packages/contracts/src/vault/FixedYieldVault.sol | 6 +++--- .../test/src/CredbullFixedYieldVaultFactoryTest.t.sol | 2 +- .../test/src/CredbullFixedYieldVaultTest.t.sol | 6 +++--- .../src/CredbullFixedYieldVaultWithUpsideTest.t.sol | 2 +- .../test/src/CredbullUpsideVaultFactoryTest.t.sol | 2 +- .../test/src/plugin/WhiteListPluginTest.t.sol | 6 +++--- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/contracts/src/plugin/WhiteListPlugin.sol b/packages/contracts/src/plugin/WhiteListPlugin.sol index eafbc9678..51bca0ff5 100644 --- a/packages/contracts/src/plugin/WhiteListPlugin.sol +++ b/packages/contracts/src/plugin/WhiteListPlugin.sol @@ -18,27 +18,27 @@ abstract contract WhiteListPlugin { } /// @notice - Address of the White List Provider. - IWhiteListProvider public immutable whiteListProvider; + IWhiteListProvider public immutable WHITELIST_PROVIDER; /// @notice - Flag to check for whiteList bool public checkWhiteList; /// @notice - Deposit threshold amount to check for whiteListing - uint256 public immutable depositThresholdForWhiteListing; + uint256 public immutable DEPOSIT_THRESHOLD_FOR_WHITE_LISTING; constructor(WhiteListPluginParams memory params) { if (params.whiteListProvider == address(0)) { revert CredbullVault__InvalidWhiteListProviderAddress(params.whiteListProvider); } - whiteListProvider = IWhiteListProvider(params.whiteListProvider); + WHITELIST_PROVIDER = IWhiteListProvider(params.whiteListProvider); checkWhiteList = true; // Set the check to true by default - depositThresholdForWhiteListing = params.depositThresholdForWhiteListing; + DEPOSIT_THRESHOLD_FOR_WHITE_LISTING = params.depositThresholdForWhiteListing; } /// @notice - Function to check for whiteListed address function _checkIsWhiteListed(address receiver, uint256 amount) internal view virtual { - if (checkWhiteList && amount >= depositThresholdForWhiteListing && !whiteListProvider.status(receiver)) { + if (checkWhiteList && amount >= DEPOSIT_THRESHOLD_FOR_WHITE_LISTING && !WHITELIST_PROVIDER.status(receiver)) { revert CredbullVault__NotWhiteListed(receiver, amount); } } diff --git a/packages/contracts/src/vault/FixedYieldVault.sol b/packages/contracts/src/vault/FixedYieldVault.sol index 3aeeb7cb1..47ab0bea5 100644 --- a/packages/contracts/src/vault/FixedYieldVault.sol +++ b/packages/contracts/src/vault/FixedYieldVault.sol @@ -32,7 +32,7 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap } /// @dev The fixed yield value in percentage(100) that's promised to the users on deposit. - uint256 private immutable _fixedYield; + uint256 private immutable FIXED_YIELD; constructor(FixedYieldVaultParams memory params) MaturityVault(params.maturityVault) @@ -43,7 +43,7 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap _grantRole(DEFAULT_ADMIN_ROLE, params.roles.owner); _grantRole(OPERATOR_ROLE, params.roles.operator); - _fixedYield = params.promisedYield; + FIXED_YIELD = params.promisedYield; } /// @dev - Overridden deposit modifer @@ -70,7 +70,7 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap // @notice - Returns expected assets on maturity function expectedAssetsOnMaturity() public view override returns (uint256) { - return totalAssetDeposited.mulDiv(100 + _fixedYield, 100); + return totalAssetDeposited.mulDiv(100 + FIXED_YIELD, 100); } /// @notice Mature the vault diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol index feda253a0..d777e46c7 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol @@ -53,7 +53,7 @@ contract CredbullFixedYieldVaultFactoryTest is Test { assertEq(vault.asset(), address(params.maturityVault.vault.asset)); assertEq(vault.name(), params.maturityVault.vault.shareName); assertEq(vault.symbol(), params.maturityVault.vault.shareSymbol); - assertEq(address(vault.whiteListProvider()), params.whiteListPlugin.whiteListProvider); + assertEq(address(vault.WHITELIST_PROVIDER()), params.whiteListPlugin.whiteListProvider); assertEq(vault.CUSTODIAN(), params.maturityVault.vault.custodian); } diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol index f46ee6559..56186b0e3 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol @@ -52,7 +52,7 @@ contract CredbullFixedYieldVaultTest is Test { statuses[1] = true; vm.startPrank(params.roles.operator); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); SimpleUSDC(address(params.maturityVault.vault.asset)).mint(alice, INITIAL_BALANCE * precision); @@ -168,7 +168,7 @@ contract CredbullFixedYieldVaultTest is Test { statuses[0] = false; vm.startPrank(params.roles.operator); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); uint256 depositAmount = 1000 * precision; @@ -186,7 +186,7 @@ contract CredbullFixedYieldVaultTest is Test { statuses[0] = false; vm.startPrank(params.roles.operator); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); uint256 depositAmount = 1000 * precision; diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol index 346d3553b..1510fc7ca 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol @@ -64,7 +64,7 @@ contract CredbullFixedYieldVaultWithUpsideTest is Test { statuses[0] = true; vm.startPrank(vaultParams.roles.operator); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); SimpleUSDC(address(vaultParams.maturityVault.vault.asset)).mint(alice, INITIAL_BALANCE * precision); diff --git a/packages/contracts/test/src/CredbullUpsideVaultFactoryTest.t.sol b/packages/contracts/test/src/CredbullUpsideVaultFactoryTest.t.sol index 10ba09de9..4133ca490 100644 --- a/packages/contracts/test/src/CredbullUpsideVaultFactoryTest.t.sol +++ b/packages/contracts/test/src/CredbullUpsideVaultFactoryTest.t.sol @@ -51,7 +51,7 @@ contract CredbullUpsideVaultFactoryTest is Test { assertEq(vault.asset(), address(params.fixedYieldVault.maturityVault.vault.asset)); assertEq(vault.name(), params.fixedYieldVault.maturityVault.vault.shareName); assertEq(vault.symbol(), params.fixedYieldVault.maturityVault.vault.shareSymbol); - assertEq(address(vault.whiteListProvider()), params.fixedYieldVault.whiteListPlugin.whiteListProvider); + assertEq(address(vault.WHITELIST_PROVIDER()), params.fixedYieldVault.whiteListPlugin.whiteListProvider); assertEq(vault.CUSTODIAN(), params.fixedYieldVault.maturityVault.vault.custodian); } } diff --git a/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol b/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol index 01b4ad946..e75feca30 100644 --- a/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol +++ b/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol @@ -50,7 +50,7 @@ contract WhiteListPluginTest is Test { statuses[1] = true; vm.startPrank(whiteListProvider.owner()); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); SimpleUSDC(address(vaultParams.asset)).mint(alice, INITIAL_BALANCE * precision); @@ -65,7 +65,7 @@ contract WhiteListPluginTest is Test { statuses[0] = false; vm.startPrank(whiteListProvider.owner()); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); uint256 depositAmount = 1000 * precision; @@ -116,7 +116,7 @@ contract WhiteListPluginTest is Test { statuses[0] = false; vm.startPrank(whiteListProvider.owner()); - vault.whiteListProvider().updateStatus(whiteListAddresses, statuses); + vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); vault.toggleWhiteListCheck(false); From b60f38915c2e3c30b0f5d45f358c0fb381b6479a Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 30 Jul 2024 15:09:49 +0530 Subject: [PATCH 30/43] fix: F-2024-4414 --- .../contracts/src/factory/VaultFactory.sol | 19 +++++++++++++++++++ .../provider/whiteList/WhiteListProvider.sol | 1 + .../contracts/src/vault/FixedYieldVault.sol | 14 ++++++++++++++ .../CredbullFixedYieldVaultFactoryTest.t.sol | 18 ++++++++++++++++++ .../src/CredbullFixedYieldVaultTest.t.sol | 12 ++++++++++++ 5 files changed, 64 insertions(+) diff --git a/packages/contracts/src/factory/VaultFactory.sol b/packages/contracts/src/factory/VaultFactory.sol index e5deb68e0..77a337e37 100644 --- a/packages/contracts/src/factory/VaultFactory.sol +++ b/packages/contracts/src/factory/VaultFactory.sol @@ -14,6 +14,15 @@ abstract contract VaultFactory is AccessControl { /// @notice Error to revert if custodian is not allowed error CredbullVaultFactory__CustodianNotAllowed(); + /// @notice Error to indicate that the provided owner address is invalid. + error CredbullVaultFactory__InvalidOwnerAddress(); + + /// @notice Error to indicate that the provided operator address is invalid. + error CredbullVaultFactory__InvalidOperatorAddress(); + + /// @notice Error to indicate that the provided custodian address is invalid. + error CredbullVaultFactory__InvalidCustodianAddress(); + /// @notice Address set that contains list of all vault address EnumerableSet.AddressSet internal allVaults; @@ -29,6 +38,13 @@ abstract contract VaultFactory is AccessControl { * @param custodians - Initial set of custodians allowable for the vaults */ constructor(address owner, address operator, address[] memory custodians) { + if (owner == address(0)) { + revert CredbullVaultFactory__InvalidOwnerAddress(); + } + + if (operator == address(0)) { + revert CredbullVaultFactory__InvalidOperatorAddress(); + } _grantRole(DEFAULT_ADMIN_ROLE, owner); _grantRole(OPERATOR_ROLE, operator); @@ -58,6 +74,9 @@ abstract contract VaultFactory is AccessControl { /// @notice Add custodian address to the set function allowCustodian(address _custodian) public onlyRole(DEFAULT_ADMIN_ROLE) returns (bool) { + if (_custodian == address(0)) { + revert CredbullVaultFactory__InvalidCustodianAddress(); + } return allowedCustodians.add(_custodian); } diff --git a/packages/contracts/src/provider/whiteList/WhiteListProvider.sol b/packages/contracts/src/provider/whiteList/WhiteListProvider.sol index e472b1233..f25237134 100755 --- a/packages/contracts/src/provider/whiteList/WhiteListProvider.sol +++ b/packages/contracts/src/provider/whiteList/WhiteListProvider.sol @@ -30,6 +30,7 @@ contract WhiteListProvider is IWhiteListProvider, Ownable { uint256 length = _addresses.length; for (uint256 i; i < length;) { + if (_addresses[i] == address(0)) continue; isWhiteListed[_addresses[i]] = _statuses[i]; unchecked { diff --git a/packages/contracts/src/vault/FixedYieldVault.sol b/packages/contracts/src/vault/FixedYieldVault.sol index 47ab0bea5..71d27663e 100644 --- a/packages/contracts/src/vault/FixedYieldVault.sol +++ b/packages/contracts/src/vault/FixedYieldVault.sol @@ -13,6 +13,12 @@ import { MaxCapPlugin } from "../plugin/MaxCapPlugin.sol"; contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCapPlugin, AccessControl { using Math for uint256; + /// @notice Error to indicate that the provided owner address is invalid. + error FixedYieldVault__InvalidOwnerAddress(); + + /// @notice Error to indicate that the provided operator address is invalid. + error FixedYieldVault__InvalidOperatorAddress(); + /// @notice - Hash of operator role bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); @@ -40,6 +46,14 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap WindowPlugin(params.windowPlugin) MaxCapPlugin(params.maxCapPlugin) { + if (params.roles.owner == address(0)) { + revert FixedYieldVault__InvalidOwnerAddress(); + } + + if (params.roles.operator == address(0)) { + revert FixedYieldVault__InvalidOperatorAddress(); + } + _grantRole(DEFAULT_ADMIN_ROLE, params.roles.owner); _grantRole(OPERATOR_ROLE, params.roles.operator); diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol index d777e46c7..5fb810571 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol @@ -35,6 +35,15 @@ contract CredbullFixedYieldVaultFactoryTest is Test { params.whiteListPlugin.whiteListProvider = address(whiteListProvider); } + function test__ShouldRevertOnInvalidParams() public { + vm.prank(config.factoryParams.owner); + vm.expectRevert(VaultFactory.CredbullVaultFactory__InvalidOwnerAddress.selector); + new CredbullFixedYieldVaultFactory(address(0), config.factoryParams.operator, new address[](0)); + + vm.expectRevert(VaultFactory.CredbullVaultFactory__InvalidOperatorAddress.selector); + new CredbullFixedYieldVaultFactory(config.factoryParams.owner, address(0), new address[](0)); + } + function test__ShouldSuccefullyCreateFactoryFixedYield() public { address[] memory custodians = new address[](1); custodians[0] = config.factoryParams.custodian; @@ -130,6 +139,15 @@ contract CredbullFixedYieldVaultFactoryTest is Test { vm.stopPrank(); } + function test__ShouldRevertOnInvalidCustodian() public { + vm.startPrank(config.factoryParams.owner); + factory.allowCustodian(params.maturityVault.vault.custodian); + + vm.expectRevert(VaultFactory.CredbullVaultFactory__InvalidCustodianAddress.selector); + factory.allowCustodian(address(0)); + vm.stopPrank(); + } + function test__ShouldRevertAllowAdmingIfNotOwner() public { vm.prank(makeAddr("random_addr")); vm.expectRevert(); diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol index 56186b0e3..445aafc0b 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol @@ -14,6 +14,7 @@ import { CredbullFixedYieldVault } from "@credbull/CredbullFixedYieldVault.sol"; import { CredbullWhiteListProvider } from "@credbull/CredbullWhiteListProvider.sol"; import { WhiteListProvider } from "@credbull/provider/whiteList/WhiteListProvider.sol"; import { WhiteListPlugin } from "@credbull/plugin/WhiteListPlugin.sol"; +import { FixedYieldVault } from "@credbull/vault/FixedYieldVault.sol"; import { ParamsFactory } from "@test/test/vault/utils/ParamsFactory.t.sol"; import { SimpleUSDC } from "@test/test/token/SimpleUSDC.t.sol"; @@ -59,6 +60,17 @@ contract CredbullFixedYieldVaultTest is Test { SimpleUSDC(address(params.maturityVault.vault.asset)).mint(bob, INITIAL_BALANCE * precision); } + function test__FixedYieldVault__RevertOnInvalidAddress() public { + params.roles.owner = address(0); + vm.expectRevert(abi.encodeWithSelector(FixedYieldVault.FixedYieldVault__InvalidOwnerAddress.selector)); + new CredbullFixedYieldVault(params); + + params.roles.owner = makeAddr("owner"); + params.roles.operator = address(0); + vm.expectRevert(abi.encodeWithSelector(FixedYieldVault.FixedYieldVault__InvalidOperatorAddress.selector)); + new CredbullFixedYieldVault(params); + } + function test__FixedYieldVault__ShouldAllowOwnerToChangeOperator() public { address newOperator = makeAddr("new_operator"); From 570cddbdc434e8c3affeef7a580ebe127a747d18 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 30 Jul 2024 15:15:01 +0530 Subject: [PATCH 31/43] fix: F-2024-4416 only for collateral percentage --- packages/contracts/src/vault/UpsideVault.sol | 7 +++++++ .../test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/contracts/src/vault/UpsideVault.sol b/packages/contracts/src/vault/UpsideVault.sol index 77b58b06f..d7c722f1d 100644 --- a/packages/contracts/src/vault/UpsideVault.sol +++ b/packages/contracts/src/vault/UpsideVault.sol @@ -9,8 +9,12 @@ import { FixedYieldVault } from "./FixedYieldVault.sol"; contract UpsideVault is FixedYieldVault { using Math for uint256; + /// @notice Error to indicate that the provided share balance is insufficient. error CredbullVault__InsufficientShareBalance(); + /// @notice Error to indicate that the provided collateral percentage is invalid. + error CredbullVault__InvalidCollateralPercentage(); + struct UpsideVaultParams { FixedYieldVaultParams fixedYieldVault; IERC20 cblToken; @@ -40,6 +44,9 @@ contract UpsideVault is FixedYieldVault { uint256 private additionalPrecision; constructor(UpsideVaultParams memory params) FixedYieldVault(params.fixedYieldVault) { + if (params.collateralPercentage > MAX_PERCENTAGE) { + revert CredbullVault__InvalidCollateralPercentage(); + } collateralPercentage = params.collateralPercentage; token = params.cblToken; diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol index 1510fc7ca..1b1b54765 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol @@ -71,6 +71,13 @@ contract CredbullFixedYieldVaultWithUpsideTest is Test { SimpleToken(address(cblToken)).mint(alice, 200 ether); } + function test__UpsideVault__ShouldRevertOnInvalidCollateralPercentage() public { + CredbullFixedYieldVaultWithUpside.UpsideVaultParams memory params = upsideVaultParams; + params.collateralPercentage = 100_01; + vm.expectRevert(abi.encodeWithSelector(UpsideVault.CredbullVault__InvalidCollateralPercentage.selector)); + new CredbullFixedYieldVaultWithUpside(params); + } + function test__UpsideVault__VaultCreationShouldRevertOnUnsupportedDecimalValue() public { CredbullFixedYieldVaultWithUpside.UpsideVaultParams memory params = upsideVaultParams; params.cblToken = new DecimalToken(1e6, 19); From fe1179deb78b4a7b0c34a44e8d7ef6ba9c9fa61e Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Fri, 2 Aug 2024 14:17:32 +0530 Subject: [PATCH 32/43] fix: F-2024-4396 --- .../contracts/src/provider/whiteList/WhiteListProvider.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/contracts/src/provider/whiteList/WhiteListProvider.sol b/packages/contracts/src/provider/whiteList/WhiteListProvider.sol index f25237134..0682d3cff 100755 --- a/packages/contracts/src/provider/whiteList/WhiteListProvider.sol +++ b/packages/contracts/src/provider/whiteList/WhiteListProvider.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.20; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IWhiteListProvider } from "./IWhiteListProvider.sol"; +import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol"; -contract WhiteListProvider is IWhiteListProvider, Ownable { +contract WhiteListProvider is IWhiteListProvider, Ownable2Step { error LengthMismatch(); /** From 3b3b69fcc708886d9aabd385982305ee75b43588 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Fri, 2 Aug 2024 15:59:25 +0530 Subject: [PATCH 33/43] fix: F-2024-4398 --- .../contracts/src/plugin/WindowPlugin.sol | 22 +++++- .../test/src/plugin/WindowPluginTest.t.sol | 71 +++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/packages/contracts/src/plugin/WindowPlugin.sol b/packages/contracts/src/plugin/WindowPlugin.sol index 2913c1145..fa71439f4 100644 --- a/packages/contracts/src/plugin/WindowPlugin.sol +++ b/packages/contracts/src/plugin/WindowPlugin.sol @@ -9,11 +9,23 @@ abstract contract WindowPlugin { uint256 windowOpensAt, uint256 windowClosesAt, uint256 timestamp ); + /// @notice Error to revert when incorrect window values are provided + error WindowPlugin__IncorrectWindowValues( + uint256 depositOpen, uint256 depositClose, uint256 redeemOpen, uint256 redeemClose + ); + /// @notice Event emitted when the window is updated event WindowUpdated( uint256 depositOpensAt, uint256 depositClosesAt, uint256 redemptionOpensAt, uint256 redemptionClosesAt ); + modifier validateWindows(uint256 _depositOpen, uint256 _depositClose, uint256 _redeemOpen, uint256 _redeemClose) { + if (!(_depositOpen < _depositClose && _depositClose < _redeemOpen && _redeemOpen < _redeemClose)) { + revert WindowPlugin__IncorrectWindowValues(_depositOpen, _depositClose, _redeemOpen, _redeemClose); + } + _; + } + /// @notice A Window is essentially a Time Span, denoted by an Opening and Closing Time pair. struct Window { uint256 opensAt; @@ -41,7 +53,14 @@ abstract contract WindowPlugin { /// @notice - Flag to check for window bool public checkWindow; - constructor(WindowPluginParams memory params) { + constructor(WindowPluginParams memory params) + validateWindows( + params.depositWindow.opensAt, + params.depositWindow.closesAt, + params.redemptionWindow.opensAt, + params.redemptionWindow.closesAt + ) + { depositOpensAtTimestamp = params.depositWindow.opensAt; depositClosesAtTimestamp = params.depositWindow.closesAt; redemptionOpensAtTimestamp = params.redemptionWindow.opensAt; @@ -73,6 +92,7 @@ abstract contract WindowPlugin { function _updateWindow(uint256 _depositOpen, uint256 _depositClose, uint256 _redeemOpen, uint256 _redeemClose) internal virtual + validateWindows(_depositOpen, _depositClose, _redeemOpen, _redeemClose) { depositOpensAtTimestamp = _depositOpen; depositClosesAtTimestamp = _depositClose; diff --git a/packages/contracts/test/src/plugin/WindowPluginTest.t.sol b/packages/contracts/test/src/plugin/WindowPluginTest.t.sol index 65ed5426e..0d920f383 100644 --- a/packages/contracts/test/src/plugin/WindowPluginTest.t.sol +++ b/packages/contracts/test/src/plugin/WindowPluginTest.t.sol @@ -182,6 +182,77 @@ contract WindowPluginTest is Test { assertTrue(vault.redemptionClosesAtTimestamp() == newWithdrawClose); } + function test__WindowVault__RevertOnIncorrectWindowParams() public { + // Withdraw window opens before deposit window + uint256 newDepositOpen = 100; + uint256 newDepositClose = 300; + uint256 newWithdrawOpen = 200; + uint256 newWithdrawClose = 400; + + // Deposit window closes before it opens + uint256 newDepositOpen_1 = 300; + uint256 newDepositClose_1 = 100; + uint256 newWithdrawOpen_1 = 200; + uint256 newWithdrawClose_1 = 400; + + WindowPlugin.WindowPluginParams memory localWindowParams = WindowPlugin.WindowPluginParams({ + depositWindow: WindowPlugin.Window({ opensAt: newDepositOpen, closesAt: newDepositClose }), + redemptionWindow: WindowPlugin.Window({ opensAt: newWithdrawOpen, closesAt: newWithdrawClose }) + }); + + vm.expectRevert( + abi.encodeWithSelector( + WindowPlugin.WindowPlugin__IncorrectWindowValues.selector, + newDepositOpen, + newDepositClose, + newWithdrawOpen, + newWithdrawClose + ) + ); + vault.updateWindow(newDepositOpen, newDepositClose, newWithdrawOpen, newWithdrawClose); + + vm.expectRevert( + abi.encodeWithSelector( + WindowPlugin.WindowPlugin__IncorrectWindowValues.selector, + newDepositOpen_1, + newDepositClose_1, + newWithdrawOpen_1, + newWithdrawClose_1 + ) + ); + vault.updateWindow(newDepositOpen_1, newDepositClose_1, newWithdrawOpen_1, newWithdrawClose_1); + + { + // Withdraw window closes before it opens + uint256 newDepositOpen_2 = 100; + uint256 newDepositClose_2 = 300; + uint256 newWithdrawOpen_2 = 400; + uint256 newWithdrawClose_2 = 200; + vm.expectRevert( + abi.encodeWithSelector( + WindowPlugin.WindowPlugin__IncorrectWindowValues.selector, + newDepositOpen_2, + newDepositClose_2, + newWithdrawOpen_2, + newWithdrawClose_2 + ) + ); + vault.updateWindow(newDepositOpen_2, newDepositClose_2, newWithdrawOpen_2, newWithdrawClose_2); + } + + //checking modifier on constructor + vm.expectRevert( + abi.encodeWithSelector( + WindowPlugin.WindowPlugin__IncorrectWindowValues.selector, + newDepositOpen, + newDepositClose, + newWithdrawOpen, + newWithdrawClose + ) + ); + new SimpleWindowVault(vaultParams, localWindowParams); + } + function deposit(address user, uint256 assets) internal returns (uint256 shares) { // first, approve the deposit vm.startPrank(user); From 57c2843834381fec2d4d7092fd9372c2b4503eb0 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Fri, 2 Aug 2024 16:16:47 +0530 Subject: [PATCH 34/43] fix: F-2024-4400 --- .../contracts/src/plugin/MaxCapPlugin.sol | 9 +++++++-- .../contracts/src/plugin/WhiteListPlugin.sol | 8 ++++++-- .../contracts/src/plugin/WindowPlugin.sol | 8 ++++++-- .../contracts/src/vault/FixedYieldVault.sol | 16 +++++++-------- .../contracts/src/vault/MaturityVault.sol | 5 ++--- .../src/CredbullFixedYieldVaultTest.t.sol | 20 +++++++++---------- .../test/src/plugin/WhiteListPluginTest.t.sol | 4 ++-- .../test/src/plugin/WindowPluginTest.t.sol | 4 ++-- .../test/src/vault/MaturityVaultTest.t.sol | 4 ++-- .../test/test/vault/SimpleMaturityVault.t.sol | 4 ++-- .../test/test/vault/SimpleMaxCapVault.t.sol | 4 ++-- .../test/vault/SimpleWhiteListVault.t.sol | 4 ++-- .../test/test/vault/SimpleWindowVault.t.sol | 4 ++-- 13 files changed, 53 insertions(+), 41 deletions(-) diff --git a/packages/contracts/src/plugin/MaxCapPlugin.sol b/packages/contracts/src/plugin/MaxCapPlugin.sol index c997c82af..854666b5f 100644 --- a/packages/contracts/src/plugin/MaxCapPlugin.sol +++ b/packages/contracts/src/plugin/MaxCapPlugin.sol @@ -9,6 +9,9 @@ abstract contract MaxCapPlugin { /// @notice Event emitted when the max cap is updated event MaxCapUpdated(uint256 indexed maxCap); + /// @notice Event emitted when the max cap check is updated + event MaxCapCheckUpdated(bool indexed checkMaxCap); + /// @notice - Params for the MaxCap Plugin struct MaxCapPluginParams { uint256 maxCap; @@ -36,8 +39,10 @@ abstract contract MaxCapPlugin { } /// @notice - Toggle the max cap check status - function _toggleMaxCapCheck(bool status) internal virtual { - checkMaxCap = status; + function _toggleMaxCapCheck() internal virtual { + checkMaxCap = !checkMaxCap; + + emit MaxCapCheckUpdated(checkMaxCap); } /// @notice - Update the max cap value diff --git a/packages/contracts/src/plugin/WhiteListPlugin.sol b/packages/contracts/src/plugin/WhiteListPlugin.sol index 51bca0ff5..bcd95e307 100644 --- a/packages/contracts/src/plugin/WhiteListPlugin.sol +++ b/packages/contracts/src/plugin/WhiteListPlugin.sol @@ -11,6 +11,9 @@ abstract contract WhiteListPlugin { /// @notice Error to revert if the address is not whiteListed error CredbullVault__NotWhiteListed(address, uint256); + /// @notice Event emitted when the whiteList check is updated + event WhiteListCheckUpdated(bool indexed checkWhiteList); + /// @notice - Params for the WhiteList Plugin struct WhiteListPluginParams { address whiteListProvider; @@ -44,7 +47,8 @@ abstract contract WhiteListPlugin { } /// @notice - Function to toggle check for whiteListed address - function _toggleWhiteListCheck(bool status) internal virtual { - checkWhiteList = status; + function _toggleWhiteListCheck() internal virtual { + checkWhiteList = !checkWhiteList; + emit WhiteListCheckUpdated(checkWhiteList); } } diff --git a/packages/contracts/src/plugin/WindowPlugin.sol b/packages/contracts/src/plugin/WindowPlugin.sol index fa71439f4..8cdffc8aa 100644 --- a/packages/contracts/src/plugin/WindowPlugin.sol +++ b/packages/contracts/src/plugin/WindowPlugin.sol @@ -19,6 +19,9 @@ abstract contract WindowPlugin { uint256 depositOpensAt, uint256 depositClosesAt, uint256 redemptionOpensAt, uint256 redemptionClosesAt ); + /// @notice Event emitted when the window check is updated + event WindowCheckUpdated(bool indexed checkWindow); + modifier validateWindows(uint256 _depositOpen, uint256 _depositClose, uint256 _redeemOpen, uint256 _redeemClose) { if (!(_depositOpen < _depositClose && _depositClose < _redeemOpen && _redeemOpen < _redeemClose)) { revert WindowPlugin__IncorrectWindowValues(_depositOpen, _depositClose, _redeemOpen, _redeemClose); @@ -103,7 +106,8 @@ abstract contract WindowPlugin { } /// @notice - Function to toggle check for window - function _toggleWindowCheck(bool status) internal { - checkWindow = status; + function _toggleWindowCheck() internal { + checkWindow = !checkWindow; + emit WindowCheckUpdated(checkWindow); } } diff --git a/packages/contracts/src/vault/FixedYieldVault.sol b/packages/contracts/src/vault/FixedYieldVault.sol index 71d27663e..8f0cc5101 100644 --- a/packages/contracts/src/vault/FixedYieldVault.sol +++ b/packages/contracts/src/vault/FixedYieldVault.sol @@ -93,23 +93,23 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap } /// @notice Toggle check for maturity - function toggleMaturityCheck(bool status) public onlyRole(DEFAULT_ADMIN_ROLE) { - _toggleMaturityCheck(status); + function toggleMaturityCheck() public onlyRole(DEFAULT_ADMIN_ROLE) { + _toggleMaturityCheck(); } /// @notice Toggle check for whiteList - function toggleWhiteListCheck(bool status) public onlyRole(DEFAULT_ADMIN_ROLE) { - _toggleWhiteListCheck(status); + function toggleWhiteListCheck() public onlyRole(DEFAULT_ADMIN_ROLE) { + _toggleWhiteListCheck(); } /// @notice Toggle check for window - function toggleWindowCheck(bool status) public onlyRole(DEFAULT_ADMIN_ROLE) { - _toggleWindowCheck(status); + function toggleWindowCheck() public onlyRole(DEFAULT_ADMIN_ROLE) { + _toggleWindowCheck(); } /// @notice Toggle check for max cap - function toggleMaxCapCheck(bool status) public onlyRole(DEFAULT_ADMIN_ROLE) { - _toggleMaxCapCheck(status); + function toggleMaxCapCheck() public onlyRole(DEFAULT_ADMIN_ROLE) { + _toggleMaxCapCheck(); } /// @notice Update max cap value diff --git a/packages/contracts/src/vault/MaturityVault.sol b/packages/contracts/src/vault/MaturityVault.sol index c10419d0b..04f25c949 100644 --- a/packages/contracts/src/vault/MaturityVault.sol +++ b/packages/contracts/src/vault/MaturityVault.sol @@ -78,9 +78,8 @@ abstract contract MaturityVault is Vault { /** * @notice Enables/disables the Maturity Check according to the [status] value. * @dev 'Toggling' means flipping the existing state. This is simply a mutator. - * @param status Boolean value to toggle */ - function _toggleMaturityCheck(bool status) internal { - checkMaturity = status; + function _toggleMaturityCheck() internal { + checkMaturity = !checkMaturity; } } diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol index 445aafc0b..d4bf7e3b3 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol @@ -133,11 +133,11 @@ contract CredbullFixedYieldVaultTest is Test { vault.DEFAULT_ADMIN_ROLE() ) ); - vault.toggleMaturityCheck(false); + vault.toggleMaturityCheck(); vm.stopPrank(); vm.prank(params.roles.owner); - vault.toggleMaturityCheck(false); + vault.toggleMaturityCheck(); } function test__FixedYieldVault__RevertWhiteListToggleIfNotAdmin() public { @@ -149,11 +149,11 @@ contract CredbullFixedYieldVaultTest is Test { vault.DEFAULT_ADMIN_ROLE() ) ); - vault.toggleWhiteListCheck(false); + vault.toggleWhiteListCheck(); vm.stopPrank(); vm.prank(params.roles.owner); - vault.toggleWhiteListCheck(false); + vault.toggleWhiteListCheck(); } function test__FixedYieldVault__RevertWindowToggleIfNotAdmin() public { @@ -165,11 +165,11 @@ contract CredbullFixedYieldVaultTest is Test { vault.DEFAULT_ADMIN_ROLE() ) ); - vault.toggleWindowCheck(false); + vault.toggleWindowCheck(); vm.stopPrank(); vm.prank(params.roles.owner); - vault.toggleWindowCheck(false); + vault.toggleWindowCheck(); } function test__FixedYieldVault__ShouldCheckForWhiteListedAddresses() public { @@ -220,11 +220,11 @@ contract CredbullFixedYieldVaultTest is Test { vault.DEFAULT_ADMIN_ROLE() ) ); - vault.toggleMaxCapCheck(false); + vault.toggleMaxCapCheck(); vm.stopPrank(); vm.prank(params.roles.owner); - vault.toggleMaxCapCheck(false); + vault.toggleMaxCapCheck(); } function test__FixedYieldVault__RevertUdpateMaxCapIfNotAdmin() public { @@ -245,7 +245,7 @@ contract CredbullFixedYieldVaultTest is Test { function test__FixedYieldVault__RevertOpsIfVaultIsPaused() public { vm.startPrank(params.roles.owner); - vault.toggleWindowCheck(false); + vault.toggleWindowCheck(); vault.pauseVault(); vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); vault.deposit(1000 * precision, alice); @@ -258,7 +258,7 @@ contract CredbullFixedYieldVaultTest is Test { function test__FixedYieldVault__ShouldAllowAdminToUnpauseVault() public { vm.startPrank(params.roles.owner); - vault.toggleWindowCheck(false); + vault.toggleWindowCheck(); vault.pauseVault(); vm.expectRevert(abi.encodeWithSelector(Pausable.EnforcedPause.selector)); vault.deposit(1000 * precision, alice); diff --git a/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol b/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol index e75feca30..bfa928e1b 100644 --- a/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol +++ b/packages/contracts/test/src/plugin/WhiteListPluginTest.t.sol @@ -119,7 +119,7 @@ contract WhiteListPluginTest is Test { vault.WHITELIST_PROVIDER().updateStatus(whiteListAddresses, statuses); vm.stopPrank(); - vault.toggleWhiteListCheck(false); + vault.toggleWhiteListCheck(); deposit(alice, 10 * precision); assertEq(vault.balanceOf(alice), 10 * precision); @@ -127,7 +127,7 @@ contract WhiteListPluginTest is Test { function test__WhiteListVault__ShouldToggleWhiteList() public { bool beforeToggle = vault.checkWhiteList(); - vault.toggleWhiteListCheck(!beforeToggle); + vault.toggleWhiteListCheck(); bool afterToggle = vault.checkWhiteList(); assertEq(afterToggle, !beforeToggle); } diff --git a/packages/contracts/test/src/plugin/WindowPluginTest.t.sol b/packages/contracts/test/src/plugin/WindowPluginTest.t.sol index 0d920f383..91f478eff 100644 --- a/packages/contracts/test/src/plugin/WindowPluginTest.t.sol +++ b/packages/contracts/test/src/plugin/WindowPluginTest.t.sol @@ -143,7 +143,7 @@ contract WindowPluginTest is Test { } function test__WindowVault__ShouldNotRevertOnWindowModifier() public { - vault.toggleWindowCheck(false); + vault.toggleWindowCheck(); deposit(alice, 10 * precision); assertEq(vault.balanceOf(alice), 10 * precision); @@ -151,7 +151,7 @@ contract WindowPluginTest is Test { function test__WindowVault__ShouldToggleWhiteList() public { bool beforeToggle = vault.checkWindow(); - vault.toggleWindowCheck(!beforeToggle); + vault.toggleWindowCheck(); bool afterToggle = vault.checkWindow(); assertEq(afterToggle, !beforeToggle); } diff --git a/packages/contracts/test/src/vault/MaturityVaultTest.t.sol b/packages/contracts/test/src/vault/MaturityVaultTest.t.sol index e04eac717..affc2f88c 100644 --- a/packages/contracts/test/src/vault/MaturityVaultTest.t.sol +++ b/packages/contracts/test/src/vault/MaturityVaultTest.t.sol @@ -115,7 +115,7 @@ contract MaturityVaultTest is Test { vm.startPrank(alice); vault.approve(address(vault), shares); - vault.toogleMaturityCheck(false); + vault.toogleMaturityCheck(); vault.redeem(shares, alice, alice); assertEq(params.vault.asset.balanceOf(alice), INITIAL_BALANCE * precision); @@ -124,7 +124,7 @@ contract MaturityVaultTest is Test { function test__MaturityVault__ShouldToggleMaturityCheck() public { bool beforeToggle = vault.checkMaturity(); - vault.toogleMaturityCheck(!beforeToggle); + vault.toogleMaturityCheck(); bool afterToggle = vault.checkMaturity(); assertEq(afterToggle, !beforeToggle); } diff --git a/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol b/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol index a680a0b68..2bc304233 100644 --- a/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol @@ -17,7 +17,7 @@ contract SimpleMaturityVault is MaturityVault { _; } - function toogleMaturityCheck(bool status) public { - _toggleMaturityCheck(status); + function toogleMaturityCheck() public { + _toggleMaturityCheck(); } } diff --git a/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol b/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol index e53f9e5b0..a93b45833 100644 --- a/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol @@ -20,8 +20,8 @@ contract SimpleMaxCapVault is Vault, MaxCapPlugin { _; } - function toggleMaxCapCheck(bool status) public { - _toggleMaxCapCheck(status); + function toggleMaxCapCheck() public { + _toggleMaxCapCheck(); } function updateMaxCap(uint256 _value) public { diff --git a/packages/contracts/test/test/vault/SimpleWhiteListVault.t.sol b/packages/contracts/test/test/vault/SimpleWhiteListVault.t.sol index 0252da92f..1f42f5491 100644 --- a/packages/contracts/test/test/vault/SimpleWhiteListVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleWhiteListVault.t.sol @@ -20,7 +20,7 @@ contract SimpleWhiteListVault is Vault, WhiteListPlugin { _; } - function toggleWhiteListCheck(bool status) public { - _toggleWhiteListCheck(status); + function toggleWhiteListCheck() public { + _toggleWhiteListCheck(); } } diff --git a/packages/contracts/test/test/vault/SimpleWindowVault.t.sol b/packages/contracts/test/test/vault/SimpleWindowVault.t.sol index b97c1d8eb..2f256eac9 100644 --- a/packages/contracts/test/test/vault/SimpleWindowVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleWindowVault.t.sol @@ -33,7 +33,7 @@ contract SimpleWindowVault is Vault, WindowPlugin { _updateWindow(_depositOpen, _depositClose, _withdrawOpen, _withdrawClose); } - function toggleWindowCheck(bool status) public { - _toggleWindowCheck(status); + function toggleWindowCheck() public { + _toggleWindowCheck(); } } From be52215ef45ebff8fe28b4ec1d53dcccddfc2b84 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Fri, 2 Aug 2024 16:32:02 +0530 Subject: [PATCH 35/43] rename collateral to upside --- packages/contracts/src/vault/UpsideVault.sol | 23 +++++++++---------- ...redbullFixedYieldVaultWithUpsideTest.t.sol | 6 ++--- .../test/test/vault/utils/ParamsFactory.t.sol | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/contracts/src/vault/UpsideVault.sol b/packages/contracts/src/vault/UpsideVault.sol index d7c722f1d..7e3b35081 100644 --- a/packages/contracts/src/vault/UpsideVault.sol +++ b/packages/contracts/src/vault/UpsideVault.sol @@ -13,12 +13,12 @@ contract UpsideVault is FixedYieldVault { error CredbullVault__InsufficientShareBalance(); /// @notice Error to indicate that the provided collateral percentage is invalid. - error CredbullVault__InvalidCollateralPercentage(); + error CredbullVault__InvalidUpsidePercentage(); struct UpsideVaultParams { FixedYieldVaultParams fixedYieldVault; IERC20 cblToken; - uint256 collateralPercentage; + uint256 upsidePercentage; } /// @notice address of the Credbull token CBL @@ -27,9 +27,9 @@ contract UpsideVault is FixedYieldVault { uint256 public twap = 100_00; /// @notice Percentage of collateral (100_00) is 100% - uint256 public collateralPercentage; + uint256 public upsidePercentage; - mapping(address account => uint256) private _collateralBalance; + mapping(address account => uint256) private _upsideBalance; /// @notice Total collateral deposited // uint256 public totalCollateralDeposited; @@ -44,10 +44,10 @@ contract UpsideVault is FixedYieldVault { uint256 private additionalPrecision; constructor(UpsideVaultParams memory params) FixedYieldVault(params.fixedYieldVault) { - if (params.collateralPercentage > MAX_PERCENTAGE) { - revert CredbullVault__InvalidCollateralPercentage(); + if (params.upsidePercentage > MAX_PERCENTAGE) { + revert CredbullVault__InvalidUpsidePercentage(); } - collateralPercentage = params.collateralPercentage; + upsidePercentage = params.upsidePercentage; token = params.cblToken; uint8 assetDecimal = _checkValidDecimalValue(address(params.fixedYieldVault.maturityVault.vault.asset)); @@ -74,7 +74,7 @@ contract UpsideVault is FixedYieldVault { uint256 collateral = getCollateralAmount(assets); - _collateralBalance[receiver] += collateral; + _upsideBalance[receiver] += collateral; totalAssetDeposited += assets; if (totalAssetDeposited > maxCap) { @@ -102,7 +102,7 @@ contract UpsideVault is FixedYieldVault { uint256 collateral = calculateTokenRedemption(shares, owner); - _collateralBalance[owner] -= collateral; + _upsideBalance[owner] -= collateral; totalAssetDeposited -= assets; SafeERC20.safeTransfer(token, receiver, collateral); @@ -115,8 +115,7 @@ contract UpsideVault is FixedYieldVault { /// @notice - Get the collateral amount to deposit for the given asset function getCollateralAmount(uint256 assets) public view virtual returns (uint256) { - return - ((assets * additionalPrecision).mulDiv(collateralPercentage, MAX_PERCENTAGE)).mulDiv(MAX_PERCENTAGE, twap); + return ((assets * additionalPrecision).mulDiv(upsidePercentage, MAX_PERCENTAGE)).mulDiv(MAX_PERCENTAGE, twap); } /// @notice - Get the collateral amount to redeem for the given shares @@ -126,7 +125,7 @@ contract UpsideVault is FixedYieldVault { } uint256 sharePercent = shares.mulDiv(PRECISION, balanceOf(account)); - return _collateralBalance[account].mulDiv(sharePercent, PRECISION); + return _upsideBalance[account].mulDiv(sharePercent, PRECISION); } /// @notice - Update the twap value diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol index 1b1b54765..2e013d674 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultWithUpsideTest.t.sol @@ -71,10 +71,10 @@ contract CredbullFixedYieldVaultWithUpsideTest is Test { SimpleToken(address(cblToken)).mint(alice, 200 ether); } - function test__UpsideVault__ShouldRevertOnInvalidCollateralPercentage() public { + function test__UpsideVault__ShouldRevertOnInvalidUpsidePercentage() public { CredbullFixedYieldVaultWithUpside.UpsideVaultParams memory params = upsideVaultParams; - params.collateralPercentage = 100_01; - vm.expectRevert(abi.encodeWithSelector(UpsideVault.CredbullVault__InvalidCollateralPercentage.selector)); + params.upsidePercentage = 100_01; + vm.expectRevert(abi.encodeWithSelector(UpsideVault.CredbullVault__InvalidUpsidePercentage.selector)); new CredbullFixedYieldVaultWithUpside(params); } diff --git a/packages/contracts/test/test/vault/utils/ParamsFactory.t.sol b/packages/contracts/test/test/vault/utils/ParamsFactory.t.sol index 3f99f4c20..fdc04bc61 100644 --- a/packages/contracts/test/test/vault/utils/ParamsFactory.t.sol +++ b/packages/contracts/test/test/vault/utils/ParamsFactory.t.sol @@ -40,7 +40,7 @@ contract ParamsFactory is Test { params = UpsideVault.UpsideVaultParams({ fixedYieldVault: createFixedYieldVaultParams(), cblToken: networkConfig.cblToken, - collateralPercentage: 20_00 + upsidePercentage: 20_00 }); } From cebf163b172e19ebf42d9fdaf22153ca50ffc6d1 Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 6 Aug 2024 16:27:26 +0530 Subject: [PATCH 36/43] pr comment fix --- packages/contracts/src/factory/VaultFactory.sol | 9 +++++++++ packages/contracts/src/plugin/MaxCapPlugin.sol | 4 ++-- packages/contracts/src/vault/FixedYieldVault.sol | 8 ++++---- packages/contracts/src/vault/MaturityVault.sol | 9 +++++++-- .../test/src/CredbullFixedYieldVaultFactoryTest.t.sol | 4 ++++ .../test/src/CredbullFixedYieldVaultTest.t.sol | 10 ++++++---- .../contracts/test/src/vault/MaturityVaultTest.t.sol | 6 +++--- .../test/test/vault/SimpleMaturityVault.t.sol | 4 ++-- .../contracts/test/test/vault/SimpleMaxCapVault.t.sol | 4 ++-- 9 files changed, 39 insertions(+), 19 deletions(-) diff --git a/packages/contracts/src/factory/VaultFactory.sol b/packages/contracts/src/factory/VaultFactory.sol index 77a337e37..c4a77785b 100644 --- a/packages/contracts/src/factory/VaultFactory.sol +++ b/packages/contracts/src/factory/VaultFactory.sol @@ -23,6 +23,12 @@ abstract contract VaultFactory is AccessControl { /// @notice Error to indicate that the provided custodian address is invalid. error CredbullVaultFactory__InvalidCustodianAddress(); + /// @notice Event to emit when a new custodian is allowed + event CustodianAllowed(address indexed custodian); + + /// @notice Event to emit when a custodian is removed + event CustodianRemoved(address indexed custodian); + /// @notice Address set that contains list of all vault address EnumerableSet.AddressSet internal allVaults; @@ -77,6 +83,8 @@ abstract contract VaultFactory is AccessControl { if (_custodian == address(0)) { revert CredbullVaultFactory__InvalidCustodianAddress(); } + + emit CustodianAllowed(_custodian); return allowedCustodians.add(_custodian); } @@ -84,6 +92,7 @@ abstract contract VaultFactory is AccessControl { function removeCustodian(address _custodian) public onlyRole(DEFAULT_ADMIN_ROLE) { if (allowedCustodians.contains(_custodian)) { allowedCustodians.remove(_custodian); + emit CustodianRemoved(_custodian); } } diff --git a/packages/contracts/src/plugin/MaxCapPlugin.sol b/packages/contracts/src/plugin/MaxCapPlugin.sol index 854666b5f..0b36b0b19 100644 --- a/packages/contracts/src/plugin/MaxCapPlugin.sol +++ b/packages/contracts/src/plugin/MaxCapPlugin.sol @@ -39,8 +39,8 @@ abstract contract MaxCapPlugin { } /// @notice - Toggle the max cap check status - function _toggleMaxCapCheck() internal virtual { - checkMaxCap = !checkMaxCap; + function _setCheckMaxCap(bool _checkMaxCapStatus) internal virtual { + checkMaxCap = _checkMaxCapStatus; emit MaxCapCheckUpdated(checkMaxCap); } diff --git a/packages/contracts/src/vault/FixedYieldVault.sol b/packages/contracts/src/vault/FixedYieldVault.sol index 8f0cc5101..d2c7d735c 100644 --- a/packages/contracts/src/vault/FixedYieldVault.sol +++ b/packages/contracts/src/vault/FixedYieldVault.sol @@ -93,8 +93,8 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap } /// @notice Toggle check for maturity - function toggleMaturityCheck() public onlyRole(DEFAULT_ADMIN_ROLE) { - _toggleMaturityCheck(); + function setMaturityCheck(bool _setMaturityCheckStatus) public onlyRole(DEFAULT_ADMIN_ROLE) { + _setMaturityCheck(_setMaturityCheckStatus); } /// @notice Toggle check for whiteList @@ -108,8 +108,8 @@ contract FixedYieldVault is MaturityVault, WhiteListPlugin, WindowPlugin, MaxCap } /// @notice Toggle check for max cap - function toggleMaxCapCheck() public onlyRole(DEFAULT_ADMIN_ROLE) { - _toggleMaxCapCheck(); + function setCheckMaxCap(bool _checkMaxCapStatus) public onlyRole(DEFAULT_ADMIN_ROLE) { + _setCheckMaxCap(_checkMaxCapStatus); } /// @notice Update max cap value diff --git a/packages/contracts/src/vault/MaturityVault.sol b/packages/contracts/src/vault/MaturityVault.sol index 04f25c949..f99881954 100644 --- a/packages/contracts/src/vault/MaturityVault.sol +++ b/packages/contracts/src/vault/MaturityVault.sol @@ -26,6 +26,9 @@ abstract contract MaturityVault is Vault { /// @notice Event emitted when the vault matures. event VaultMatured(uint256 indexed totalAssetDeposited); + /// @notice Event emitted when the maturity check is updated. + event MaturityCheckUpdated(bool indexed checkMaturity); + /// @notice Determine if the vault is matured or not. bool public isMatured; @@ -79,7 +82,9 @@ abstract contract MaturityVault is Vault { * @notice Enables/disables the Maturity Check according to the [status] value. * @dev 'Toggling' means flipping the existing state. This is simply a mutator. */ - function _toggleMaturityCheck() internal { - checkMaturity = !checkMaturity; + function _setMaturityCheck(bool _setMaturityCheckStatus) internal { + checkMaturity = _setMaturityCheckStatus; + + emit MaturityCheckUpdated(checkMaturity); } } diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol index 5fb810571..0e904fba0 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol @@ -124,6 +124,8 @@ contract CredbullFixedYieldVaultFactoryTest is Test { function test__ShouldAllowAdminToAddCustodians() public { vm.prank(config.factoryParams.owner); + vm.expectEmit(); + emit VaultFactory.CustodianAllowed(params.maturityVault.vault.custodian); factory.allowCustodian(params.maturityVault.vault.custodian); assertTrue(factory.isCustodianAllowed(params.maturityVault.vault.custodian)); @@ -134,6 +136,8 @@ contract CredbullFixedYieldVaultFactoryTest is Test { factory.allowCustodian(params.maturityVault.vault.custodian); assertTrue(factory.isCustodianAllowed(params.maturityVault.vault.custodian)); + vm.expectEmit(); + emit VaultFactory.CustodianRemoved(params.maturityVault.vault.custodian); factory.removeCustodian(params.maturityVault.vault.custodian); assertTrue(!factory.isCustodianAllowed(params.maturityVault.vault.custodian)); vm.stopPrank(); diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol index d4bf7e3b3..7d64bec86 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultTest.t.sol @@ -125,6 +125,7 @@ contract CredbullFixedYieldVaultTest is Test { } function test__FixedYieldVault__RevertMaturityToggleIfNotAdmin() public { + bool previousMaturityStatus = vault.checkMaturity(); vm.startPrank(params.roles.operator); vm.expectRevert( abi.encodeWithSelector( @@ -133,11 +134,11 @@ contract CredbullFixedYieldVaultTest is Test { vault.DEFAULT_ADMIN_ROLE() ) ); - vault.toggleMaturityCheck(); + vault.setMaturityCheck(!previousMaturityStatus); vm.stopPrank(); vm.prank(params.roles.owner); - vault.toggleMaturityCheck(); + vault.setMaturityCheck(!previousMaturityStatus); } function test__FixedYieldVault__RevertWhiteListToggleIfNotAdmin() public { @@ -212,6 +213,7 @@ contract CredbullFixedYieldVaultTest is Test { } function test__FixedYieldVault__RevertMaxCapToggleIfNotAdmin() public { + bool previousStatus = vault.checkMaxCap(); vm.startPrank(params.roles.operator); vm.expectRevert( abi.encodeWithSelector( @@ -220,11 +222,11 @@ contract CredbullFixedYieldVaultTest is Test { vault.DEFAULT_ADMIN_ROLE() ) ); - vault.toggleMaxCapCheck(); + vault.setCheckMaxCap(!previousStatus); vm.stopPrank(); vm.prank(params.roles.owner); - vault.toggleMaxCapCheck(); + vault.setCheckMaxCap(!previousStatus); } function test__FixedYieldVault__RevertUdpateMaxCapIfNotAdmin() public { diff --git a/packages/contracts/test/src/vault/MaturityVaultTest.t.sol b/packages/contracts/test/src/vault/MaturityVaultTest.t.sol index affc2f88c..3edf3ff60 100644 --- a/packages/contracts/test/src/vault/MaturityVaultTest.t.sol +++ b/packages/contracts/test/src/vault/MaturityVaultTest.t.sol @@ -115,16 +115,16 @@ contract MaturityVaultTest is Test { vm.startPrank(alice); vault.approve(address(vault), shares); - vault.toogleMaturityCheck(); + vault.setMaturityCheck(!vault.checkMaturity()); vault.redeem(shares, alice, alice); assertEq(params.vault.asset.balanceOf(alice), INITIAL_BALANCE * precision); vm.stopPrank(); } - function test__MaturityVault__ShouldToggleMaturityCheck() public { + function test__MaturityVault__ShouldSetMaturityCheck() public { bool beforeToggle = vault.checkMaturity(); - vault.toogleMaturityCheck(); + vault.setMaturityCheck(!beforeToggle); bool afterToggle = vault.checkMaturity(); assertEq(afterToggle, !beforeToggle); } diff --git a/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol b/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol index 2bc304233..cba7a133b 100644 --- a/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleMaturityVault.t.sol @@ -17,7 +17,7 @@ contract SimpleMaturityVault is MaturityVault { _; } - function toogleMaturityCheck() public { - _toggleMaturityCheck(); + function setMaturityCheck(bool _setMaturityCheckStatus) public { + _setMaturityCheck(_setMaturityCheckStatus); } } diff --git a/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol b/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol index a93b45833..c66ef8450 100644 --- a/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleMaxCapVault.t.sol @@ -20,8 +20,8 @@ contract SimpleMaxCapVault is Vault, MaxCapPlugin { _; } - function toggleMaxCapCheck() public { - _toggleMaxCapCheck(); + function setCheckMaxCap(bool _checkMaxCapStatus) public { + _setCheckMaxCap(_checkMaxCapStatus); } function updateMaxCap(uint256 _value) public { From da7574fdb9270d9d6f27dcd12230b87f70af885d Mon Sep 17 00:00:00 2001 From: Krishna kumar S Date: Tue, 13 Aug 2024 12:12:36 +0530 Subject: [PATCH 37/43] fix: F-2024-4414, on vault factory --- packages/contracts/src/factory/VaultFactory.sol | 3 +++ .../test/src/CredbullFixedYieldVaultFactoryTest.t.sol | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/contracts/src/factory/VaultFactory.sol b/packages/contracts/src/factory/VaultFactory.sol index c4a77785b..6384db69d 100644 --- a/packages/contracts/src/factory/VaultFactory.sol +++ b/packages/contracts/src/factory/VaultFactory.sol @@ -57,6 +57,9 @@ abstract contract VaultFactory is AccessControl { // set the allowed custodians directly in the constructor, without access restriction bool[] memory result = new bool[](custodians.length); for (uint256 i = 0; i < custodians.length; i++) { + if (custodians[i] == address(0)) { + revert CredbullVaultFactory__InvalidCustodianAddress(); + } result[i] = allowedCustodians.add(custodians[i]); } } diff --git a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol index 0e904fba0..ad63ed8a6 100644 --- a/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol +++ b/packages/contracts/test/src/CredbullFixedYieldVaultFactoryTest.t.sol @@ -42,6 +42,9 @@ contract CredbullFixedYieldVaultFactoryTest is Test { vm.expectRevert(VaultFactory.CredbullVaultFactory__InvalidOperatorAddress.selector); new CredbullFixedYieldVaultFactory(config.factoryParams.owner, address(0), new address[](0)); + + vm.expectRevert(VaultFactory.CredbullVaultFactory__InvalidCustodianAddress.selector); + new CredbullFixedYieldVaultFactory(config.factoryParams.owner, config.factoryParams.operator, new address[](1)); } function test__ShouldSuccefullyCreateFactoryFixedYield() public { From ec483702c62ab1e6bf5e20cdf898b2644abf917f Mon Sep 17 00:00:00 2001 From: Ian Lucas Date: Wed, 7 Aug 2024 10:56:53 -0400 Subject: [PATCH 38/43] Update CBL Readme to add locking to receive Governance Token () --- packages/contracts/CBL_README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/contracts/CBL_README.md b/packages/contracts/CBL_README.md index 5bf243982..0caacda6c 100644 --- a/packages/contracts/CBL_README.md +++ b/packages/contracts/CBL_README.md @@ -112,3 +112,9 @@ error CBL__InvalidOwnerAddress(); error CBL__InvalidMinterAddress(); ``` +## Roadmap - Future Features + +### Governance & Governance Token ($gCBL) Contract + +Governance will be implemented in a separate Governance Token ($gCBL) smart contract. The $gCBL contract will include functions +related to governance and voting. Users lock $CBL to receive Governance Tokens ($gCBL) in return. \ No newline at end of file From e9f3d43c964f0a645e1c6f68cc5223845173d6ba Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 14 Aug 2024 14:25:15 +0800 Subject: [PATCH 39/43] Alter the code so that Arbiscan does not verify on fuzzy deployed bytecode match. --- packages/contracts/src/CredbullFixedYieldVaultFactory.sol | 7 ++++--- packages/contracts/src/CredbullUpsideVaultFactory.sol | 2 +- packages/contracts/src/CredbullWhiteListProvider.sol | 2 +- packages/contracts/test/test/token/SimpleToken.t.sol | 2 +- packages/contracts/test/test/token/SimpleUSDC.t.sol | 2 +- packages/contracts/test/test/vault/SimpleVault.t.sol | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol index a4fa5fa87..74f62a576 100644 --- a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol +++ b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol @@ -6,7 +6,7 @@ import { CredbullFixedYieldVault } from "./CredbullFixedYieldVault.sol"; import { VaultFactory } from "./factory/VaultFactory.sol"; contract CredbullFixedYieldVaultFactory is VaultFactory { - string private constant HASH = "change the checksum"; + string private constant HASH = "change the checksum again"; /// @notice Event to emit when a new vault is created event VaultDeployed(address indexed vault, CredbullFixedYieldVault.FixedYieldVaultParams params, string options); @@ -21,8 +21,9 @@ contract CredbullFixedYieldVaultFactory is VaultFactory { { } /** - * @notice - Function to create a new vault. Should be called only by the owner - * @param params - The VaultParams + * @notice Function to create a new vault. + * @param params The [VaultParams] that defines the [Vault] to create. + * @param options A [string] of options, emitted in the [VaultDeployed] event. */ function createVault(CredbullFixedYieldVault.FixedYieldVaultParams memory params, string memory options) public diff --git a/packages/contracts/src/CredbullUpsideVaultFactory.sol b/packages/contracts/src/CredbullUpsideVaultFactory.sol index 9e1a902a9..d985ce5b2 100644 --- a/packages/contracts/src/CredbullUpsideVaultFactory.sol +++ b/packages/contracts/src/CredbullUpsideVaultFactory.sol @@ -6,7 +6,7 @@ import { CredbullFixedYieldVaultWithUpside } from "./CredbullFixedYieldVaultWith import { VaultFactory } from "./factory/VaultFactory.sol"; contract CredbullUpsideVaultFactory is VaultFactory { - string private constant HASH = "change the checksum"; + string private constant HASH = "change the checksum again"; /// @notice Event to emit when a new vault is created event VaultDeployed( diff --git a/packages/contracts/src/CredbullWhiteListProvider.sol b/packages/contracts/src/CredbullWhiteListProvider.sol index c508e7be0..7a35b1d7e 100755 --- a/packages/contracts/src/CredbullWhiteListProvider.sol +++ b/packages/contracts/src/CredbullWhiteListProvider.sol @@ -9,7 +9,7 @@ import { WhiteListProvider } from "./provider/whiteList/WhiteListProvider.sol"; * @notice The deployable white list provider contract. */ contract CredbullWhiteListProvider is WhiteListProvider { - string private constant HASH = "change the checksum"; + string private constant HASH = "change the checksum again"; constructor(address _owner) WhiteListProvider(_owner) { } diff --git a/packages/contracts/test/test/token/SimpleToken.t.sol b/packages/contracts/test/test/token/SimpleToken.t.sol index 0d6ffc461..e50c6275e 100755 --- a/packages/contracts/test/test/token/SimpleToken.t.sol +++ b/packages/contracts/test/test/token/SimpleToken.t.sol @@ -8,7 +8,7 @@ import { OwnableToken } from "./OwnableToken.t.sol"; * @dev The Symbol, Name and decimals are hard-coded, so an instance cannot represent anything other than 'SMPL'. */ contract SimpleToken is OwnableToken { - string private constant HASH = "change the checksum"; + string private constant HASH = "change the checksum again"; constructor(uint256 initialSupply) OwnableToken("Simple Token", "SMPL", 18, initialSupply) { } diff --git a/packages/contracts/test/test/token/SimpleUSDC.t.sol b/packages/contracts/test/test/token/SimpleUSDC.t.sol index d70246a70..b2c1e41de 100755 --- a/packages/contracts/test/test/token/SimpleUSDC.t.sol +++ b/packages/contracts/test/test/token/SimpleUSDC.t.sol @@ -8,7 +8,7 @@ import { OwnableToken } from "./OwnableToken.t.sol"; * @dev The Symbol, Name and decimals are hard-coded, so an instance cannot represent anything other than 'sUSDC'. */ contract SimpleUSDC is OwnableToken { - string private constant HASH = "change the checksum"; + string private constant HASH = "change the checksum again"; constructor(uint256 initialSupply) OwnableToken("Simple USDC", "sUSDC", 6, initialSupply) { } diff --git a/packages/contracts/test/test/vault/SimpleVault.t.sol b/packages/contracts/test/test/vault/SimpleVault.t.sol index 39150d539..bae0c1d7a 100644 --- a/packages/contracts/test/test/vault/SimpleVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleVault.t.sol @@ -8,7 +8,7 @@ import { Vault } from "@credbull/vault/Vault.sol"; * @notice A simple [Vault] realisation for testing purposes. */ contract SimpleVault is Vault { - string private constant HASH = "change the checksum"; + string private constant HASH = "change the checksum again"; constructor(Vault.VaultParams memory params) Vault(params) { } From 1f185f27284e03e6018f2dc00ce891a3c42efb6e Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 14 Aug 2024 14:26:56 +0800 Subject: [PATCH 40/43] Removed the options for Arbitrum Sepolia. Removed the separation of deployment and verification of contracts. Removed the shell script that enabled the separation. Directly reference the Verifier URL in the script command. --- packages/contracts/Makefile | 3 +-- packages/contracts/foundry.toml | 4 ---- packages/contracts/script/utils/verifyContracts.sh | 10 ---------- 3 files changed, 1 insertion(+), 16 deletions(-) delete mode 100755 packages/contracts/script/utils/verifyContracts.sh diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 7393caed6..8aa9f83d6 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -12,8 +12,7 @@ deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= deploy-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrum-sepolia EXTRA_FLAGS="--slow" - script/utils/verifyContracts.sh arbitrum-sepolia + $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --verifier-url https://api-sepolia.arbiscan.io/api?" resume-arbitrumSepolia: $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --resume" diff --git a/packages/contracts/foundry.toml b/packages/contracts/foundry.toml index 3324db7ed..e09ed1d6b 100755 --- a/packages/contracts/foundry.toml +++ b/packages/contracts/foundry.toml @@ -16,8 +16,6 @@ base = "https://mainnet.base.org" baseSepolia = "https://sepolia.base.org" arbitrum = "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" arbitrumSepolia = "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" -arbitrum-sepolia = "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" -arbitrum_one_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" optimism = "https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" optimismSepolia = "https://opt-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}" polygon = "https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" @@ -31,7 +29,5 @@ localhost = { key = "", url = "http://127.0.0.1:8545" } base = { key = "${BASE_ETHERSCAN_API_KEY}" } baseSepolia = { key = "${BASE_SEPOLIA_ETHERSCAN_API_KEY}" } arbitrumSepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } -arbitrum-sepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } -arbitrum_one_sepolia = { key = "${ARBITRUM_SEPOLIA_ETHERSCAN_API_KEY}", url = "https://api-sepolia.arbiscan.io/api?", chain = 421614 } bitlayer = { key = "bitlayer", url = "https://rpc.bitlayer.org" } bitlayerTestnet = { key = "bitlayerTestnet", url = "https://testnet-scan.bitlayer.org" } diff --git a/packages/contracts/script/utils/verifyContracts.sh b/packages/contracts/script/utils/verifyContracts.sh deleted file mode 100755 index d742bddfd..000000000 --- a/packages/contracts/script/utils/verifyContracts.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -TX_LOG=$(find broadcast -type f -name "run-latest.json") -CONTRACTS=$(jq -r '.transactions[] | select(.transactionType == "CREATE") | .contractName' ${TX_LOG}) -for CONTRACT in ${CONTRACTS} ; do - ADDRESS=$(jq -r --arg CT ${CONTRACT} '.transactions[] | select(.transactionType == "CREATE" and .contractName == $CT) | .contractAddress' ${TX_LOG}) - SOURCE_FILE=$(find src test script -type f -name "${CONTRACT}*.sol" -not -name "*Test*.sol") - forge verify-contract ${ADDRESS} ${SOURCE_FILE}:${CONTRACT} --rpc-url ${1:?RPC_URL is required} \ - --skip-is-verified-check --watch -done From 9691ef291f1cde49fda6895ce455f61a2b9a0f45 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 14 Aug 2024 15:07:50 +0800 Subject: [PATCH 41/43] Reverted all deployed contract changs. --- packages/contracts/src/CredbullFixedYieldVaultFactory.sol | 6 ------ packages/contracts/src/CredbullUpsideVaultFactory.sol | 6 ------ packages/contracts/src/CredbullWhiteListProvider.sol | 6 ------ packages/contracts/test/test/token/SimpleToken.t.sol | 6 ------ packages/contracts/test/test/token/SimpleUSDC.t.sol | 6 ------ packages/contracts/test/test/vault/SimpleVault.t.sol | 6 ------ 6 files changed, 36 deletions(-) diff --git a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol index 74f62a576..987f9a41a 100644 --- a/packages/contracts/src/CredbullFixedYieldVaultFactory.sol +++ b/packages/contracts/src/CredbullFixedYieldVaultFactory.sol @@ -6,8 +6,6 @@ import { CredbullFixedYieldVault } from "./CredbullFixedYieldVault.sol"; import { VaultFactory } from "./factory/VaultFactory.sol"; contract CredbullFixedYieldVaultFactory is VaultFactory { - string private constant HASH = "change the checksum again"; - /// @notice Event to emit when a new vault is created event VaultDeployed(address indexed vault, CredbullFixedYieldVault.FixedYieldVaultParams params, string options); @@ -40,8 +38,4 @@ contract CredbullFixedYieldVaultFactory is VaultFactory { return address(newVault); } - - function hashed() external pure returns (string memory) { - return HASH; - } } diff --git a/packages/contracts/src/CredbullUpsideVaultFactory.sol b/packages/contracts/src/CredbullUpsideVaultFactory.sol index d985ce5b2..591bfd502 100644 --- a/packages/contracts/src/CredbullUpsideVaultFactory.sol +++ b/packages/contracts/src/CredbullUpsideVaultFactory.sol @@ -6,8 +6,6 @@ import { CredbullFixedYieldVaultWithUpside } from "./CredbullFixedYieldVaultWith import { VaultFactory } from "./factory/VaultFactory.sol"; contract CredbullUpsideVaultFactory is VaultFactory { - string private constant HASH = "change the checksum again"; - /// @notice Event to emit when a new vault is created event VaultDeployed( address indexed vault, CredbullFixedYieldVaultWithUpside.UpsideVaultParams params, string options @@ -41,8 +39,4 @@ contract CredbullUpsideVaultFactory is VaultFactory { return address(newVault); } - - function hashed() external pure returns (string memory) { - return HASH; - } } diff --git a/packages/contracts/src/CredbullWhiteListProvider.sol b/packages/contracts/src/CredbullWhiteListProvider.sol index 7a35b1d7e..7231ae881 100755 --- a/packages/contracts/src/CredbullWhiteListProvider.sol +++ b/packages/contracts/src/CredbullWhiteListProvider.sol @@ -9,11 +9,5 @@ import { WhiteListProvider } from "./provider/whiteList/WhiteListProvider.sol"; * @notice The deployable white list provider contract. */ contract CredbullWhiteListProvider is WhiteListProvider { - string private constant HASH = "change the checksum again"; - constructor(address _owner) WhiteListProvider(_owner) { } - - function hashed() external pure returns (string memory) { - return HASH; - } } diff --git a/packages/contracts/test/test/token/SimpleToken.t.sol b/packages/contracts/test/test/token/SimpleToken.t.sol index e50c6275e..8b30d5030 100755 --- a/packages/contracts/test/test/token/SimpleToken.t.sol +++ b/packages/contracts/test/test/token/SimpleToken.t.sol @@ -8,11 +8,5 @@ import { OwnableToken } from "./OwnableToken.t.sol"; * @dev The Symbol, Name and decimals are hard-coded, so an instance cannot represent anything other than 'SMPL'. */ contract SimpleToken is OwnableToken { - string private constant HASH = "change the checksum again"; - constructor(uint256 initialSupply) OwnableToken("Simple Token", "SMPL", 18, initialSupply) { } - - function hashed() external pure returns (string memory) { - return HASH; - } } diff --git a/packages/contracts/test/test/token/SimpleUSDC.t.sol b/packages/contracts/test/test/token/SimpleUSDC.t.sol index b2c1e41de..168730784 100755 --- a/packages/contracts/test/test/token/SimpleUSDC.t.sol +++ b/packages/contracts/test/test/token/SimpleUSDC.t.sol @@ -8,11 +8,5 @@ import { OwnableToken } from "./OwnableToken.t.sol"; * @dev The Symbol, Name and decimals are hard-coded, so an instance cannot represent anything other than 'sUSDC'. */ contract SimpleUSDC is OwnableToken { - string private constant HASH = "change the checksum again"; - constructor(uint256 initialSupply) OwnableToken("Simple USDC", "sUSDC", 6, initialSupply) { } - - function hashed() external pure returns (string memory) { - return HASH; - } } diff --git a/packages/contracts/test/test/vault/SimpleVault.t.sol b/packages/contracts/test/test/vault/SimpleVault.t.sol index bae0c1d7a..5084cfddb 100644 --- a/packages/contracts/test/test/vault/SimpleVault.t.sol +++ b/packages/contracts/test/test/vault/SimpleVault.t.sol @@ -8,15 +8,9 @@ import { Vault } from "@credbull/vault/Vault.sol"; * @notice A simple [Vault] realisation for testing purposes. */ contract SimpleVault is Vault { - string private constant HASH = "change the checksum again"; - constructor(Vault.VaultParams memory params) Vault(params) { } function withdrawERC20(address[] calldata _tokens, address _to) external { _withdrawERC20(_tokens, _to); } - - function hashed() external pure returns (string memory) { - return HASH; - } } From eb0512decc153d6999c58b0ec82f2f3c7c667937 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 14 Aug 2024 15:08:27 +0800 Subject: [PATCH 42/43] Restored the use of pinned foundry version in CI/Testnet deployment. --- .github/workflows/ci-dev-contracts.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci-dev-contracts.yml b/.github/workflows/ci-dev-contracts.yml index 3d8270e5a..2e2854434 100644 --- a/.github/workflows/ci-dev-contracts.yml +++ b/.github/workflows/ci-dev-contracts.yml @@ -52,8 +52,7 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly - # version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 + version: nightly-f625d0fa7c51e65b4bf1e8f7931cd1c6e2e285e9 # re-run the tests here on purpose to ensure quality. - name: Run tests From dce2a85d1f69710b1156314b13fef4b300b41160 Mon Sep 17 00:00:00 2001 From: Jonathan Lodge Date: Wed, 14 Aug 2024 21:14:43 +0800 Subject: [PATCH 43/43] Remove the `--verifier-url` from the makefile. --- packages/contracts/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts/Makefile b/packages/contracts/Makefile index 8aa9f83d6..df460bbad 100755 --- a/packages/contracts/Makefile +++ b/packages/contracts/Makefile @@ -12,7 +12,7 @@ deploy-local: $(MAKE) deploy RPC_URL=localhost EXTRA_FLAGS= deploy-arbitrumSepolia: - $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --verifier-url https://api-sepolia.arbiscan.io/api?" + $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow" resume-arbitrumSepolia: $(MAKE) deploy RPC_URL=arbitrumSepolia EXTRA_FLAGS="--verify --slow --resume"